You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/04/24 15:03:38 UTC

svn commit: r768294 - in /commons/sandbox/runtime/trunk/src: main/java/org/apache/commons/runtime/ main/native/shared/ test/org/apache/commons/runtime/

Author: mturk
Date: Fri Apr 24 13:03:38 2009
New Revision: 768294

URL: http://svn.apache.org/viewvc?rev=768294&view=rev
Log:
Extend copy and move methods

Modified:
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/DirectByteBuffer.java
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer.java
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer32.java
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer64.java
    commons/sandbox/runtime/trunk/src/main/native/shared/pointer.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/DirectByteBuffer.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/DirectByteBuffer.java?rev=768294&r1=768293&r2=768294&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/DirectByteBuffer.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/DirectByteBuffer.java Fri Apr 24 13:03:38 2009
@@ -191,8 +191,6 @@
      *
      * @param ptr {@link Pointer} taht holds the native memory area.
      * @param sizes Array of lengths for each ByteBuffer.
-     * @param off Start offset of the {@code sizes} array.
-     * @param len The length of the {@code sizes} array to use.
      * @return The ByteBuffer array with allocated memory
      *
      * @throws OutOfMemoryError if memory cannot be allocated from the system.

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=768294&r1=768293&r2=768294&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 Fri Apr 24 13:03:38 2009
@@ -125,7 +125,7 @@
     /**
      * Change the size of memory block pointed by {@code ptr}.
      *
-     * @param prt Pointer which size to change..
+     * @param ptr Pointer which size to change..
      * @param size The new size of the memory block.
      *
      * @throws OutOfMemoryError if memory cannot be allocated.

Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer.java?rev=768294&r1=768293&r2=768294&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer.java Fri Apr 24 13:03:38 2009
@@ -174,16 +174,59 @@
                NullPointerException;
 
     /**
-     * Copy the memory area from {@code this} pointer to {@code dst}.
+     * Copy the memory area from {@code this} pointer to array
+     * pointed by {@code dst}.
+     *
+     * @param srcPos starting position in the source memory.
+     * @param dst destination {@code array}.
+     * @param dstPos starting position in the destination array.
+     * @param length the number of bytes to be copied.
+     *
+     * @throws IllegalArgumentException if the {@code srcPos} or
+     *          {@code dstPos} is {@code negative} or {@code length}
+     *          is {@code zero}.
+     * @throws IndexOutOfBoundsException if the operation would cause
+     *          access of data outside allocated memory bounds.
+     * @throws NullPointerException if {@code this} or {@code dst} is
+     *          {@code null}.
+     */
+    public abstract void copy(long srcPos, byte[] dst,
+                              int dstPos, int length)
+        throws IndexOutOfBoundsException, IllegalArgumentException,
+               NullPointerException;
+
+    /**
+     * Copy the memory area to {@code this} pointer from array
+     * pointed by {@code dst}.
+     *
+     * @param src source {@code array}.
+     * @param dstPos starting position in the source memory.
+     * @param srcPos starting position in the destination array.
+     * @param length the number of bytes to be copied.
+     *
+     * @throws IllegalArgumentException if the {@code srcPos} or
+     *          {@code dstPos} is {@code negative} or {@code length}
+     *          is {@code zero}.
+     * @throws IndexOutOfBoundsException if the operation would cause
+     *          access of data outside allocated memory bounds.
+     * @throws NullPointerException if {@code this} or {@code dst} is
+     *          {@code null}.
+     */
+    public abstract void move(byte[] src, int srcPos, long dstPos,
+                              int length)
+        throws IndexOutOfBoundsException, IllegalArgumentException,
+               NullPointerException;
+
+    /**
+     * Copy the memory area from pointer {@code src} to {@code this} pointer.
      * <p>
      * Method uses the {@code memmove} function to do a copying, meaning
-     * that {@code source} and {@code destination} memory areas may
-     * overlap.
+     * that {@code source} and {@code destination} memory areas can overlap.
      * </p>
      *
+     * @param src source {@code Pointer}.
      * @param srcPos starting position in the source memory.
-     * @param dst destination {@code Pointer}.
-     * @param dstPos starting position in the destination memory.
+     * @param dstPos starting position in our memory area.
      * @param length the number of bytes to be copied.
      *
      * @throws IllegalArgumentException if the {@code srcPos} or
@@ -194,7 +237,7 @@
      * @throws NullPointerException if {@code this} or {@code dst} is
      *          {@code null}.
      */
-    public abstract void move(long srcPos, Pointer dst,
+    public abstract void move(Pointer src, long srcPos,
                               long dstPos, long length)
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException;

Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer32.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer32.java?rev=768294&r1=768293&r2=768294&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer32.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer32.java Fri Apr 24 13:03:38 2009
@@ -89,7 +89,9 @@
     }
 
     private static native void copy0(int src, int dst, long length);
