Author: mturk Date: Thu Jun 18 07:56:31 2009 New Revision: 785943 URL: http://svn.apache.org/viewvc?rev=785943&view=rev Log: Add executable memory allocation native code
Added: commons/sandbox/runtime/trunk/src/main/native/os/unix/execmem.c (with props) commons/sandbox/runtime/trunk/src/main/native/os/win32/execmem.c (with props) Modified: commons/sandbox/runtime/trunk/src/main/native/Makefile.in commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in commons/sandbox/runtime/trunk/src/main/native/configure commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h commons/sandbox/runtime/trunk/src/main/native/include/acr_pointer.h commons/sandbox/runtime/trunk/src/main/native/os/darwin/platform.c commons/sandbox/runtime/trunk/src/main/native/os/hpux/platform.c commons/sandbox/runtime/trunk/src/main/native/os/linux/platform.c commons/sandbox/runtime/trunk/src/main/native/os/solaris/platform.c commons/sandbox/runtime/trunk/src/main/native/os/win32/platform.c commons/sandbox/runtime/trunk/src/main/native/shared/memory.c commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c commons/sandbox/runtime/trunk/src/main/native/test/testcase.c Modified: commons/sandbox/runtime/trunk/src/main/native/Makefile.in URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/Makefile.in?rev=785943&r1=785942&r2=785943&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/Makefile.in (original) +++ commons/sandbox/runtime/trunk/src/main/native/Makefile.in Thu Jun 18 07:56:31 2009 @@ -32,6 +32,7 @@ l...@lib@ o...@obj@ e...@exe@ +...@as@ a...@ar@ arfla...@arflags@ ranl...@ranlib@ @@ -87,6 +88,7 @@ $(SRCDIR)/modules/network/ssl/openssl.$(OBJ) LINUX_OBJS= \ + $(SRCDIR)/os/unix/execmem.$(OBJ) \ $(SRCDIR)/os/unix/file.$(OBJ) \ $(SRCDIR)/os/unix/main.$(OBJ) \ $(SRCDIR)/os/unix/group.$(OBJ) \ @@ -101,6 +103,7 @@ $(SRCDIR)/os/linux/os.$(OBJ) SOLARIS_OBJS= \ + $(SRCDIR)/os/unix/execmem.$(OBJ) \ $(SRCDIR)/os/unix/file.$(OBJ) \ $(SRCDIR)/os/unix/main.$(OBJ) \ $(SRCDIR)/os/unix/group.$(OBJ) \ @@ -114,6 +117,7 @@ $(SRCDIR)/os/solaris/os.$(OBJ) DARWIN_OBJS= \ + $(SRCDIR)/os/unix/execmem.$(OBJ) \ $(SRCDIR)/os/unix/file.$(OBJ) \ $(SRCDIR)/os/unix/main.$(OBJ) \ $(SRCDIR)/os/unix/group.$(OBJ) \ @@ -127,6 +131,7 @@ $(SRCDIR)/os/darwin/os.$(OBJ) HPUX_OBJS= \ + $(SRCDIR)/os/unix/execmem.$(OBJ) \ $(SRCDIR)/os/unix/file.$(OBJ) \ $(SRCDIR)/os/unix/main.$(OBJ) \ $(SRCDIR)/os/unix/group.$(OBJ) \ Modified: commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in?rev=785943&r1=785942&r2=785943&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in (original) +++ commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in Thu Jun 18 07:56:31 2009 @@ -29,7 +29,9 @@ s...@so@ o...@obj@ e...@exe@ +...@as@ a...@ar@ +arfla...@arflags@ ranl...@ranlib@ pref...@prefix@ libd...@libdir@ @@ -80,6 +82,7 @@ $(SRCDIR)/modules/network/ssl/openssl.$(OBJ) WINDOWS_OBJS= \ + $(SRCDIR)/os/win32/execmem.$(OBJ) \ $(SRCDIR)/os/win32/file.$(OBJ) \ $(SRCDIR)/os/win32/main.$(OBJ) \ $(SRCDIR)/os/win32/platform.$(OBJ) \ Modified: commons/sandbox/runtime/trunk/src/main/native/configure URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/configure?rev=785943&r1=785942&r2=785943&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/configure (original) +++ commons/sandbox/runtime/trunk/src/main/native/configure Thu Jun 18 07:56:31 2009 @@ -44,6 +44,7 @@ cc="${CC:=gcc}" cxx="${CXX:=g++}" ar="${AR:=ar}" +as="${AS:=gcc}" arflags="${ARFLAGS:=ru}" ranlib="${RANLIB:=ranlib}" topdir="${TOPDIR:=.}" @@ -70,11 +71,14 @@ has_jni=false has_64_bit=false has_test=false +has_memprotect=true +has_maintainer_mode=false is_unix=true has_openssl=false openssl_inc="" openssl_lib="" +cccinc="stdio" for o do @@ -183,6 +187,8 @@ --with-cxx=CC Use C++ compiler instead default one [g++] Optional features: + --disable-memprotect Disables exception handling code compilation + [disabled] --enable-test Enables test code compilation [disabled] --with-java-home=DIR Path to the Java SDK @@ -338,7 +344,7 @@ ;; windows-cl ) varadds ccflags "-nologo -O2 -Ob2 -Oy- -Zi -D_MD -MD -W3" - varadds cppopts "-DWIN32 -D_WIN32 -D_WINDOWS -D_WINNT -DNDEBUG" + varadds cppopts "-DWIN32 -DWINNT -D_WIN32 -D_WINDOWS -D_WINNT" varadds cppopts "-D_WIN32_WINNT=0x0501 -D_WIN32_IE=0x0600" varadds cxxopts "-TP" varadds ldflags "kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib" @@ -351,6 +357,7 @@ obj="obj" nmake=".msc" cxx="$cc" + cccinc="windows" if [ ".$java_pinc" = . ]; then java_pinc="win32"; fi ;; * ) @@ -367,10 +374,12 @@ windows-cl ) varadds ccflags "-D_X86_=1" varadds shflags "/MACHINE:X86" + as="ml.exe" ;; windows64-cl ) varadds ccflags "-DWIN64 -D_WIN64 -D_AMD64_=1" varadds shflags "/MACHINE:AMD64" + as="ml64.exe" ;; *64-* ) varadds ccflags "-m64" @@ -389,7 +398,14 @@ varadds includes "-I$topdir/include/arch/unix" varadds cppopts "-D_REENTRANT -D_LARGEFILE64_SOURCE" fi - +if $has_maintainer_mode; then + varadds cppopts "-DDEBUG -D_DEBUG" +else + varadds cppopts "-DNDEBUG" +fi +if $has_memprotect; then + varadds cppopts "-DACR_ENABLE_SEH" +fi if $has_test; then varadds cppopts "-DACR_ENABLE_TEST" testobjs='$(TEST_OBJS)' @@ -456,6 +472,7 @@ printf "Checking for %-32s" "<$1.h>" 1>&2 cat > $test.c << EOF #include <stdlib.h> +#include <$cccinc.h> $2 #include <$1.h> int main() {return 0;} @@ -483,6 +500,7 @@ printf "Checking for %-32s" "$1 library" 1>&2 cat > $test.c << EOF #include <stdlib.h> +#include <$cccinc.h> $2 int main() {return 0;} EOF @@ -621,8 +639,8 @@ fi if [ ".$host" = ".windows" ]; then - have_fileextd=`have_include fileextd '#include <windows.h>'` - have_ktmw32=`have_include ktmw32 '#include <windows.h>'` + have_fileextd=`have_include fileextd` + have_ktmw32=`have_include ktmw32` have_aio=0 have_libaio=0 have_windows=1 @@ -689,6 +707,7 @@ #define HAVE_SYS_WAIT_H `have_include sys/wait` #define HAVE_SYS_SYSLIMITS_H `have_include sys/syslimits` #define HAVE_SYS_UIO_H `have_include sys/uio` +#define HAVE_SYS_MMAN_H `have_include sys/mman` #define HAVE_LIMITS_H `have_include limits` #define HAVE_CTYPE_H `have_include ctype` #define HAVE_WCHAR_H `have_include wchar` @@ -727,12 +746,6 @@ EOF if [ ".$host" = ".windows" ]; then - cat > $test.c << EOF -#include <stdio.h> -#include <stdlib.h> -int main() {return 0;} -EOF - printf "Checking for %-32s" "bufferoverflowu.lib" cat > $test.c << EOF #include <stdlib.h> @@ -763,6 +776,7 @@ sed -e "s;=...@cc@;=$cc;g" \ -e "s;=...@cpp@;=$cpp;g" \ -e "s;=...@cxx@;=$cxx;g" \ + -e "s;=...@as@;=$as;g" \ -e "s;=...@so@;=$so;g" \ -e "s;=...@lib@;=$lib;g" \ -e "s;=...@obj@;=$obj;g" \ Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h?rev=785943&r1=785942&r2=785943&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h (original) +++ commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h Thu Jun 18 07:56:31 2009 @@ -64,7 +64,7 @@ ACR_SEH_THROW } acr_seh_e; -#ifdef ACR_WANT_MEMPROTECT +#if defined(ACR_WANT_MEMPROTECT) && defined(ACR_ENABLE_SEH) #ifdef _MSC_VER #define SEH_ERROR GetExceptionCode() static int _seh_error = 0; @@ -124,9 +124,9 @@ #else #define ACR_TRY \ int _seh_error = 0; \ - { \ + { #define ACR_CATCH() \ - } } if (_seh_error) + } if (_seh_error) #endif /* HAVE_MEMPROTECT */ Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_pointer.h URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_pointer.h?rev=785943&r1=785942&r2=785943&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/include/acr_pointer.h (original) +++ commons/sandbox/runtime/trunk/src/main/native/include/acr_pointer.h Thu Jun 18 07:56:31 2009 @@ -36,7 +36,7 @@ * The cleanup function must chech for data validity. * Consecutive invocations will always contain NULL data. */ -typedef int (acr_pointer_cleanup_fn_t)(void *); +typedef int (acr_pointer_cleanup_fn_t)(void *, size_t); /** * Create new Pointer class instance Modified: commons/sandbox/runtime/trunk/src/main/native/os/darwin/platform.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/darwin/platform.c?rev=785943&r1=785942&r2=785943&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/os/darwin/platform.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/os/darwin/platform.c Thu Jun 18 07:56:31 2009 @@ -21,6 +21,7 @@ #include "acr_platform.h" static const char unknown[] = "unknown"; +acr_size_t acr_page_size; ACR_JNI_EXPORT_DECLARE(void, Platform, init0)(ACR_JNISTDARGS, jintArray p) @@ -41,6 +42,8 @@ #endif ia[6] = PATH_MAX; ia[7] = PATH_MAX; + acr_page_size = (acr_size_t)getpagesize(); + ia[8] = (jint)acr_page_size; (*_E)->SetIntArrayRegion(_E, p, 0, 16, &ia[0]); } Modified: commons/sandbox/runtime/trunk/src/main/native/os/hpux/platform.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/hpux/platform.c?rev=785943&r1=785942&r2=785943&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/os/hpux/platform.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/os/hpux/platform.c Thu Jun 18 07:56:31 2009 @@ -21,6 +21,7 @@ #include "acr_platform.h" static const char unknown[] = "unknown"; +acr_size_t acr_page_size; ACR_JNI_EXPORT_DECLARE(void, Platform, init0)(ACR_JNISTDARGS, jintArray p) @@ -41,6 +42,8 @@ #endif ia[6] = PATH_MAX; ia[7] = PATH_MAX; + acr_page_size = (acr_size_t)getpagesize(); + ia[8] = (jint)acr_page_size; (*_E)->SetIntArrayRegion(_E, p, 0, 16, &ia[0]); } Modified: commons/sandbox/runtime/trunk/src/main/native/os/linux/platform.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/linux/platform.c?rev=785943&r1=785942&r2=785943&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/os/linux/platform.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/os/linux/platform.c Thu Jun 18 07:56:31 2009 @@ -21,6 +21,7 @@ #include "acr_platform.h" static const char unknown[] = "unknown"; +acr_size_t acr_page_size; ACR_JNI_EXPORT_DECLARE(void, Platform, init0)(ACR_JNISTDARGS, jintArray p) @@ -41,6 +42,8 @@ #endif ia[6] = PATH_MAX; ia[7] = PATH_MAX; + acr_page_size = (acr_size_t)getpagesize(); + ia[8] = (jint)acr_page_size; (*_E)->SetIntArrayRegion(_E, p, 0, 16, &ia[0]); } Modified: commons/sandbox/runtime/trunk/src/main/native/os/solaris/platform.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/solaris/platform.c?rev=785943&r1=785942&r2=785943&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/os/solaris/platform.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/os/solaris/platform.c Thu Jun 18 07:56:31 2009 @@ -21,6 +21,7 @@ #include "acr_platform.h" static const char unknown[] = "unknown"; +acr_size_t acr_page_size; ACR_JNI_EXPORT_DECLARE(void, Platform, init0)(ACR_JNISTDARGS, jintArray p) @@ -41,6 +42,8 @@ #endif ia[6] = PATH_MAX; ia[7] = PATH_MAX; + acr_page_size = (acr_size_t)getpagesize(); + ia[8] = (jint)acr_page_size; (*_E)->SetIntArrayRegion(_E, p, 0, 16, &ia[0]); } Added: commons/sandbox/runtime/trunk/src/main/native/os/unix/execmem.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/execmem.c?rev=785943&view=auto ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/os/unix/execmem.c (added) +++ commons/sandbox/runtime/trunk/src/main/native/os/unix/execmem.c Thu Jun 18 07:56:31 2009 @@ -0,0 +1,87 @@ +/* Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "acr.h" +#include "acr_private.h" +#include "acr_arch.h" +#include "acr_memory.h" +#include "acr_pointer.h" +#include "acr_error.h" + +#if HAVE_SYS_MMAN_H +#include <sys/mman.h> +#ifndef MAP_ANONYMOUS +#ifdef MAP_ANON +#define MAP_ANONYMOUS MAP_ANON +#endif +#endif +#ifdef MAP_ANONYMOUS +#define ACR_USE_MMAP +#endif +#endif + +extern acr_size_t acr_page_size; +/** + * Posix executable memory functions + * + */ +static int execmem_pointer_cleanup(void *mem, size_t len) +{ + if (mem && len) { +#ifdef ACR_USE_MMAP + munmap(mem, len); +#else + free(mem); +#endif + return 0; + } + else { + return ACR_EISNULL; + } +} + +ACR_JNI_EXPORT_DECLARE(jobject, ExecutableMemory, malloc)(ACR_JNISTDARGS, + jlong siz) +{ + jobject ptr = NULL; + void *mem; + acr_size_t ass = (acr_size_t)ACR_ALIGN(siz, acr_page_size); + + UNREFERENCED_O; + if (siz < 1L) { + ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINVAL, 0); + return NULL; + } +#ifdef ACR_USE_MMAP + mem = mmap(0, ass, PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); +#else + mem = ACR_Malloc(_E, THROW_NMARK, ass); +#endif + if (mem) { + /* Create the Pointer class with default cleanup. + */ + ptr = ACR_PointerCreate(_E, mem, ass, execmem_pointer_cleanup); + if (!ptr) { +#ifdef ACR_USE_MMAP + munmap(mem, ass); +#else + free(mem); +#endif + } + } + return ptr; +} Propchange: commons/sandbox/runtime/trunk/src/main/native/os/unix/execmem.c ------------------------------------------------------------------------------ svn:eol-style = native Added: commons/sandbox/runtime/trunk/src/main/native/os/win32/execmem.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/execmem.c?rev=785943&view=auto ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/os/win32/execmem.c (added) +++ commons/sandbox/runtime/trunk/src/main/native/os/win32/execmem.c Thu Jun 18 07:56:31 2009 @@ -0,0 +1,64 @@ +/* Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "acr.h" +#include "acr_private.h" +#include "acr_arch.h" +#include "acr_memory.h" +#include "acr_pointer.h" +#include "acr_error.h" + +extern acr_size_t acr_page_size; +/** + * Posix executable memory functions + * + */ +static int execmem_pointer_cleanup(void *mem, size_t len) +{ + if (mem && len) { + VirtualFree(mem, 0, MEM_RELEASE); + return 0; + } + else { + return ACR_EISNULL; + } +} + +ACR_JNI_EXPORT_DECLARE(jobject, ExecutableMemory, malloc)(ACR_JNISTDARGS, + jlong siz) +{ + jobject ptr = NULL; + void *mem; + acr_size_t ass = (acr_size_t)ACR_ALIGN(siz, acr_page_size); + + UNREFERENCED_O; + if (siz < 1L) { + ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINVAL, 0); + return NULL; + } + mem = VirtalAlloc(NULL, ass, + MEM_COMMIT | MEM_RESERVE, + PAGE_EXECUTE_READWRITE); + if (mem) { + /* Create the Pointer class with default cleanup. + */ + ptr = ACR_PointerCreate(_E, mem, ass, execmem_pointer_cleanup); + if (!ptr) { + VirtualFree(mem, 0, MEM_RELEASE); + } + } + return ptr; +} Propchange: commons/sandbox/runtime/trunk/src/main/native/os/win32/execmem.c ------------------------------------------------------------------------------ svn:eol-style = native Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/platform.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/platform.c?rev=785943&r1=785942&r2=785943&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/os/win32/platform.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/os/win32/platform.c Thu Jun 18 07:56:31 2009 @@ -25,6 +25,8 @@ extern PSID acr_everyone_sid; extern PSID acr_adminsgr_sid; extern int acr_ioh_init(int); +extern LPSYSTEM_INFO acr_osinf; +acr_size_t acr_page_size; ACR_JNI_EXPORT_DECLARE(void, Platform, init0)(ACR_JNISTDARGS, jintArray p) @@ -54,6 +56,8 @@ #endif ia[6] = 248; ia[7] = 32760; + acr_page_size = (acr_size_t)acr_osinf->dwPageSize; + ia[8] = (jint)acr_page_size; (*_E)->SetIntArrayRegion(_E, p, 0, 8, &ia[0]); Modified: commons/sandbox/runtime/trunk/src/main/native/shared/memory.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/memory.c?rev=785943&r1=785942&r2=785943&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/shared/memory.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/shared/memory.c Thu Jun 18 07:56:31 2009 @@ -237,7 +237,7 @@ } -static int memory_pointer_cleanup(void *mem) +static int memory_pointer_cleanup(void *mem, size_t unused) { if (mem) { free(mem); Modified: commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c?rev=785943&r1=785942&r2=785943&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c Thu Jun 18 07:56:31 2009 @@ -136,15 +136,17 @@ { if (_clazzn.i && J4MID(0000)) { acr_pointer_cleanup_fn_t *cleanup; - void *pointer; + void *pointer; + size_t plength; pointer = GET_IFIELD_V(0000, _O, void *); cleanup = GET_IFIELD_V(0001, _O, acr_pointer_cleanup_fn_t *); + plength = GET_IFIELD_I(0002, _O); if (pointer) { SET_IFIELD_P(0000, _O, NULL); } if (cleanup) { - int rc = (*cleanup)(pointer); + int rc = (*cleanup)(pointer, plength); if (rc) { /* Throw RuntimeException with errno message */ ACR_ThrowException(_E, THROW_FMARK, ACR_EX_ERUNTIME, rc); @@ -160,15 +162,17 @@ { if (_clazzn.i && J4MID(0000)) { acr_pointer_cleanup_fn_t *cleanup; - void *pointer; + void *pointer; + size_t plength; pointer = GET_IFIELD_V(0000, _O, void *); cleanup = GET_IFIELD_V(0001, _O, acr_pointer_cleanup_fn_t *); + plength = GET_IFIELD_I(0002, _O); if (pointer) { SET_IFIELD_P(0000, _O, NULL); } if (cleanup) { - (*cleanup)(pointer); + (*cleanup)(pointer, plength); } } } @@ -225,7 +229,8 @@ { if (_clazzn.i && J4MID(0000) && _O) { acr_pointer_cleanup_fn_t *cleanup; - void *pointer; + void *pointer; + size_t plength; if ((*_E)->MonitorEnter(_E, _O)) { /* Object locking failed */ @@ -233,6 +238,7 @@ } pointer = GET_IFIELD_V(0000, _O, void *); cleanup = GET_IFIELD_V(0001, _O, acr_pointer_cleanup_fn_t *); + plength = GET_IFIELD_I(0002, _O); if (pointer) { SET_IFIELD_P(0000, _O, NULL); } @@ -241,7 +247,7 @@ } (*_E)->MonitorExit(_E, _O); if (cleanup) { - return (*cleanup)(pointer); + return (*cleanup)(pointer, plength); } else { /* Already cleared */ Modified: commons/sandbox/runtime/trunk/src/main/native/test/testcase.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/test/testcase.c?rev=785943&r1=785942&r2=785943&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/test/testcase.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/test/testcase.c Thu Jun 18 07:56:31 2009 @@ -213,9 +213,9 @@ return 0; } -static int callback(void *p) +static int callback(void *p, size_t s) { - fprintf(stderr, "[native] Pointer callback called: %p\n", p); + fprintf(stderr, "[native] Pointer callback called: %p - %d\n", p, s); fflush(stderr); return 0; }