Author: mturk
Date: Wed Apr 22 08:55:00 2009
New Revision: 767413

URL: http://svn.apache.org/viewvc?rev=767413&view=rev
Log:
Add Memory class and adapt Pointer so it's usable for it

Added:
    
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java
   (with props)
    
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestMemory.java
   (with props)
Modified:
    
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/java/org/apache/commons/runtime/SystemId.java
    commons/sandbox/runtime/trunk/src/main/native/include/acr.h
    commons/sandbox/runtime/trunk/src/main/native/include/acr_pointer.h
    commons/sandbox/runtime/trunk/src/main/native/include/acr_version.h
    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
    
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestAll.java

Added: 
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=767413&view=auto
==============================================================================
--- 
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java
 (added)
+++ 
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java
 Wed Apr 22 08:55:00 2009
@@ -0,0 +1,170 @@
+/* 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.
+ */
+
+package org.apache.commons.runtime;
+
+/**
+ * Memory class.
+ * <p>
+ * <b>Warning:</b><br/>Using this class improperly may crash the running JVM.
+ * </p>
+ *
+ * @see OS
+ * @since Runtime 1.0
+ */
+public final class Memory {
+
+    private Memory()
+    {
+        // No Instance
+    }
+
+    /**
+     * Allocates {...@code size} bytes and returns a {...@link Pointer}
+     * to the allocated memory. The memory is not cleared.
+     *
+     * @param size Size of the memory to allocate.
+     * @return new {...@link Pointer} containing memory area.
+     *
+     * @throws OutOfMemoryError if memory cannot be allocated.
+     * @throws IllegalArgumentException if the size is less then {...@code 1}.
+     */
+    public static native Pointer malloc(long size)
+        throws OutOfMemoryError, IllegalArgumentException;
+
+    /**
+     * Allocates {...@code size} bytes and returns a {...@link Pointer}
+     * to the allocated memory. The memory is cleared.
+     *
+     * @param size Size of the memory to allocate.
+     * @return new {...@link Pointer} containing memory area.
+     *
+     * @throws OutOfMemoryError if memory cannot be allocated.
+     * @throws IllegalArgumentException if the size is less then {...@code 1}.
+     */
+    public static native Pointer calloc(long size)
+        throws OutOfMemoryError, IllegalArgumentException;
+
+    /**
+     * Creates a new {...@link Pointer} object whose content is a shared
+     * 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 slice(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
+     * that {...@code source} and {...@code destination} memory areas should
+     * not overlap.
+     * </p>
+     *
+     * @param src {...@code Pointer} whose content to use.
+     * @param srcPos starting position in the source memory.
+     * @param dst destination {...@code Pointer}.
+     * @param dstPos starting position in the destination memory.
+     * @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 src} or {...@code dst} is
+     *          {...@code null}.
+     */
+    public static native void copy(Pointer src, long srcPos, Pointer dst,
+                                   long dstPos, long length)
+        throws IndexOutOfBoundsException, IllegalArgumentException,
+               NullPointerException;
+
+    /**
+     * Copy the memory area from {...@code src} to {...@code dst}.
+     * <p>
+     * Method uses the {...@code memmove} function to do a copying, meaning
+     * that {...@code src} and {...@code dst} memory areas can overlap.
+     * </p>
+     *
+     * @param src {...@code Pointer} whose content to use.
+     * @param srcPos starting position in the source memory.
+     * @param dst destination {...@code Pointer}.
+     * @param dstPos starting position in the destination memory.
+     * @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 src} or {...@code dst} is
+     *          {...@code null}.
+     */
+    public static native void move(Pointer src, long srcPos, Pointer dst,
+                                   long dstPos, long length)
+        throws IndexOutOfBoundsException, IllegalArgumentException,
+               NullPointerException;
+
+    /**
+     * Set the {...@code ptr} memory area from {...@code src} to {...@code 
zero}.
+     *
+     * @param ptr {...@code Pointer} whose content to use.
+     * @param offset starting position in the memory.
+     * @param length the number of bytes to be clear.
+     *
+     * @throws IllegalArgumentException if the {...@code offset}
+     *          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 ptr} is {...@code null}.
+     */
+    public static native void clear(Pointer ptr, long offset, long length)
+        throws IndexOutOfBoundsException, IllegalArgumentException,
+               NullPointerException;
+
+    /**
+     * Set the {...@code ptr} memory area from {...@code src} to {...@code 
val}.
+     *
+     * @param ptr {...@code Pointer} whose content to use.
+     * @param offset starting position in the memory.
+     * @param length the number of bytes to be set.
+     * @param val value to set.
+     *
+     * @throws IllegalArgumentException if the {...@code offset}
+     *          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 ptr} is {...@code null}.
+     */
+    public static native void set(Pointer ptr, long offset, long length, int 
val)
+        throws IndexOutOfBoundsException, IllegalArgumentException,
+               NullPointerException;
+
+}

