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/08/20 09:46:12 UTC

svn commit: r806073 - in /commons/sandbox/runtime/trunk/src: main/java/org/apache/commons/runtime/ main/java/org/apache/commons/runtime/io/ main/native/ main/native/include/ main/native/os/hpux/ main/native/os/unix/ main/native/os/win32/ main/native/sh...

Author: mturk
Date: Thu Aug 20 07:46:09 2009
New Revision: 806073

URL: http://svn.apache.org/viewvc?rev=806073&view=rev
Log:
impplement SharedMemory API

Added:
    commons/sandbox/runtime/trunk/src/main/native/os/hpux/pshm.c
      - copied, changed from r806059, commons/sandbox/runtime/trunk/src/main/native/os/hpux/shm.c
    commons/sandbox/runtime/trunk/src/main/native/os/unix/pshm.c
      - copied, changed from r806059, commons/sandbox/runtime/trunk/src/main/native/os/unix/shm.c
    commons/sandbox/runtime/trunk/src/main/native/os/win32/pshm.c
      - copied, changed from r806059, commons/sandbox/runtime/trunk/src/main/native/os/win32/shm.c
    commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestSharedMemory.java   (with props)
Removed:
    commons/sandbox/runtime/trunk/src/main/native/os/hpux/shm.c
    commons/sandbox/runtime/trunk/src/main/native/os/unix/shm.c
    commons/sandbox/runtime/trunk/src/main/native/os/win32/shm.c
Modified:
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/SharedMemory.java
    commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Status.java
    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/include/acr_descriptor.h
    commons/sandbox/runtime/trunk/src/main/native/include/acr_shm.h
    commons/sandbox/runtime/trunk/src/main/native/shared/descriptor.c
    commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestAll.java

Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/SharedMemory.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/SharedMemory.java?rev=806073&r1=806072&r2=806073&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/SharedMemory.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/SharedMemory.java Thu Aug 20 07:46:09 2009
@@ -17,6 +17,8 @@
 
 import java.io.IOException;
 import org.apache.commons.runtime.io.File;
+import org.apache.commons.runtime.io.Status;
+import org.apache.commons.runtime.exception.ClosedDescriptorException;
 import org.apache.commons.runtime.exception.OperatingSystemException;
 import org.apache.commons.runtime.exception.UnsupportedOperatingSystemException;
 
@@ -46,6 +48,9 @@
         this.shm = shm;
     }
 
+    private static native SharedMemory create0(long size)
+        throws IOException, SecurityException, OutOfMemoryError;
+
     /**
      * Create and make accessable anonymous shared memory segment.
      * <p>
@@ -69,10 +74,13 @@
      *        require it.
      */
     public static SharedMemory create(long size)
+        throws IOException, SecurityException, OutOfMemoryError
     {
-        return null;
+        return create0(size);
     }
 
+    private static native SharedMemory create1(String name, long size)
+        throws IOException, SecurityException, OutOfMemoryError;
     /**
      * Create and make accessable a shared memory segment.
      * <p>
@@ -88,18 +96,21 @@
      *         about the segment within the actual segment. In order to supply
      *         the caller with the requested size it may be necessary for the
      *         implementation to request a slightly greater segment length
-     *         from the subsystem. In all cases, the {@code get()}
-     *         function will return the first usable byte of memory.
+     *         from the subsystem. In all cases, the {@code map()}
+     *         method will return the first usable byte of memory.
      * </p>
      * @param reqsize The desired size of the segment.
      * @param file The abstract file path to use for shared memory on platforms
      *             that require it.
      */
     public static SharedMemory create(File file, long size)
+        throws IOException, SecurityException, OutOfMemoryError
     {
-        return null;
+        return create1(file.getPath(), size);
     }
 
+    private static native SharedMemory create2(String name)
+        throws IOException, SecurityException, OutOfMemoryError;
     /**
      * Attach to a shared memory segment that was created
      * by another process.
@@ -107,10 +118,13 @@
      *             shared memory block.
      */
     public static SharedMemory attach(File file)