+    private static native void copy1(int addr, byte[] d, int dstPos, int len);
     private static native void move0(int src, int dst, long length);
+    private static native void move1(int addr, byte[] d, int srcPos, int len);
 
     public void copy(long srcPos, Pointer dst,
                      long dstPos, long length)
@@ -99,7 +101,7 @@
         Pointer32 d32 = (Pointer32)dst;
         if (POINTER == 0 || d32.POINTER == 0)
             throw new NullPointerException();
-        else if (srcPos < 0L || dstPos < 0L)
+        else if (srcPos < 0L || dstPos < 0L || length == 0L)
             throw new IllegalArgumentException();
         else if ((int)(srcPos + length) > PLENGTH)
             throw new IndexOutOfBoundsException();
@@ -108,21 +110,53 @@
         copy0(POINTER + (int)srcPos, d32.POINTER + (int)dstPos, length);
     }
 
-    public void move(long srcPos, Pointer dst,
-                     long dstPos, long length)
+    public void copy(long srcPos, byte[] dst,
+                     int dstPos, int length)
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException
     {
-        Pointer32 d32 = (Pointer32)dst;
-        if (POINTER == 0 || d32.POINTER == 0)
+        if (POINTER == 0)
             throw new NullPointerException();
-        else if (srcPos < 0L || dstPos < 0L)
+        else if (srcPos < 0 || dstPos < 0 || length == 0)
             throw new IllegalArgumentException();
         else if ((int)(srcPos + length) > PLENGTH)
             throw new IndexOutOfBoundsException();
-        else if ((int)(dstPos + length) > d32.PLENGTH)
+        else if ((dstPos + length) > dst.length)
+            throw new IndexOutOfBoundsException();
+        copy1(POINTER + (int)srcPos, dst, dstPos, length);
+    }
+
+    public void move(Pointer src, long srcPos,
+                     long dstPos, long length)
+        throws IndexOutOfBoundsException, IllegalArgumentException,
+               NullPointerException
+    {
+        Pointer32 s32 = (Pointer32)src;
+        if (POINTER == 0 || s32.POINTER == 0)
+            throw new NullPointerException();
+        else if (srcPos < 0L || dstPos < 0L || length == 0L)
+            throw new IllegalArgumentException();
+        else if ((int)(dstPos + length) > PLENGTH)
+            throw new IndexOutOfBoundsException();
+        else if ((int)(srcPos + length) > s32.PLENGTH)
+            throw new IndexOutOfBoundsException();
+        move0(s32.POINTER + (int)dstPos, POINTER + (int)srcPos, length);
+    }
+
+    public void move(byte[] src, int srcPos,
+                     long dstPos, int length)
+        throws IndexOutOfBoundsException, IllegalArgumentException,
+               NullPointerException
+    {
+        if (POINTER == 0)
+            throw new NullPointerException();
+        else if (srcPos < 0 || dstPos < 0 || length == 0)
+            throw new IllegalArgumentException();
+        else if ((int)(dstPos + length) > PLENGTH)
+            throw new IndexOutOfBoundsException();
+        else if ((srcPos + length) > src.length)
             throw new IndexOutOfBoundsException();
-        move0(POINTER + (int)srcPos, d32.POINTER + (int)dstPos, length);
+        move1(POINTER + (int)dstPos, src, srcPos, length);
     }
 
     public String toString()

Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer64.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer64.java?rev=768294&r1=768293&r2=768294&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer64.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Pointer64.java Fri Apr 24 13:03:38 2009
@@ -89,7 +89,9 @@
     }
 
     private static native void copy0(long src, long dst, long length);
+    private static native void copy1(long addr, byte[] d, int dstPos, int len);
     private static native void move0(long src, long dst, long length);
+    private static native void move1(long addr, byte[] d, int srcPos, int len);
 
     public void copy(long srcPos, Pointer dst,
                      long dstPos, long length)
@@ -99,7 +101,7 @@
         Pointer64 d64 = (Pointer64)dst;
         if (POINTER == 0L || d64.POINTER == 0L)
             throw new NullPointerException();
-        else if (srcPos < 0L || dstPos < 0L)
+        else if (srcPos < 0L || dstPos < 0L || length == 0L)
             throw new IllegalArgumentException();
         else if (srcPos + length >= PLENGTH)
             throw new IndexOutOfBoundsException();
@@ -108,21 +110,53 @@
         copy0(POINTER + srcPos, d64.POINTER + dstPos, length);
     }
 