Propchange: 
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/Memory.java
------------------------------------------------------------------------------
    svn:eol-style = native

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=767413&r1=767412&r2=767413&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
 Wed Apr 22 08:55:00 2009
@@ -36,22 +36,18 @@
     private native void cleanup0()
         throws Throwable;
 
+    private native void cleanup1();
+
     /**
      * Size in bytes of the storage needed to represent the Pointer.
      */
     public static final int SIZEOF = OS.getDataModel() == 64 ? 8 : 4;
 
-    /** Long value of the internal pointer
+    /** Address of the internal pointer
      * @return Internal pointer address casted to the {...@code long}.
      */
-    public abstract long longValue();
+    public abstract Number address();
 
-    /** Integer value of the internal pointer
-     * @return Internal pointer address casted to the {...@code int}.
-     * @throws ClassCastException if running on the 64-bit JVM.
-     */
-    public abstract int intValue()
-        throws ClassCastException;
 
     /** Chack if the pointer is valid
      * @return true if the internal pointer is not {...@code NULL}.
@@ -78,12 +74,7 @@
     protected final void finalize()
         throws Throwable
     {
-        try {
-            cleanup0();
-        } catch (InstantiationException ex) {
-            // Class is alreay uninitialized.
-            // Ignore.
-        }
+        cleanup1();
     }
 
     /**

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=767413&r1=767412&r2=767413&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
 Wed Apr 22 08:55:00 2009
@@ -26,14 +26,16 @@
 
     private int     POINTER;
     private int     CLEANUP;
+    private int     PLENGTH;
 
     /*
      * Only created from JNI code.
      */
-    private Pointer32(int ptr, int clr)
+    private Pointer32(int ptr, int clr, int len)
     {
         POINTER = ptr;
         CLEANUP = clr;
+        PLENGTH = len;
     }
 
     public boolean equals(Object other)
@@ -52,15 +54,9 @@
         return POINTER == 0;
     }
 
-    public long longValue()
+    public Number address()
     {
-        return POINTER;
-    }
-
-    public int intValue()
-        throws ClassCastException
-    {
-        return POINTER;
+        return new Integer(POINTER);
     }
 
     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=767413&r1=767412&r2=767413&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
 Wed Apr 22 08:55:00 2009
@@ -26,14 +26,16 @@
 
     private long    POINTER;
     private long    CLEANUP;
+    private long    PLENGTH;
 
     /*
      * Only created from JNI code.
      */
-    private Pointer64(long ptr, long clr)
+    private Pointer64(long ptr, long clr, long len)
     {
         POINTER = ptr;
         CLEANUP = clr;
+        PLENGTH = len;
     }
 
     public boolean equals(Object other)
@@ -52,15 +54,9 @@
         return POINTER == 0L;
     }
 
-    public long longValue()
+    public Number address()
     {
-        return POINTER;
-    }
-
-    public int intValue()
-        throws ClassCastException
-    {
-        throw new ClassCastException();
+        return new Long(POINTER);
     }
 
     public String toString()