+        throws IOException, SecurityException, OutOfMemoryError
     {
-        return null;
+        return create2(file.getPath());
     }
 
+    private static native int remove0(String name)
+        throws IOException, SecurityException;
     /**
      * Remove shared memory segment associated with a {@code file}.
      * <p>
@@ -121,10 +135,19 @@
      *             segment which needs to be removed.
      */
     public static boolean remove(File file)
+        throws IOException, SecurityException
     {
-        return true;
+        int rc;
+
+        rc = remove0(file.getPath());
+        if (rc == Status.OK)
+            return true;
+        else
+            return false;
     }
 
+    private static native int detach0(Descriptor shm)
+        throws IOException, SecurityException;
     /**
      * Detach the shared memory segment from the system.
      * <p>
@@ -137,9 +160,18 @@
      * </p>
      */
     public void detach()
+        throws IOException, SecurityException, ClosedDescriptorException
     {
+        if (shm.valid()) {
+            detach0(shm);
+        }
+        else {
+            throw new ClosedDescriptorException();
+        }            
     }
 
+    private static native int close0(Descriptor shm)
+        throws IOException, SecurityException;
     /**
      * Close and remove the shared memory segment from the system.
      * <p>
@@ -154,17 +186,34 @@
      * </p>
      */
     public void close()
+        throws IOException, SecurityException, ClosedDescriptorException
     {
+        if (shm.valid()) {
+            close0(shm);
+        }
+        else {
+            throw new ClosedDescriptorException();
+        }            
     }
 
+    private static native long size0(Descriptor shm)
+        throws IOException;
     /**
      * Retrieve the length of a shared memory segment in bytes.
      */
     public long size()
+        throws IOException, ClosedDescriptorException
     {
-        return 0;
+        if (shm.valid()) {
+            return size0(shm);
+        }
+        else {
+            throw new ClosedDescriptorException();
+        }            
     }
 
+    private static native Pointer map0(Descriptor shm)
+        throws IOException;
     /**
      * Retrieve new {@code Pointer} base address of the shared memory segment.
      * <p>
@@ -174,11 +223,19 @@
      * </p>
      * @return Memory pointer.
      */
-    public Pointer get()
+    public Pointer map()
+        throws IOException, ClosedDescriptorException
     {
-        return null;
+        if (shm.valid()) {
+            return map0(shm);
+        }
+        else {
+            throw new ClosedDescriptorException();
+        }            
     }
 
+    private static native Pointer map1(Descriptor shm, long off, long size)
+        throws IOException, IndexOutOfBoundsException;
     /**
      * Retrieve new @code Pointer}address of the shared memory segment.
      * <p>
@@ -190,9 +247,15 @@
      * @param size Size to map.
      * @return Memory pointer.
      */
-    public Pointer get(long offset, long size)
+    public Pointer map(long offset, long size)
+        throws IOException, IndexOutOfBoundsException, ClosedDescriptorException
     {
-        return null;
+        if (shm.valid()) {
+            return map1(shm, offset, size);
+        }
+        else {
+            throw new ClosedDescriptorException();
+        }            
     }
 
 }

Modified: commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Status.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Status.java?rev=806073&r1=806072&r2=806073&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Status.java (original)
+++ commons/sandbox/runtime/trunk/src/main/java/org/apache/commons/runtime/io/Status.java Thu Aug 20 07:46:09 2009
@@ -106,6 +106,8 @@
     private static final int OS_START_SYSERR        = 720000;
     private static final int OS_ERRSPACE_SIZE       =  50000;
 
