Author: mturk Date: Wed Apr 22 09:05:18 2009 New Revision: 767415 URL: http://svn.apache.org/viewvc?rev=767415&view=rev Log: Add Memory.dup
Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java commons/sandbox/runtime/trunk/src/main/native/shared/memory.c commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestMemory.java Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java?rev=767415&r1=767414&r2=767415&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java (original) +++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java Wed Apr 22 09:05:18 2009 @@ -78,6 +78,25 @@ NullPointerException; /** + * Creates a new {...@link Pointer} object whose content is a duplicated + * subsequence of a {...@code src} memory address. + * + * @param src {...@code Pointer} whose content to use. + * @param offset offset from the {...@code src} memory address. + * @param size size of the destination memory. + * @return new {...@link Pointer}. + * + * @throws IllegalArgumentException if the {...@code offset} is + * {...@code negative} or {...@code size} is {...@code zero}. + * @throws IndexOutOfBoundsException if the operation would cause + * access of data outside allocated memory bounds. + * @throws NullPointerException if {...@code src} is {...@code null}. + */ + public static native Pointer dup(Pointer src, long offset, long size) + throws IndexOutOfBoundsException, IllegalArgumentException, + NullPointerException; + + /** * Copy the memory area from {...@code src} to {...@code dst}. * <p> * Method uses the {...@code memcpy} function to do a copying, meaning 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=767415&r1=767414&r2=767415&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/shared/memory.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/shared/memory.c Wed Apr 22 09:05:18 2009 @@ -276,7 +276,6 @@ jobject src, jlong off, jlong siz) { - jobject ptr = NULL; size_t so = (size_t)off; size_t ss = (size_t)siz; size_t sl; @@ -300,8 +299,42 @@ /* Create the Pointer class without the cleanup. * Original object will clean the entire allocated memory. */ - ptr = ACR_PointerCreate(_E, sp + so, ss, NULL); - return ptr; + return ACR_PointerCreate(_E, sp + so, ss, NULL); +} + +ACR_JNI_EXPORT_DECLARE(jobject, Memory, dup)(ACR_JNISTDARGS, + jobject src, jlong off, + jlong siz) +{ + size_t so = (size_t)off; + size_t ss = (size_t)siz; + size_t sl; + void *dp; + char *sp = (char *)ACR_PointerGet(_E, src, &sl); + + UNREFERENCED_O; + + if (!sp) { + ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0); + return NULL; + } + if (off < 0L || siz < 1L) { + ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINVAL, 0); + return NULL; + } + if ((so + ss) > sl) { + ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0); + return NULL; + } + dp = ACR_Malloc(_E, THROW_NMARK, ACR_ALIGN_DEFAULT(ss)); + if (dp == NULL) { + /* Allocation failed. + */ + return NULL; + } + /* Copy the original content */ + memcpy(dp, sp + so, ss); + return ACR_PointerCreate(_E, dp, ss, ptr_cleanup); } ACR_JNI_EXPORT_DECLARE(void, Memory, copy)(ACR_JNISTDARGS, jobject src, Modified: commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestMemory.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestMemory.java?rev=767415&r1=767414&r2=767415&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestMemory.java (original) +++ commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestMemory.java Wed Apr 22 09:05:18 2009 @@ -95,6 +95,17 @@ dst.free(); } + public void testDup() + throws Throwable + { + Pointer src = Memory.calloc(1000); + assertNotNull("Pointer", src); + Pointer dup = Memory.dup(src, 0, 1000); + assertNotNull("Pointer", dup); + src.free(); + dup.free(); + } + public void testSet() throws Throwable {