Modified: 
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/SystemId.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/SystemId.java?rev=767413&r1=767412&r2=767413&view=diff
==============================================================================
--- 
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/SystemId.java
 (original)
+++ 
commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/SystemId.java
 Wed Apr 22 08:55:00 2009
@@ -127,7 +127,7 @@
      * <p>
      * Platform Id string is used to name the native libraries inside
      * {...@code META-LIB} jar directory. This resource is then dynamically
-     * extracted to the {...@code java.temp.path} or system temporary
+     * extracted to the {...@code java.io.tmpdir} or system temporary
      * directory and then loaded.
      * </p>
      * <p>

Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr.h
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr.h?rev=767413&r1=767412&r2=767413&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr.h Wed Apr 22 
08:55:00 2009
@@ -39,15 +39,15 @@
  */
 #pragma warning(once: 4057 4075 4244)
 
-#pragma warning(disable: 4053)    // An expression of type VOID was used as an 
operand
-#pragma warning(disable: 4100)    // Unreferenced formal parameter
-#pragma warning(disable: 4115)    // Named type definition in parentheses
-#pragma warning(disable: 4127)    // Conditional expression is a constant
-#pragma warning(disable: 4163)    // '_rotl64' : not available as an intrinsic 
function
-#pragma warning(disable: 4189)    // Local Variable is initialized but not 
referenced
-#pragma warning(disable: 4201)    // Nameless struct/union (MS C/C++ specific)
-#pragma warning(disable: 4514)    // unreferenced inline function removed
-#pragma warning(disable: 4706)    // Assignment within conditional expression
+#pragma warning(disable: 4053)    /* An expression of type VOID was used as an 
operand      */
+#pragma warning(disable: 4100)    /* Unreferenced formal parameter             
             */
+#pragma warning(disable: 4115)    /* Named type definition in parentheses      
             */
+#pragma warning(disable: 4127)    /* Conditional expression is a constant      
             */
+#pragma warning(disable: 4163)    /* '_rotl64' : not available as an intrinsic 
function     */
+#pragma warning(disable: 4189)    /* Local Variable is initialized but not 
referenced       */
+#pragma warning(disable: 4201)    /* Nameless struct/union (MS C/C++ specific) 
             */
+#pragma warning(disable: 4514)    /* unreferenced inline function removed      
             */
+#pragma warning(disable: 4706)    /* Assignment within conditional expression  
             */
 
 /* Ignore Microsoft's interpretation of secure development
  * and the POSIX string handling API
@@ -210,8 +210,13 @@
 typedef  wchar_t            acr_pchar_t;
 #else
 typedef  ssize_t            acr_ssize_t;
+#ifdef _LP64 /* 64-bit Solaris */
+typedef  long               acr_int64_t;
+typedef  unsigned long      acr_uint64_t;
+#else
 typedef  long long          acr_int64_t;
 typedef  unsigned long long acr_uint64_t;
+#endif
 #if CC_SIZEOF_OFF64_T
 typedef  off64_t            acr_off_t;
 #else

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=767413&r1=767412&r2=767413&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 Wed Apr 
22 08:55:00 2009
@@ -42,9 +42,10 @@
  * Create new Pointer class instance
  * @param env Current JNI environment
  * @param p Native pointer to wrap into Pointer class
+ * @param len Length of the pointer.
  * @param cb callback function to use on Pointer.finalize()
  */