+    /** Status is OK. */
+    public static final int OK                      = 0;
     /** Unable to perform a stat on the file. */
     public static final int ENOSTAT                 = OS_START_ERROR + 1;
     /** Pool from which to allocate the memory was not provided. */

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=806073&r1=806072&r2=806073&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/Makefile.in (original)
+++ commons/sandbox/runtime/trunk/src/main/native/Makefile.in Thu Aug 20 07:46:09 2009
@@ -97,6 +97,7 @@
 	$(SRCDIR)/shared/sha1.$(OBJ) \
 	$(SRCDIR)/shared/sha2.$(OBJ) \
 	$(SRCDIR)/shared/sbuf.$(OBJ) \
+	$(SRCDIR)/shared/shm.$(OBJ) \
 	$(SRCDIR)/shared/string.$(OBJ) \
 	$(SRCDIR)/shared/tables.$(OBJ) \
 	$(SRCDIR)/shared/xdr.$(OBJ) \
@@ -111,7 +112,7 @@
 	$(SRCDIR)/os/unix/user.$(OBJ) \
 	$(SRCDIR)/os/unix/pmutex.$(OBJ) \
 	$(SRCDIR)/os/unix/psema.$(OBJ) \
-	$(SRCDIR)/os/unix/shm.$(OBJ) \
+	$(SRCDIR)/os/unix/pshm.$(OBJ) \
 	$(SRCDIR)/os/unix/signals.$(OBJ) \
 	$(SRCDIR)/os/unix/syslog.$(OBJ) \
 	$(SRCDIR)/os/unix/time.$(OBJ) \
@@ -135,7 +136,7 @@
 	$(SRCDIR)/os/unix/user.$(OBJ) \
 	$(SRCDIR)/os/unix/pmutex.$(OBJ) \
 	$(SRCDIR)/os/unix/psema.$(OBJ) \
-	$(SRCDIR)/os/unix/shm.$(OBJ) \
+	$(SRCDIR)/os/unix/pshm.$(OBJ) \
 	$(SRCDIR)/os/unix/signals.$(OBJ) \
 	$(SRCDIR)/os/unix/syslog.$(OBJ) \
 	$(SRCDIR)/os/unix/time.$(OBJ) \
@@ -156,7 +157,7 @@
 	$(SRCDIR)/os/unix/group.$(OBJ) \
 	$(SRCDIR)/os/unix/user.$(OBJ) \
 	$(SRCDIR)/os/unix/psema.$(OBJ) \
-	$(SRCDIR)/os/unix/shm.$(OBJ) \
+	$(SRCDIR)/os/unix/pshm.$(OBJ) \
 	$(SRCDIR)/os/unix/signals.$(OBJ) \
 	$(SRCDIR)/os/unix/syslog.$(OBJ) \
 	$(SRCDIR)/os/unix/time.$(OBJ) \
@@ -188,7 +189,7 @@
 	$(SRCDIR)/os/hpux/platform.$(OBJ) \
 	$(SRCDIR)/os/hpux/pgroup.$(OBJ) \
 	$(SRCDIR)/os/hpux/puser.$(OBJ) \
-	$(SRCDIR)/os/hpux/shm.$(OBJ) \
+	$(SRCDIR)/os/hpux/pshm.$(OBJ) \
 	$(SRCDIR)/os/hpux/os.$(OBJ)
 
 PPORT_OBJS=\

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=806073&r1=806072&r2=806073&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in (original)
+++ commons/sandbox/runtime/trunk/src/main/native/Makefile.msc.in Thu Aug 20 07:46:09 2009
@@ -88,6 +88,7 @@
 	$(SRCDIR)/shared/sha1.$(OBJ) \
 	$(SRCDIR)/shared/sha2.$(OBJ) \
 	$(SRCDIR)/shared/sbuf.$(OBJ) \
+	$(SRCDIR)/shared/shm.$(OBJ) \
 	$(SRCDIR)/shared/string.$(OBJ) \
 	$(SRCDIR)/shared/tables.$(OBJ) \
 	$(SRCDIR)/shared/xdr.$(OBJ) \
@@ -104,7 +105,7 @@
 	$(SRCDIR)/os/win32/ios.$(OBJ) \
 	$(SRCDIR)/os/win32/pmutex.$(OBJ) \
 	$(SRCDIR)/os/win32/psema.$(OBJ) \
