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/06/18 18:16:02 UTC

svn commit: r786143 - in /commons/sandbox/runtime/trunk/src/main: java/org/apache/commons/runtime/Memory.java native/shared/memory.c

Author: mturk
Date: Thu Jun 18 16:16:01 2009
New Revision: 786143

URL: http://svn.apache.org/viewvc?rev=786143&view=rev
Log:
Do argument check in Java code.
Also synchronize access to Pointers when doing memory operations

Modified:
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java
    commons/sandbox/runtime/trunk/src/main/native/shared/memory.c

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=786143&r1=786142&r2=786143&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 Thu Jun 18 16:16:01 2009
@@ -13,7 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.commons.runtime;
 
 /**
@@ -95,7 +94,6 @@
         return p;
     }
 
-
     /**
      * Allocates {@code size} bytes and returns a {@link Pointer}
      * to the allocated memory. The memory is not cleared.
@@ -122,6 +120,8 @@
     public static native Pointer calloc(long size)
         throws OutOfMemoryError, IllegalArgumentException;
 
+    public static native void realloc0(Pointer ptr, long size)
+        throws OutOfMemoryError;
     /**
      * Change the size of memory block pointed by {@code ptr}.
      *
@@ -131,9 +131,18 @@
      * @throws OutOfMemoryError if memory cannot be allocated.
      * @throws IllegalArgumentException if the size is less then {@code 1}.
      */
-    public static native void realloc(Pointer ptr, long size)
-        throws OutOfMemoryError, IllegalArgumentException;
+    public static void realloc(Pointer ptr, long size)
+        throws OutOfMemoryError, IllegalArgumentException
+    {
+        if (size < 1L)
+            throw new IllegalArgumentException();
+        synchronized (ptr) {
+            realloc0(ptr, size);
+        }
+    }
 
+    public static native Pointer slice0(Pointer src, long offset, long size)
+        throws IndexOutOfBoundsException;
     /**
      * Creates a new {@link Pointer} object whose content is a shared
      * subsequence of a {@code src} memory address.
@@ -149,10 +158,22 @@
      *          access of data outside allocated memory bounds.
      * @throws NullPointerException if {@code src} is {@code null}.
      */
-    public static native Pointer slice(Pointer src, long offset, long size)
+    public static Pointer slice(Pointer src, long offset, long size)
         throws IndexOutOfBoundsException, IllegalArgumentException,
-               NullPointerException;
+               NullPointerException
+    {
+        if (src == null || src.IsNull())
+            throw new NullPointerException();
+        if (offset < 0L || size < 1L)
+            throw new IllegalArgumentException();
+        synchronized (src) {
+            return slice0(src, offset, size);
+        }
+    }
 
+    public static native Pointer dup0(Pointer src, long offset, long size)
+        throws IndexOutOfBoundsException, OutOfMemoryError,
+               RuntimeException;
     /**
      * Creates a new {@link Pointer} object whose content is a duplicated
      * subsequence of a {@code src} memory address.
@@ -167,11 +188,27 @@
      * @throws IndexOutOfBoundsException if the operation would cause
      *          access of data outside allocated memory bounds.
      * @throws NullPointerException if {@code src} is {@code null}.
+     * @throws RuntimeException if memory is corrupted.
+     * @throws OutOfMemoryError if memory cannot be dipicated.
      */
-    public static native Pointer dup(Pointer src, long offset, long size)
+    public static Pointer dup(Pointer src, long offset, long size)
         throws IndexOutOfBoundsException, IllegalArgumentException,
-               NullPointerException;
+               NullPointerException, RuntimeException, OutOfMemoryError
+    {
+        if (src == null || src.IsNull())
+            throw new NullPointerException();
+        if (offset < 0L || size < 1L)
+            throw new IllegalArgumentException();
+
+        synchronized (src) {
+            return dup0(src, offset, size);
+        }    
+    }
 
+    public static native void copy0(Pointer src, long srcPos, Pointer dst,
+                                    long dstPos, long length)
+        throws IndexOutOfBoundsException, IllegalArgumentException,
+               RuntimeException;
     /**
      * Copy the memory area from {@code src} to {@code dst}.
      * <p>
@@ -193,12 +230,33 @@
      *          access of data outside allocated memory bounds.
      * @throws NullPointerException if {@code src} or {@code dst} is
      *          {@code null}.
+     * @throws RuntimeException if memory is corrupted.
      */
-    public static native void copy(Pointer src, long srcPos, Pointer dst,
-                                   long dstPos, long length)
+    public static void copy(Pointer src, long srcPos, Pointer dst,
+                            long dstPos, long length)
         throws IndexOutOfBoundsException, IllegalArgumentException,
-               NullPointerException;
+               NullPointerException, RuntimeException
+    {
+        if (src == null || src.IsNull())
+            throw new NullPointerException();
+        if (dst == null || dst.IsNull())
+            throw new NullPointerException();
+        if (srcPos < 0L || dstPos < 0L)
+            throw new IllegalArgumentException();
+        if (length < 1L)
+            throw new IllegalArgumentException();
+
+        synchronized (src) {
+            synchronized (dst) {
+                copy0(src, srcPos, dst, dstPos, length);
+            }
+        }        
+    }
 