-ACR_DECLARE(jobject) ACR_PointerCreate(JNIEnv *env, void *p,
+ACR_DECLARE(jobject) ACR_PointerCreate(JNIEnv *env, void *p, size_t len,
                                        acr_pointer_cleanup_fn_t *cb);
 
 /**
@@ -67,18 +68,21 @@
  * Get the native pointer from the Pointer object.
  * @param env Current JNI environment
  * @param ptr Java Pointer object use.
+ * @param len Pointer to receive the length of the pointer.
  * @return Underlying wrapped pointer.
  */
-ACR_DECLARE(void *) ACR_PointerGet(JNIEnv *env, jobject ptr);
+ACR_DECLARE(void *) ACR_PointerGet(JNIEnv *env, jobject ptr, size_t *len);
 
 /**
  * Set the native pointer to the Pointer object.
  * @param env Current JNI environment
  * @param ptr Java Pointer object use.
  * @param val Value to set.
+ * @param len length of the pointer.
  * @return ACR error code on failure.
  */
-ACR_DECLARE(int) ACR_PointerSet(JNIEnv *env, jobject ptr, void *val);
+ACR_DECLARE(int) ACR_PointerSet(JNIEnv *env, jobject ptr, void *val,
+                                size_t len);
 
 #ifdef __cplusplus
 }

Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_version.h
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_version.h?rev=767413&r1=767412&r2=767413&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_version.h 
(original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_version.h Wed Apr 
22 08:55:00 2009
@@ -94,7 +94,7 @@
 
 /** Return build timestamp
  */
-ACR_DECLARE(const char *) ACR_GetLibraryBuilt();
+ACR_DECLARE(const char *) ACR_GetLibraryBuilt(void);
 
 #ifdef __cplusplus
 }

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=767413&r1=767412&r2=767413&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 
08:55:00 2009
@@ -18,6 +18,7 @@
 #include "acr_private.h"
 #include "acr_memory.h"
 #include "acr_error.h"
+#include "acr_pointer.h"
 #include "acr_vm.h"
 
 struct acr_sbh_t {
@@ -218,3 +219,198 @@
     if (sbh->owns)
        free(sbh);
 }
+
+
+static int ptr_cleanup(void *mem)
+{
+    if (mem) {
+        free(mem);
+        return 0;
+    }
+    else {
+        return ACR_EISNULL;
+    }
+}
+
+ACR_JNI_EXPORT_DECLARE(jobject, Memory, malloc)(ACR_JNISTDARGS, jlong siz)
+{
+    jobject ptr = NULL;
+    void   *mem;
+    acr_size_t ass = (acr_size_t)ACR_ALIGN_DEFAULT(siz);
+
+    UNREFERENCED_O;
+    if (siz < 1L) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINVAL, 0);
+        return NULL;
+    }
+    mem = ACR_Malloc(_E, THROW_NMARK, ass);
+    if (mem) {
+        /* Create the Pointer class with default cleanup.
+         */
+        ptr = ACR_PointerCreate(_E, mem, (size_t)siz, ptr_cleanup);
+    }
+    return ptr;
+}
+
+ACR_JNI_EXPORT_DECLARE(jobject, Memory, calloc)(ACR_JNISTDARGS, jlong siz)
+{
+    jobject ptr = NULL;
+    void   *mem;
+    acr_size_t ass = (acr_size_t)ACR_ALIGN_DEFAULT(siz);
+
+    UNREFERENCED_O;
+    if (siz < 1L) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINVAL, 0);
+        return NULL;
+    }
+    mem = ACR_Calloc(_E, THROW_NMARK, ass);
+    if (mem) {
+        /* Create the Pointer class with default cleanup.
+         */
+        ptr = ACR_PointerCreate(_E, mem, (size_t)siz, ptr_cleanup);
+    }
+    return ptr;
+}
+
+ACR_JNI_EXPORT_DECLARE(jobject, Memory, slice)(ACR_JNISTDARGS,
+                                               jobject src, jlong off,
+                                               jlong siz)
+{
+    jobject ptr = NULL;
+    size_t  so  = (size_t)off;
+    size_t  ss  = (size_t)siz;
+    size_t  sl;
+    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;
+    }
+
+    /* 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;
+}
+
+ACR_JNI_EXPORT_DECLARE(void, Memory, copy)(ACR_JNISTDARGS, jobject src,
+                                           jlong soff, jobject dst,
+                                           jlong doff, jlong size)
+{
+    size_t  dl;
+    size_t  sl;
+    size_t  dn = (size_t)doff;
+    size_t  sn = (size_t)soff;
+    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;
+    }
+    if ((sn + cs) > sl) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
+        return;
+    }
+
+    /* Do a memcpy */
+    memcpy(d + dn, s + sn, cs);
+}
+
+ACR_JNI_EXPORT_DECLARE(void, Memory, move)(ACR_JNISTDARGS, jobject src,
+                                           jlong soff, jobject dst,
+                                           jlong doff, jlong size)
+{
+    size_t  dl;
+    size_t  sl;
+    size_t  dn = (size_t)doff;
+    size_t  sn = (size_t)soff;
+    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;
+    }
+    if ((sn + cs) > sl) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
+        return;
+    }
+
+    /* Do a memmove */
+    memmove(d + dn, s + sn, cs);
+}
+
+ACR_JNI_EXPORT_DECLARE(void, Memory, clear)(ACR_JNISTDARGS, jobject dst,
+                                            jlong doff, jlong size)
+{
+    size_t  dl;
+    size_t  dn = (size_t)doff;
+    size_t  cs = (size_t)size;
+    char    *d = (char *)ACR_PointerGet(_E, dst, &dl);
+    if (!d) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
+        return;
+    }
+    if (doff < 0L || size < 1L) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINVAL, 0);
+        return;
+    }
+    if ((doff + size) > dl) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
+        return;
+    }
+    /* Do a memset */
+    memset(d + dn, 0, cs);
+}
+
+ACR_JNI_EXPORT_DECLARE(void, Memory, set)(ACR_JNISTDARGS, jobject dst,
+                                          jlong doff, jlong size, jint c)
+{
+    size_t  dl;
+    size_t  dn = (size_t)doff;
+    size_t  cs = (size_t)size;
+    char    *d = (char *)ACR_PointerGet(_E, dst, &dl);
+    if (!d) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ENULL, 0);
+        return;
+    }
+    if (doff < 0L || size < 1L) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINVAL, 0);
+        return;
+    }
+    if ((doff + size) > dl) {
+        ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINDEX, 0);
+        return;
+    }
+    /* Do a memset */
+    memset(d + dn, c, cs);
+}
+

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=767413&r1=767412&r2=767413&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/pointer.c Wed Apr 22 
08:55:00 2009
@@ -39,7 +39,7 @@
 J_DECLARE_M_ID(0000) = {
     NULL,
     "<init>",
-    "(JJ)V"
+    "(JJJ)V"
 };
 
 #else