-	$(SRCDIR)/os/win32/shm.$(OBJ) \
+	$(SRCDIR)/os/win32/pshm.$(OBJ) \
 	$(SRCDIR)/os/win32/signals.$(OBJ) \
 	$(SRCDIR)/os/win32/syslog.$(OBJ) \
 	$(SRCDIR)/os/win32/group.$(OBJ) \

Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_descriptor.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_descriptor.h?rev=806073&r1=806072&r2=806073&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_descriptor.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_descriptor.h Thu Aug 20 07:46:09 2009
@@ -107,6 +107,13 @@
 ACR_DECLARE(int) ACR_DescriptorCleanup(JNIEnv *env, jobject obj);
 
 /**
+ * Clear the Java object without calling cleanup.
+ * @param env Current JNI environment
+ * @param obj Java Descriptor object to clear.
+ */
+ACR_DECLARE(int) ACR_DescriptorClear(JNIEnv *env, jobject obj);
+
+/**
  * Get the native errno number from the Descriptor object.
  * @param env Current JNI environment
  * @param obj Java Descriptor object use.

Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_shm.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_shm.h?rev=806073&r1=806072&r2=806073&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_shm.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_shm.h Thu Aug 20 07:46:09 2009
@@ -141,6 +141,26 @@
 ACR_DECLARE(int) ACR_ShmPermSet(JNIEnv *env, int shm, int perms,
                                 acr_uid_t uid, acr_uid_t gid);
 
+/**
+ * Create shared memory object.
+ * @param env JNI environment to use.
+ * @param filename The file to use for shared memory on platforms that
+ *        require it.
+ * @return The shared memory structure to create.
+ */
+ACR_DECLARE(jobject) ACR_SharedMemoryObjectCreate(JNIEnv *env,
+                                                  const acr_pchar_t *filename,
+                                                  size_t size);
+
+/**
+ * Create attached shared memory object.
+ * @param env JNI environment to use.
+ * @param filename The file used to create the original segment.
+ *        (This MUST match the original filename.)
+ * @return The shared memory structure to create.
+ */
+ACR_DECLARE(jobject) ACR_SharedMemoryObjectAttach(JNIEnv *env,
+                                                  const acr_pchar_t *filename);
 
 #ifdef __cplusplus
 }

Copied: commons/sandbox/runtime/trunk/src/main/native/os/hpux/pshm.c (from r806059, commons/sandbox/runtime/trunk/src/main/native/os/hpux/shm.c)
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/hpux/pshm.c?p2=commons/sandbox/runtime/trunk/src/main/native/os/hpux/pshm.c&p1=commons/sandbox/runtime/trunk/src/main/native/os/hpux/shm.c&r1=806059&r2=806073&rev=806073&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/hpux/shm.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/hpux/pshm.c Thu Aug 20 07:46:09 2009
@@ -543,3 +543,109 @@
     ACR_UnloadClass(_E, &_clazzn);
 }
 