+    public static native void move0(Pointer src, long srcPos, Pointer dst,
+                                    long dstPos, long length)
+        throws IndexOutOfBoundsException, IllegalArgumentException,
+               RuntimeException;
     /**
      * Copy the memory area from {@code src} to {@code dst}.
      * <p>
@@ -219,12 +277,31 @@
      *          access of data outside allocated memory bounds.
      * @throws NullPointerException if {@code src} or {@code dst} is
      *          {@code null}.
+     * @throws RuntimeException if memory is corrupted.
      */
-    public static native void move(Pointer src, long srcPos, Pointer dst,
-                                   long dstPos, long length)
+    public static void move(Pointer src, long srcPos, Pointer dst,
+                            long dstPos, long length)
         throws IndexOutOfBoundsException, IllegalArgumentException,
-               NullPointerException;
+               NullPointerException, RuntimeException
+    {
+        if (src == null || src.IsNull())
+            throw new NullPointerException();
+        if (dst == null || dst.IsNull())
+            throw new NullPointerException();
+        if (srcPos < 0L || dstPos < 0L)
+            throw new IllegalArgumentException();
+        if (length < 1L)
+            throw new IllegalArgumentException();
+
+        synchronized (src) {
+            synchronized (dst) {
+                move0(src, srcPos, dst, dstPos, length);
+            }
+        }        
+    }
 
+    public static native void clear0(Pointer ptr, long offset, long length)
+        throws IndexOutOfBoundsException, RuntimeException;
     /**
      * Set the {@code ptr} memory area from {@code src} to {@code zero}.
      *
@@ -238,11 +315,24 @@
      * @throws IndexOutOfBoundsException if the operation would cause
      *          access of data outside allocated memory bounds.
      * @throws NullPointerException if {@code ptr} is {@code null}.
+     * @throws RuntimeException if memory is corrupted.
      */
-    public static native void clear(Pointer ptr, long offset, long length)
+    public static void clear(Pointer ptr, long offset, long length)
         throws IndexOutOfBoundsException, IllegalArgumentException,
-               NullPointerException;
+               NullPointerException, RuntimeException
+    {
+        if (ptr == null || ptr.IsNull())
+            throw new NullPointerException();
+        if (offset < 0L || length < 1L)
+            throw new IllegalArgumentException();
+            
+        synchronized (ptr) {
+            clear0(ptr, offset, length);
+        }
+    }
 
+    public static native void set0(Pointer ptr, long offset, long length, int val)
+        throws IndexOutOfBoundsException, RuntimeException;
     /**
      * Set the {@code ptr} memory area from {@code src} to {@code val}.
      *
@@ -257,14 +347,24 @@
      * @throws IndexOutOfBoundsException if the operation would cause
      *          access of data outside allocated memory bounds.
      * @throws NullPointerException if {@code ptr} is {@code null}.
+     * @throws RuntimeException if memory is corrupted.
      */
-    public static native void set(Pointer ptr, long offset, long length, int val)
+    public static void set(Pointer ptr, long offset, long length, int val)
         throws IndexOutOfBoundsException, IllegalArgumentException,
-               NullPointerException;
+               NullPointerException, RuntimeException
+    {
+        if (ptr == null || ptr.IsNull())
+            throw new NullPointerException();
+        if (offset < 0L || length < 1L)
+            throw new IllegalArgumentException();
+            
+        synchronized (ptr) {
+            set0(ptr, offset, length, val);
+        }
+    }
 
     private static native byte[] array0(Pointer ptr, long offset, int length)
-        throws IndexOutOfBoundsException, IllegalArgumentException,
-               NullPointerException;
+        throws IndexOutOfBoundsException, OutOfMemoryError;
     /**
      * Return the {@code ptr} memory area from {@code src} to {@code byte} array.
      *
@@ -279,12 +379,19 @@
      * @throws IndexOutOfBoundsException if the operation would cause
      *          access of data outside allocated memory bounds.
      * @throws NullPointerException if {@code ptr} is {@code null}.
+     * @throws OutOfMemoryError if memory cannot be dipicated.
      */
     public static byte[] array(Pointer ptr, long offset, int length)
         throws IndexOutOfBoundsException, IllegalArgumentException,
-               NullPointerException
+               NullPointerException, OutOfMemoryError
     {
-        return array0(ptr, offset, length);
+        if (ptr == null || ptr.IsNull())
+            throw new NullPointerException();
+        if (offset < 0L || length < 1L)
+            throw new IllegalArgumentException();
+            
+        synchronized (ptr) {
+            return array0(ptr, offset, length);
+        }
     }
-
 }

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=786143&r1=786142&r2=786143&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 16:16:01 2009
@@ -298,9 +298,9 @@
     return ptr;
 }
 