@@ -53,7 +53,7 @@
 J_DECLARE_M_ID(0000) = {
     NULL,
     "<init>",
-    "(II)V"
+    "(III)V"
 };
 
 #endif
@@ -70,6 +70,12 @@
     IFIELD_PTR
 };
 
+J_DECLARE_F_ID(0002) = {
+    NULL,
+    "PLENGTH",
+    IFIELD_PTR
+};
+
 
 ACR_CLASS_LDEF(Pointer)
 {
@@ -79,6 +85,7 @@
         return rv;
     J_LOAD_IFIELD(0000);
     J_LOAD_IFIELD(0001);
+    J_LOAD_IFIELD(0002);
     J_LOAD_METHOD(0000);
 
     return ACR_SUCCESS;
@@ -121,12 +128,29 @@
 
 }
 
-ACR_DECLARE(jobject) ACR_PointerCreate(JNIEnv *_E, void *p,
+ACR_JNI_EXPORT_DECLARE(void, Pointer, cleanup1)(ACR_JNISTDARGS)
+{
+    if (_clazzn.i && J4MID(0000)) {
+        acr_pointer_cleanup_fn_t *cleanup;
+        jniptr h = GET_IFIELD_P(0000, _O);
+        jniptr c = GET_IFIELD_P(0001, _O);
+
+        if (h) {
+            SET_IFIELD_P(0000, _O, 0);
+        }
+        cleanup = (acr_pointer_cleanup_fn_t *)((acr_ptr_t)c);
+        if (cleanup) {
+            (*cleanup)((void *)((acr_ptr_t)h));
+        }
+    }
+}
+
+ACR_DECLARE(jobject) ACR_PointerCreate(JNIEnv *_E, void *p, size_t len,
                                        acr_pointer_cleanup_fn_t *cb)
 {
     if (_clazzn.i && J4MID(0000))
         return (*_E)->NewObject(_E, _clazzn.i, J4MID(0000),
-                                (acr_ptr_t)p, (acr_ptr_t)cb);
+                                (acr_ptr_t)p, (acr_ptr_t)cb, (acr_ptr_t)len);
     else {
         ACR_SET_OS_ERROR(ACR_ECLASSNOTFOUND);
         return NULL;
@@ -135,7 +159,7 @@
 
 ACR_DECLARE(int) ACR_PointerCleanup(ACR_JNISTDARGS)
 {
-    if (_clazzn.i && J4MID(0000)) {
+    if (_clazzn.i && J4MID(0000) && _O) {
         acr_pointer_cleanup_fn_t *cleanup;
         jniptr h = GET_IFIELD_P(0000, _O);
         jniptr c = GET_IFIELD_P(0001, _O);
@@ -164,10 +188,13 @@
         return ACR_ECLASSNOTFOUND;
 }
 
-ACR_DECLARE(void *) ACR_PointerGet(ACR_JNISTDARGS)
+ACR_DECLARE(void *) ACR_PointerGet(ACR_JNISTDARGS, size_t *len)
 {
-    if (_clazzn.i && J4MID(0000)) {
+    if (_clazzn.i && J4MID(0000) && _O) {
         jniptr h = GET_IFIELD_P(0000, _O);
+        if (len) {
+            *len = (size_t)GET_IFIELD_P(0002, _O);
+        }
         return (void *)((acr_ptr_t)h);
     }
     else {
@@ -176,19 +203,35 @@
     }
 }
 
-ACR_DECLARE(int) ACR_PointerSet(ACR_JNISTDARGS, void *p)
+ACR_DECLARE(int) ACR_PointerSet(ACR_JNISTDARGS, void *p, size_t len)
 {
-    if (_clazzn.i && J4MID(0000)) {
+    if (_clazzn.i && J4MID(0000) && _O) {
         SET_IFIELD_P(0000, _O, (jniptr)((acr_ptr_t)p));
 #ifdef _JNI_CHECK_EXCEPTIONS
         if ((*_E)->ExceptionCheck(_E)) {
             return ACR_EGENERAL;
         }
-        else
 #endif
-            return ACR_SUCCESS;
+        if (len) {
+            SET_IFIELD_P(0002, _O, (jniptr)len);
+#ifdef _JNI_CHECK_EXCEPTIONS
+            if ((*_E)->ExceptionCheck(_E)) {
+                return ACR_EGENERAL;
+            }
+#endif
+        }
+        return ACR_SUCCESS;
     }
     else {
         return ACR_ECLASSNOTFOUND;
     }
 }
+
+#ifdef ACR_ENABLE_TEST
+/* Just for testing the cache table */
+ACR_JNI_EXPORT_DECLARE(int, TestMemory, initp0)(ACR_JNISTDARGS, jint d)
+{
+    ACR_CLASS_LRUN(Pointer);
+    return 0;
+}
+#endif

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=767413&r1=767412&r2=767413&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/test/testcase.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/test/testcase.c Wed Apr 22 
08:55:00 2009
@@ -220,7 +220,7 @@
 ACR_JNI_EXPORT_DECLARE(jobject, TestPrivate, test017)(ACR_JNISTDARGS, jint d)
 {
     
-    return  ACR_PointerCreate(_E, I2P(d, void *), callback);
+    return  ACR_PointerCreate(_E, I2P(d, void *), 0, callback);
 }
 
 ACR_JNI_EXPORT_DECLARE(jint, TestPrivate, test018)(ACR_JNISTDARGS, jobject p)
@@ -231,7 +231,7 @@
 
 ACR_JNI_EXPORT_DECLARE(jint, TestPrivate, test019)(ACR_JNISTDARGS, jobject p)
 {
-    void *v = ACR_PointerGet(_E, p);
+    void *v = ACR_PointerGet(_E, p, NULL);
     return v != NULL;
 }
 

Modified: 
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestAll.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestAll.java?rev=767413&r1=767412&r2=767413&view=diff
==============================================================================
--- 
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestAll.java 
(original)
+++ 
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestAll.java 
Wed Apr 22 08:55:00 2009
@@ -34,6 +34,7 @@
         suite.addTest(TestProperties.suite());
         suite.addTest(TestOS.suite());
         suite.addTest(TestUUID.suite());
+        suite.addTest(TestMemory.suite());
         suite.addTest(TestDirectByteBuffer.suite());
         suite.addTest(TestPrivate.suite());
         suite.addTest(TestFile.suite());

Added: 
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=767413&view=auto
==============================================================================
--- 
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestMemory.java
 (added)
+++ 
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestMemory.java
 Wed Apr 22 08:55:00 2009
@@ -0,0 +1,131 @@
+/* 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.
+ */
+
+package org.apache.commons.runtime;
+
+import java.lang.System;
+import java.nio.ByteBuffer;
+import junit.framework.*;
+
+/**
+ * Memory tests
+ */
+public class TestMemory extends TestCase
+{
+
+    private static native int initp0(int d);
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite(TestMemory.class);
+        return suite;
+    }
+
+    protected void setUp()
+        throws Exception
+    {
+        System.loadLibrary("acr");
+        initp0(0);
+    }
+
+
+    public void testMalloc()
+        throws Throwable
+    {
+        Pointer p = Memory.malloc(1000);
+        assertNotNull("Pointer", p);
+        p.free();
+    }
+
+    public void testMallocAddr()
+        throws Throwable
+    {
+        Pointer p = Memory.malloc(1000);
+        assertNotNull("Pointer", p);
+        assertFalse("Null address", 0L == p.address().longValue());
+        p.free();
+    }
+
+    public void testCalloc()
+        throws Throwable
+    {
+        Pointer p = Memory.calloc(1000);
+        assertNotNull("Pointer", p);
+        p.free();
+    }
+
+    public void testSlice()
+        throws Throwable
+    {
+        Pointer src = Memory.calloc(1000);
+        assertNotNull("Pointer", src);
+        Pointer dst = Memory.slice(src, 0, 1000);
+        assertNotNull("Pointer", dst);
+        try {
+            Pointer t = Memory.slice(src, 1, 1000);
+            fail("Missing IndexOutOfBoundsException");
+        } catch (IndexOutOfBoundsException ix) {
+            // Succedded.
+        }
+        try {
+            Pointer t = Memory.slice(null, 0, 0);
+            fail("Missing NullPointerException");
+        } catch (NullPointerException no) {
+            // Succedded.
+        }
+        try {
+            Pointer t = Memory.slice(src, 0, 0);
+            fail("Missing IllegalArgumentException");
+        } catch (IllegalArgumentException ia) {
+            // Succedded.
+        }
+        src.free();
+        dst.free();
+    }
+
+    public void testSet()
+        throws Throwable
+    {
+        Pointer src = Memory.malloc(1000);
+        assertNotNull("Source Pointer", src);
+        Memory.set(src, 0, 1000, 0xFF);
+        src.free();
+    }
+
+    public void testClr()
+        throws Throwable
+    {
+        Pointer src = Memory.malloc(1000);
+        assertNotNull("Source Pointer", src);
+        Memory.clear(src, 0, 1000);
+        src.free();
+    }
+
+    public void testCopy()
+        throws Throwable
+    {
+        Pointer src = Memory.calloc(1000);
+        assertNotNull("Source Pointer", src);
+        Memory.set(src, 0, 1000, 0xFF);
+        Pointer dst = Memory.calloc(1000);
+        assertNotNull("Dest Pointer", dst);
+        Memory.copy(src, 0, dst, 0, 1000);
+
+        src.free();
+        dst.free();
+    }
+
+}
+

Propchange: 
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestMemory.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to