+static int shm_descriptor_cleanup(ACR_JNISTDARGS,
+                                  acr_descriptor_cb_type_e cm,
+                                  acr_descriptor_cb_t *dp)
+{
+    int rc = ACR_SUCCESS;
+    switch (cm) {
+        case ACR_DESC_CLOSE:
+            if (dp->di > 0)
+                rc = acr_ioh_close(dp->di);
+            else
+                rc = ACR_EBADF;
+        break;
+        default:
+            rc = ACR_ENOTIMPL;
+        break;
+    }
+    return rc;
+}
+
+ACR_DECLARE(jobject) ACR_SharedMemoryObjectCreate(JNIEnv *_E,
+                                                  const acr_pchar_t *name,
+                                                  size_t size)
+{
+    jobject shmm;
+    jobject shmd;
+    int     ishm;
+
+    ishm = ACR_ShmCreate(_E, size, name);
+    if (ishm < 0) {
+
+        return NULL;
+    }
+    /* Create Descriptor Object */
+    shmd = ACR_DescriptorCreate(_E, ACR_DT_USER, ishm, NULL,
+                                shm_descriptor_cleanup);
+    if (!shmd) {
+
+        return NULL;
+    }
+    shmm = (*_E)->NewObject(_E, _clazzn.i, J4MID(0000), shmd);
+    return shmm;
+}
+
+ACR_DECLARE(jobject) ACR_SharedMemoryObjectAttach(JNIEnv *_E,
+                                                  const acr_pchar_t *name)
+{
+    jobject shmm;
+    jobject shmd;
+    int     ishm;
+
+    ishm = ACR_ShmAttach(_E, name);
+    if (ishm < 0) {
+
+        return NULL;
+    }
+    /* Create Descriptor Object */
+    shmd = ACR_DescriptorCreate(_E, ACR_DT_USER, ishm, NULL,
+                                shm_descriptor_cleanup);
+    if (!shmd) {
+
+        return NULL;
+    }
+    shmm = (*_E)->NewObject(_E, _clazzn.i, J4MID(0000), shmd);
+    return shmm;
+}
+
+ACR_JNI_EXPORT_DECLARE(jobject, SharedMemory, create1)(ACR_JNISTDARGS,
+                                                       jstring name,
+                                                       jlong size)
+{
+
+    jobject shm = NULL;
+    UNREFERENCED_O;
+
+    WITH_CSTR(name) {
+        shm = ACR_SharedMemoryObjectCreate(_E, J2S(name), (size_t)size);
+    } END_WITH_CSTR(name);
+    return shm;
+}
+
+ACR_JNI_EXPORT_DECLARE(jobject, SharedMemory, create2)(ACR_JNISTDARGS,
+                                                       jstring name)
+{
+
+    jobject shm = NULL;
+    UNREFERENCED_O;
+
+    WITH_CSTR(name) {
+        shm = ACR_SharedMemoryObjectAttach(_E, J2S(name));
+    } END_WITH_CSTR(name);
+    return shm;
+}
+
+ACR_JNI_EXPORT_DECLARE(jint, SharedMemory, remove0)(ACR_JNISTDARGS,
+                                                    jstring name)
+{
+
+    int rc = ACR_SUCCESS;
+    UNREFERENCED_O;
+
+    WITH_CSTR(name) {
+        rc = ACR_ShmRemove(_E, J2S(name));
+    } END_WITH_CSTR(name);
+    return rc;
+}
+