-    public void move(long srcPos, Pointer dst,
+    public void copy(long srcPos, byte[] dst,
+                     int dstPos, int length)
+        throws IndexOutOfBoundsException, IllegalArgumentException,
+               NullPointerException
+    {
+        if (POINTER == 0L)
+            throw new NullPointerException();
+        else if (srcPos < 0L || dstPos < 0 || length == 0)
+            throw new IllegalArgumentException();
+        else if ((srcPos + length) > PLENGTH)
+            throw new IndexOutOfBoundsException();
+        else if ((dstPos + length) > dst.length)
+            throw new IndexOutOfBoundsException();
+        copy1(POINTER + srcPos, dst, dstPos, length);
+    }
+
+    public void move(Pointer src, long srcPos,
                      long dstPos, long length)
         throws IndexOutOfBoundsException, IllegalArgumentException,
                NullPointerException
     {
-        Pointer64 d64 = (Pointer64)dst;
-        if (POINTER == 0L || d64.POINTER == 0L)
+        Pointer64 s64 = (Pointer64)src;
+        if (POINTER == 0L || s64.POINTER == 0L)
             throw new NullPointerException();
-        else if (srcPos < 0L || dstPos < 0L)
+        else if (srcPos < 0L || dstPos < 0L || length == 0L)
             throw new IllegalArgumentException();
-        else if (srcPos + length >= PLENGTH)
+        else if (dstPos + length >= PLENGTH)
             throw new IndexOutOfBoundsException();
-        else if (dstPos + length >- d64.PLENGTH)
+        else if (srcPos + length >- s64.PLENGTH)
+            throw new IndexOutOfBoundsException();
+        move0(s64.POINTER + srcPos, POINTER + dstPos, length);
+    }
+
+    public void move(byte[] src, int srcPos,
+                     long dstPos, int length)
+        throws IndexOutOfBoundsException, IllegalArgumentException,
+               NullPointerException
+    {
+        if (POINTER == 0L)
+            throw new NullPointerException();
+        else if (srcPos < 0L || dstPos < 0L || length == 0)
+            throw new IllegalArgumentException();
+        else if ((dstPos + length) > PLENGTH)
+            throw new IndexOutOfBoundsException();
+        else if ((srcPos + length) > src.length)
             throw new IndexOutOfBoundsException();
-        move0(POINTER + srcPos, d64.POINTER + dstPos, length);
+        move1(POINTER + dstPos, src, srcPos, length);
     }
 
     public String toString()

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=768294&r1=768293&r2=768294&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c Fri Apr 24 13:03:38 2009
@@ -200,6 +200,25 @@
     memmove((void *)((acr_ptr_t)d), (const void *)((acr_ptr_t)s), (size_t)l);
 }
 
+ACR_PTR_EXPORT_DECLARE(void, copy1)(ACR_JNISTDARGS, jniptr a, jbyteArray dst,
+                                    jint off, jint len)
+{
+    UNREFERENCED_O;
+
+    (*_E)->SetByteArrayRegion(_E, dst, (jsize)off, (jsize)len,
+                              (jbyte *)((acr_ptr_t)a));
+}
+
+ACR_PTR_EXPORT_DECLARE(void, move1)(ACR_JNISTDARGS, jniptr a, jbyteArray src,
+                                    jint off, jint len)
+{
+    UNREFERENCED_O;
+
+    (*_E)->GetByteArrayRegion(_E, src, (jsize)off, (jsize)len,
+                              (jbyte *)((acr_ptr_t)a));
+}
+
+
 ACR_DECLARE(jobject) ACR_PointerCreate(JNIEnv *_E, void *p, size_t len,
                                        acr_pointer_cleanup_fn_t *cb)
 {

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=768294&r1=768293&r2=768294&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 Fri Apr 24 13:03:38 2009
@@ -229,13 +229,41 @@
         Pointer p = Memory.calloc(1000);
         assertNotNull("Pointer", p);
         Memory.set(p, 0, 1000, 0xFF);
-        p.poke(0, 23);
+        p.poke(1, 23);
 
-        p.move(0, p, 1, 999);
-        assertEquals("Value", 23, p.peek(1));
+        p.move(p, 0, 1, 999);
+        assertEquals("Value", 23, p.peek(0));
 
         p.free();
     }
 
+    public void testCopyToArray()
+    {
+        Pointer p = Memory.calloc(1000);
+        assertNotNull("Pointer", p);
+        Memory.set(p, 0, 1000, 0xFF);
+        p.poke(0, 23);
+        byte [] b = new byte[32];
+
+        p.copy(0, b, 0, b.length);
+        assertEquals("Value", 23, b[0]);
+        assertEquals("Value", (byte)0xFF, b[1]);
+
+    }
+
+    public void testCopyFromArray()
+    {
+        Pointer p = Memory.calloc(1000);
+        assertNotNull("Pointer", p);
+        Memory.set(p, 0, 1000, 0xFF);
+        p.poke(0, 23);
+        byte [] b = new byte[32];
+
+        p.move(b, 0, 1, b.length);
+        assertEquals("Value", 23, p.peek(0));
+        assertEquals("Value", 0, p.peek(1));
+
+    }
+
 }