-ACR_JNI_EXPORT_DECLARE(void, Memory, realloc)(ACR_JNISTDARGS,
-                                              jobject src,
-                                              jlong siz)
+ACR_JNI_EXPORT_DECLARE(void, Memory, realloc0)(ACR_JNISTDARGS,
+                                               jobject src,
+                                               jlong siz)
 {
     void   *np;
     size_t  ss = (size_t)siz;
@@ -308,10 +308,6 @@
 
     UNREFERENCED_O;
 
-    if (siz < 1L) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINVAL, 0);
-        return;
-    }
     np = ACR_Realloc(_E, THROW_NMARK, op, ss);
     if (!np) {
         return;
@@ -319,9 +315,9 @@
     ACR_PointerSet(_E, src, np, ss);
 }
 
-ACR_JNI_EXPORT_DECLARE(jobject, Memory, slice)(ACR_JNISTDARGS,
-                                               jobject src, jlong off,
-                                               jlong siz)
+ACR_JNI_EXPORT_DECLARE(jobject, Memory, slice0)(ACR_JNISTDARGS,
+                                                jobject src, jlong off,
+                                                jlong siz)
 {
     size_t  so  = (size_t)off;
     size_t  ss  = (size_t)siz;
@@ -330,14 +326,6 @@
 
     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;
@@ -349,9 +337,9 @@
     return ACR_PointerCreate(_E, sp + so, ss, NULL);
 }
 
-ACR_JNI_EXPORT_DECLARE(jobject, Memory, dup)(ACR_JNISTDARGS,
-                                             jobject src, jlong off,
-                                             jlong siz)
+ACR_JNI_EXPORT_DECLARE(jobject, Memory, dup0)(ACR_JNISTDARGS,
+                                              jobject src, jlong off,
+                                              jlong siz)
 {
     jobject po = NULL;
     size_t  so  = (size_t)off;
@@ -362,14 +350,6 @@
 
     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;
@@ -396,9 +376,9 @@
     return po;
 }
 
-ACR_JNI_EXPORT_DECLARE(void, Memory, copy)(ACR_JNISTDARGS, jobject src,
-                                           jlong soff, jobject dst,
-                                           jlong doff, jlong size)
+ACR_JNI_EXPORT_DECLARE(void, Memory, copy0)(ACR_JNISTDARGS, jobject src,
+                                            jlong soff, jobject dst,
+                                            jlong doff, jlong size)
 {
     size_t  dl;
     size_t  sl;
@@ -407,14 +387,7 @@
     size_t  cs = (size_t)size;
     char    *d = (char *)ACR_PointerGet(_E, dst, &dl);
     char    *s = (char *)ACR_PointerGet(_E, src, &sl);
-    if (!d || !s) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return;
-    }
-    if (doff < 0L || soff < 0L || size < 1L) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINVAL, 0);
-        return;
-    }
+
     if ((dn + cs) > dl) {
         ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
         return;
@@ -432,9 +405,9 @@
     }
 }
 
-ACR_JNI_EXPORT_DECLARE(void, Memory, move)(ACR_JNISTDARGS, jobject src,
-                                           jlong soff, jobject dst,
-                                           jlong doff, jlong size)
+ACR_JNI_EXPORT_DECLARE(void, Memory, move0)(ACR_JNISTDARGS, jobject src,
+                                            jlong soff, jobject dst,
+                                            jlong doff, jlong size)
 {
     size_t  dl;
     size_t  sl;
@@ -444,14 +417,6 @@
     char    *d = (char *)ACR_PointerGet(_E, dst, &dl);
     char    *s = (char *)ACR_PointerGet(_E, src, &sl);
 
-    if (!d || !s) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return;
-    }
-    if (doff < 0L || soff < 0L || size < 1L) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINVAL, 0);
-        return;
-    }
     if ((dn + cs) > dl) {
         ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
         return;
@@ -469,8 +434,8 @@
     }
 }
 
-ACR_JNI_EXPORT_DECLARE(void, Memory, clear)(ACR_JNISTDARGS, jobject dst,
-                                            jlong doff, jlong size)
+ACR_JNI_EXPORT_DECLARE(void, Memory, clear0)(ACR_JNISTDARGS, jobject dst,
+                                             jlong doff, jlong size)
 {
     size_t  dl;
     size_t  dn = (size_t)doff;
@@ -497,8 +462,8 @@
     }
 }
 
-ACR_JNI_EXPORT_DECLARE(void, Memory, set)(ACR_JNISTDARGS, jobject dst,
-                                          jlong doff, jlong size, jint c)
+ACR_JNI_EXPORT_DECLARE(void, Memory, set0)(ACR_JNISTDARGS, jobject dst,
+                                           jlong doff, jlong size, jint c)
 {
     size_t  dl;
     size_t  dn = (size_t)doff;
@@ -534,10 +499,6 @@
     size_t  cs = (size_t)size;
     jbyte   *p = (jbyte *)ACR_PointerGet(_E, ptr, &pl);
 
-    if (!p) {
-        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
-        return NULL;
-    }
     if ((poff + cs) > pl) {
         ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
         return NULL;