Copied: commons/sandbox/runtime/trunk/src/main/native/os/unix/pshm.c (from r806059, commons/sandbox/runtime/trunk/src/main/native/os/unix/shm.c)
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/pshm.c?p2=commons/sandbox/runtime/trunk/src/main/native/os/unix/pshm.c&p1=commons/sandbox/runtime/trunk/src/main/native/os/unix/shm.c&r1=806059&r2=806073&rev=806073&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/shm.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/pshm.c Thu Aug 20 07:46:09 2009
@@ -78,7 +78,7 @@
         return ACR_EINVAL;
     }
     /* Anonymous shared memory or
-     * we are calling this from forked child. 
+     * we are calling this from forked child.
      */
     if (m->filename == NULL) {
         if (m->base && munmap(m->base, m->realsize) == -1) {
@@ -227,9 +227,9 @@
         return -1;
     /* Check if they want anonymous or name-based shared memory */
     if (filename == NULL) {
-        shm->filename = NULL;    
+        shm->filename = NULL;
         shm->reqsize  = reqsize;
-        shm->realsize = reqsize + 
+        shm->realsize = reqsize +
                         ACR_ALIGN_DEFAULT(sizeof(acr_size_t)); /* room for metadata */
         shm->base     = mmap(NULL, shm->realsize, PROT_READ | PROT_WRITE,
                              MAP_ANON | MAP_SHARED, -1, 0);
@@ -314,7 +314,7 @@
         } while (rc == (acr_size_t)-1 && errno == EINTR);
         if (rc == -1) {
             rc = ACR_GET_OS_ERROR();
-            goto finally;            
+            goto finally;
         }
 finally:
         if (file > 0)
@@ -462,7 +462,7 @@
     if (IS_INVALID_HANDLE(m) || ACR_IOH_TYPE(shm) != ACR_DT_SHM) {
         rc = ACR_EINVAL;
         goto finally;
-    }        
+    }
     if ((shmid = shmget(m->shmkey, 0, SHM_R | SHM_W)) == -1) {
         rc = ACR_GET_OS_ERROR();
         goto finally;
@@ -524,3 +524,109 @@
     ACR_UnloadClass(_E, &_clazzn);
 }
 
+static int shm_descriptor_cleanup(ACR_JNISTDARGS,
+                                  acr_descriptor_cb_type_e cm,
+                                  acr_descriptor_cb_t *dp)
+{
+    int rc = ACR_SUCCESS;
+    switch (cm) {
+        case ACR_DESC_CLOSE:
+            if (dp->di > 0)
+                rc = acr_ioh_close(dp->di);
+            else
+                rc = ACR_EBADF;
+        break;
+        default:
+            rc = ACR_ENOTIMPL;
+        break;
+    }
+    return rc;
+}
+
+ACR_DECLARE(jobject) ACR_SharedMemoryObjectCreate(JNIEnv *_E,
+                                                  const acr_pchar_t *name,
+                                                  size_t size)
+{
+    jobject shmm;
+    jobject shmd;
+    int     ishm;
+
+    ishm = ACR_ShmCreate(_E, size, name);
+    if (ishm < 0) {
+
+        return NULL;
+    }
+    /* Create Descriptor Object */
+    shmd = ACR_DescriptorCreate(_E, ACR_DT_USER, ishm, NULL,
+                                shm_descriptor_cleanup);
+    if (!shmd) {
+
+        return NULL;
+    }
+    shmm = (*_E)->NewObject(_E, _clazzn.i, J4MID(0000), shmd);
+    return shmm;
+}
+
+ACR_DECLARE(jobject) ACR_SharedMemoryObjectAttach(JNIEnv *_E,
+                                                  const acr_pchar_t *name)
+{
+    jobject shmm;
+    jobject shmd;
+    int     ishm;
+
+    ishm = ACR_ShmAttach(_E, name);
+    if (ishm < 0) {
+
+        return NULL;
+    }
+    /* Create Descriptor Object */
+    shmd = ACR_DescriptorCreate(_E, ACR_DT_USER, ishm, NULL,
+                                shm_descriptor_cleanup);
+    if (!shmd) {
+
+        return NULL;
+    }
+    shmm = (*_E)->NewObject(_E, _clazzn.i, J4MID(0000), shmd);
+    return shmm;
+}
+
+ACR_JNI_EXPORT_DECLARE(jobject, SharedMemory, create1)(ACR_JNISTDARGS,
+                                                       jstring name,
+                                                       jlong size)
+{
+
+    jobject shm = NULL;
+    UNREFERENCED_O;
+
+    WITH_CSTR(name) {
+        shm = ACR_SharedMemoryObjectCreate(_E, J2S(name), (size_t)size);
+    } END_WITH_CSTR(name);
+    return shm;
+}
+
+ACR_JNI_EXPORT_DECLARE(jobject, SharedMemory, create2)(ACR_JNISTDARGS,
+                                                       jstring name)
+{
+
+    jobject shm = NULL;
+    UNREFERENCED_O;
+
+    WITH_CSTR(name) {
+        shm = ACR_SharedMemoryObjectAttach(_E, J2S(name));
+    } END_WITH_CSTR(name);
+    return shm;
+}
+
+ACR_JNI_EXPORT_DECLARE(jint, SharedMemory, remove0)(ACR_JNISTDARGS,
+                                                    jstring name)
+{
+
+    int rc = ACR_SUCCESS;
+    UNREFERENCED_O;
+
+    WITH_CSTR(name) {
+        rc = ACR_ShmRemove(_E, J2S(name));
+    } END_WITH_CSTR(name);
+    return rc;
+}
+

Copied: commons/sandbox/runtime/trunk/src/main/native/os/win32/pshm.c (from r806059, commons/sandbox/runtime/trunk/src/main/native/os/win32/shm.c)
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/pshm.c?p2=commons/sandbox/runtime/trunk/src/main/native/os/win32/pshm.c&p1=commons/sandbox/runtime/trunk/src/main/native/os/win32/shm.c&r1=806059&r2=806073&rev=806073&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/shm.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/pshm.c Thu Aug 20 07:46:09 2009
@@ -405,3 +405,109 @@
     ACR_UnloadClass(_E, &_clazzn);
 }
 
+static int shm_descriptor_cleanup(ACR_JNISTDARGS,
+                                  acr_descriptor_cb_type_e cm,
+                                  acr_descriptor_cb_t *dp)
+{
+    int rc = ACR_SUCCESS;
+    switch (cm) {
+        case ACR_DESC_CLOSE:
+            if (dp->di > 0)
+                rc = acr_ioh_close(dp->di);
+            else
+                rc = ACR_EBADF;
+        break;
+        default:
+            rc = ACR_ENOTIMPL;
+        break;
+    }
+    return rc;
+}
+
+ACR_DECLARE(jobject) ACR_SharedMemoryObjectCreate(JNIEnv *_E,
+                                                  const acr_pchar_t *name,
+                                                  size_t size)
+{
+    jobject shmm;
+    jobject shmd;
+    int     ishm;
+
+    ishm = ACR_ShmCreate(_E, size, name);
+    if (ishm < 0) {
+
+        return NULL;
+    }
+    /* Create Descriptor Object */
+    shmd = ACR_DescriptorCreate(_E, ACR_DT_USER, ishm, NULL,
+                                shm_descriptor_cleanup);
+    if (!shmd) {
+
+        return NULL;
+    }
+    shmm = (*_E)->NewObject(_E, _clazzn.i, J4MID(0000), shmd);
+    return shmm;
+}
+
+ACR_DECLARE(jobject) ACR_SharedMemoryObjectAttach(JNIEnv *_E,
+                                                  const acr_pchar_t *name)
+{
+    jobject shmm;
+    jobject shmd;
+    int     ishm;
+
+    ishm = ACR_ShmAttach(_E, name);
+    if (ishm < 0) {
+
+        return NULL;
+    }
+    /* Create Descriptor Object */
+    shmd = ACR_DescriptorCreate(_E, ACR_DT_USER, ishm, NULL,
+                                shm_descriptor_cleanup);
+    if (!shmd) {
+
+        return NULL;
+    }
+    shmm = (*_E)->NewObject(_E, _clazzn.i, J4MID(0000), shmd);
+    return shmm;
+}
+
+ACR_JNI_EXPORT_DECLARE(jobject, SharedMemory, create1)(ACR_JNISTDARGS,
+                                                       jstring name,
+                                                       jlong size)
+{
+
+    jobject shm = NULL;
+    UNREFERENCED_O;
+
+    WITH_WSTR(name) {
+        shm = ACR_SharedMemoryObjectCreate(_E, J2W(name), (size_t)size);
+    } END_WITH_WSTR(name);
+    return shm;
+}
+
+ACR_JNI_EXPORT_DECLARE(jobject, SharedMemory, create2)(ACR_JNISTDARGS,
+                                                       jstring name)
+{
+
+    jobject shm = NULL;
+    UNREFERENCED_O;
+
+    WITH_WSTR(name) {
+        shm = ACR_SharedMemoryObjectAttach(_E, J2W(name));
+    } END_WITH_WSTR(name);
+    return shm;
+}
+
+ACR_JNI_EXPORT_DECLARE(jint, SharedMemory, remove0)(ACR_JNISTDARGS,
+                                                    jstring name)
+{
+
+    int rc = ACR_SUCCESS;
+    UNREFERENCED_O;
+
+    WITH_WSTR(name) {
+        rc = ACR_ShmRemove(_E, J2S(name));
+    } END_WITH_WSTR(name);
+    return rc;
+}
+

Modified: commons/sandbox/runtime/trunk/src/main/native/shared/descriptor.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/descriptor.c?rev=806073&r1=806072&r2=806073&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/descriptor.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/descriptor.c Thu Aug 20 07:46:09 2009
@@ -327,6 +327,27 @@
         return ACR_ECLASSNOTFOUND;
 }
 
+ACR_DECLARE(int) ACR_DescriptorClear(ACR_JNISTDARGS)
+{
+    if (_clazzn.i && J4MID(0000)) {
+        if ((*_E)->MonitorEnter(_E, _O)) {
+            /* Object locking failed */
+            return ACR_ENOLOCK;
+        }
+        SET_IFIELD_I(0000, _O, -1);
+        SET_IFIELD_P(0001, _O, NULL);
+        SET_IFIELD_P(0002, _O, NULL);
+        SET_IFIELD_P(0003, _O, NULL);
+        SET_IFIELD_P(0004, _O, NULL);
+        SET_IFIELD_O(0005, _O, NULL);
+
+        (*_E)->MonitorExit(_E, _O);
+        return ACR_SUCCESS;
+    }
+    else
+        return ACR_ECLASSNOTFOUND;
+}
+
 ACR_DECLARE(void *) ACR_DescriptorGetPtr(ACR_JNISTDARGS)
 {
     if (_clazzn.i && J4MID(0000)) {

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=806073&r1=806072&r2=806073&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 Thu Aug 20 07:46:09 2009
@@ -45,6 +45,7 @@
         suite.addTest(TestFile.suite());
         suite.addTest(TestStrings.suite());
         suite.addTest(TestSemaphore.suite());
+        suite.addTest(TestSharedMemory.suite());
         return suite;
     }
 

Added: commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestSharedMemory.java
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestSharedMemory.java?rev=806073&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestSharedMemory.java (added)
+++ commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestSharedMemory.java Thu Aug 20 07:46:09 2009
@@ -0,0 +1,81 @@
+/* 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 junit.framework.*;
+import org.apache.commons.runtime.io.*;
+import org.apache.commons.runtime.exception.*;
+
+/**
+ * SharedMemory Test.
+ *
+ */
+public class TestSharedMemory extends TestCase
+{
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite(TestSharedMemory.class);
+        return suite;
+    }
+
+    protected void setUp()
+        throws Exception
+    {
+        System.loadLibrary("acr");
+    }
+
+    public void testSharedMemoryCreate()
+        throws Throwable
+    {
+
+        try {
+            SharedMemory.remove(new File("ACRSharedMemory"));
+            System.out.println("Removed previous instance of ACRSharedMemory");
+        } catch (Throwable t) {
+            // Ignore.
+        }
+        SharedMemory shm;
+        shm = SharedMemory.create(new File("ACRSharedMemory"), 1024);
+
+        long size = shm.size();
+        System.out.println("ACRSharedMemory created with real size " + size);
+        assertTrue("Wrong Shared memory size", size >= 1024);
+
+        shm.close();
+    }
+
+    public void testSharedMemoryDetach()
+        throws Throwable
+    {
+        SharedMemory shm;
+
+        shm = SharedMemory.create(new File("ACRSharedMemory"), 1024);
+
+        shm.detach();
+        try {
+            shm.close();
+        } catch (Throwable t) {
+            assertSame("Wrong Exception class",
+                ClosedDescriptorException.class, t.getClass());
+        }
+        boolean rv = SharedMemory.remove(new File("ACRSharedMemory"));
+        assertTrue("Shared memory not removed", rv);
+    }
+
+}
+

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