Author: mturk
Date: Thu Aug  6 08:10:29 2009
New Revision: 801535

URL: http://svn.apache.org/viewvc?rev=801535&view=rev
Log:
Add shared memory and proc mutex. POSIX only

Added:
    commons/sandbox/runtime/trunk/src/main/native/include/acr_procmutex.h   
(with props)
    commons/sandbox/runtime/trunk/src/main/native/include/acr_shm.h
    commons/sandbox/runtime/trunk/src/main/native/os/unix/pmutex.c   (with 
props)
    commons/sandbox/runtime/trunk/src/main/native/os/unix/shm.c   (with props)
Modified:
    commons/sandbox/runtime/trunk/src/main/native/Makefile.in
    commons/sandbox/runtime/trunk/src/main/native/configure
    commons/sandbox/runtime/trunk/src/main/native/include/acr_openssl.h
    
commons/sandbox/runtime/trunk/src/main/native/include/arch/darwin/acr_arch_private.h
    
commons/sandbox/runtime/trunk/src/main/native/include/arch/hpux/acr_arch_private.h
    
commons/sandbox/runtime/trunk/src/main/native/include/arch/linux/acr_arch_private.h
    
commons/sandbox/runtime/trunk/src/main/native/include/arch/solaris/acr_arch_private.h
    commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h
    
commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h
    commons/sandbox/runtime/trunk/src/main/native/os/unix/ios.c
    commons/sandbox/runtime/trunk/src/main/native/os/win32/ios.c
    commons/sandbox/runtime/trunk/src/main/native/test/testcase.c
    
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java

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=801535&r1=801534&r2=801535&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/Makefile.in (original)
+++ commons/sandbox/runtime/trunk/src/main/native/Makefile.in Thu Aug  6 
08:10:29 2009
@@ -101,6 +101,8 @@
        $(SRCDIR)/os/unix/ios.$(OBJ) \
        $(SRCDIR)/os/unix/group.$(OBJ) \
        $(SRCDIR)/os/unix/user.$(OBJ) \
+       $(SRCDIR)/os/unix/pmutex.$(OBJ) \
+       $(SRCDIR)/os/unix/shm.$(OBJ) \
        $(SRCDIR)/os/unix/syslog.$(OBJ) \
        $(SRCDIR)/os/unix/uuid.$(OBJ) \
        $(SRCDIR)/os/unix/uutils.$(OBJ) \
@@ -118,6 +120,8 @@
        $(SRCDIR)/os/unix/ios.$(OBJ) \
        $(SRCDIR)/os/unix/group.$(OBJ) \
        $(SRCDIR)/os/unix/user.$(OBJ) \
+       $(SRCDIR)/os/unix/pmutex.$(OBJ) \
+       $(SRCDIR)/os/unix/shm.$(OBJ) \
        $(SRCDIR)/os/unix/syslog.$(OBJ) \
        $(SRCDIR)/os/unix/uuid.$(OBJ) \
        $(SRCDIR)/os/unix/uutils.$(OBJ) \
@@ -133,6 +137,7 @@
        $(SRCDIR)/os/unix/ios.$(OBJ) \
        $(SRCDIR)/os/unix/group.$(OBJ) \
        $(SRCDIR)/os/unix/user.$(OBJ) \
+       $(SRCDIR)/os/unix/shm.$(OBJ) \
        $(SRCDIR)/os/unix/syslog.$(OBJ) \
        $(SRCDIR)/os/unix/uuid.$(OBJ) \
        $(SRCDIR)/os/unix/uutils.$(OBJ) \
@@ -148,6 +153,8 @@
        $(SRCDIR)/os/unix/ios.$(OBJ) \
        $(SRCDIR)/os/unix/group.$(OBJ) \
        $(SRCDIR)/os/unix/user.$(OBJ) \
+       $(SRCDIR)/os/unix/pmutex.$(OBJ) \
+       $(SRCDIR)/os/unix/shm.$(OBJ) \
        $(SRCDIR)/os/unix/syslog.$(OBJ) \
        $(SRCDIR)/os/unix/uuid.$(OBJ) \
        $(SRCDIR)/os/unix/uutils.$(OBJ) \
@@ -170,13 +177,13 @@
 
 $(STATICLIB): $(COMMON_OBJS) $(@platf...@_objs) @testobjs@
        $(AR) $(ARFLAGS) $@ $(COMMON_OBJS) $(@platf...@_objs) @testobjs@
-       -...@$(RANLIB) $@
+       $(RANLIB) $@
 
 $(SHAREDLIB): $(COMMON_OBJS) $(@platf...@_objs) @testobjs@ $(STATICLIB)
-       $(CC) $(SHFLAGS) -o $@ $(COMMON_OBJS) $(@platf...@_objs) @testobjs@ 
$(LDFLAGS) 
+       $(CC) $(SHFLAGS) $(COMMON_OBJS) $(@platf...@_objs) @testobjs@ 
$(LDFLAGS) -o $@
 
 $(SSLMODLIB): $(SHAREDLIB) $(OPENSSL_OBJS)
-       $(CC) $(SHFLAGS) -o $@ $(OPENSSL_OBJS) $(LDFLAGS) $(SSLFLAGS) -L. 
-l$(NAME)
+       $(CC) $(SHFLAGS) $(OPENSSL_OBJS) $(LDFLAGS) $(SSLFLAGS) -L. -l$(NAME) 
-o $@
 
 clean:
        for i in $(SRCDIR) $(ARCH_DIRS) ; do rm -f $$i/*.$(OBJ) ; done

Modified: commons/sandbox/runtime/trunk/src/main/native/configure
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/configure?rev=801535&r1=801534&r2=801535&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/configure (original)
+++ commons/sandbox/runtime/trunk/src/main/native/configure Thu Aug  6 08:10:29 
2009
@@ -797,7 +797,9 @@
     fi
     have_openssl=1
     modules="\$(SSLMODLIB)"
+    have_ocsp=`have_include openssl/ocsp`
 else
+    have_ocsp=0
     have_openssl=0
 fi
 
@@ -852,6 +854,7 @@
 #define HAVE_LIBAIO_H         $have_libaio
 #define HAVE_UUID_UUID_H      $have_uuid_uuid
 #define HAVE_OPENSSL          $have_openssl
+#define HAVE_OCSP             $have_ocsp
 #define HAVE_ZLIB             $have_zlib
 #define HAVE_SELINUX_H        $have_selinux
 

Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_openssl.h
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_openssl.h?rev=801535&r1=801534&r2=801535&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_openssl.h 
(original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_openssl.h Thu Aug 
 6 08:10:29 2009
@@ -48,6 +48,12 @@
 #include <openssl/rand.h>
 #include <openssl/x509v3.h>
 #include <openssl/md5.h>
+
+#ifdef HAVE_OCSP
+#include <openssl/x509_vfy.h>
+#include <openssl/ocsp.h>
+#endif
+
 /* Avoid tripping over an engine build installed globally and detected
  * when the user points at an explicit non-engine flavor of OpenSSL
  */

Added: commons/sandbox/runtime/trunk/src/main/native/include/acr_procmutex.h
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_procmutex.h?rev=801535&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_procmutex.h 
(added)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_procmutex.h Thu 
Aug  6 08:10:29 2009
@@ -0,0 +1,97 @@
+/* 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.
+ */
+
+#ifndef _ACR_PROCMUTEX_H
+#define _ACR_PROCMUTEX_H
+
+#include "acr.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @file acr_procmutex.h
+ * @brief
+ *
+ * ACR Process mutex functions
+ *
+ */
+
+/**
+ * Private, platform-specific data struture representing a mutex.
+ */
+typedef struct acr_pmutex_t acr_pmutex_t;
+
+
+/**
+ * Create and initialize a mutex that can be used to synchronize processes.
+ * @param env JNI environment to use.
+ * @param fname A file name to use if the lock mechanism requires one.  This
+ *        argument should always be provided.  The lock code itself will
+ *        determine if it should be used.
+ */
+ACR_DECLARE(int) ACR_ProcMutexCreate(JNIEnv *env, const acr_pchar_t *fname);
+
+/**
+ * Acquire the lock for the given mutex. If the mutex is already locked,
+ * the current thread will be put to sleep until the lock becomes available.
+ * @param env JNI environment to use.
+ * @param mutex the mutex on which to acquire the lock.
+ */
+ACR_DECLARE(int) ACR_ProcMutexLock(JNIEnv *env, int mutex);
+
+/**
+ * Attempt to acquire the lock for the given mutex. If the mutex has already
+ * been acquired, the call returns immediately with APR_EBUSY. Note: it
+ * is important that the APR_STATUS_IS_EBUSY(s) macro be used to determine
+ * if the return value was APR_EBUSY, for portability reasons.
+ * @param env JNI environment to use.
+ * @param mutex the mutex on which to attempt the lock acquiring.
+ */
+ACR_DECLARE(int) ACR_ProcMutexTryLock(JNIEnv *env, int mutex);
+
+/**
+ * Release the lock for the given mutex.
+ * @param env JNI environment to use.
+ * @param mutex the mutex from which to release the lock.
+ */
+ACR_DECLARE(int) ACR_ProcMutexRelease(JNIEnv *env, int mutex);
+
+/**
+ * Set mutex permissions.
+ * @param env JNI environment to use.
+ * @param mutex the mutex for which to set the permissions.
+ * @param perms Permissions to set. See  ACR_FPROT_ flags.
+ * @param uid User that will own the mutex.
+ * @param gid Group that will own the mutex.
+ */
+ACR_DECLARE(int) ACR_ProcMutexPermSet(JNIEnv *env, int mutex, int perms,
+                                      acr_uid_t uid, acr_uid_t gid);
+
+/**
+ * Destroy the mutex and free the memory associated with the lock.
+ * @param env JNI environment to use.
+ * @param mutex the mutex to destroy.
+ */
+ACR_DECLARE(int) ACR_ProcMutexClose(JNIEnv *env, int mutex);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ACR_PROCMUTEX_H */
+

Propchange: 
commons/sandbox/runtime/trunk/src/main/native/include/acr_procmutex.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 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=801535&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_shm.h (added)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_shm.h Thu Aug  6 
08:10:29 2009
@@ -0,0 +1,144 @@
+/* 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.
+ */
+
+#ifndef _ACR_SHM_H
+#define _ACR_SHM_H
+
+#include "acr.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @file acr_shm.h
+ * @brief
+ *
+ * ACR Shared memory functions
+ *
+ */
+
+/**
+ * Private, platform-specific data struture representing a shared memory
+ * segment.
+ */
+typedef struct acr_shm_t acr_shm_t;
+
+
+/**
+ * Create and make accessable a shared memory segment.
+ * @param env JNI environment to use.
+ * @param reqsize The desired size of the segment.
+ * @param filename The file to use for shared memory on platforms that
+ *        require it.
+ * @remark A note about Anonymous vs. Named shared memory segments:
+ *         Not all plaforms support anonymous shared memory segments, but in
+ *         some cases it is prefered over other types of shared memory
+ *         implementations. Passing a NULL 'file' parameter to this function
+ *         will cause the subsystem to use anonymous shared memory segments.
+ *         If such a system is not available, APR_ENOTIMPL is returned.
+ * @remark A note about allocation sizes:
+ *         On some platforms it is necessary to store some metainformation
+ *         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 apr_shm_baseaddr_get()
+ *         function will return the first usable byte of memory.
+ * @return The shared memory structure to create.
+ * 
+ */
+ACR_DECLARE(int) ACR_ShmCreate(JNIEnv *env, acr_size_t reqsize,
+                               const acr_pchar_t *filename);
+
+/**
+ * Attach to a shared memory segment that was created
+ * by another process.
+ * @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(int) ACR_ShmAttach(JNIEnv *env,
+                               const acr_pchar_t *filename);
+
+/**
+ * Destroy a shared memory segment and associated memory.
+ * @param env JNI environment to use.
+ * @param m The shared memory segment structure to destroy.
+ */
+ACR_DECLARE(int) ACR_ShmDestroy(JNIEnv *env, int m);
+
+/**
+ * Detach from a shared memory segment without destroying it.
+ * @param env JNI environment to use.
+ * @param m The shared memory structure representing the segment
+ *        to detach from.
+ */
+ACR_DECLARE(int) ACR_ShmDetach(JNIEnv *env, int m);
+
+/**
+ * Remove named resource associated with a shared memory segment,
+ * preventing attachments to the resource, but not destroying it.
+ * @param env JNI environment to use.
+ * @param filename The filename associated with shared-memory segment which
+ *        needs to be removed
+ * @remark This function is only supported on platforms which support
+ * name-based shared memory segments, and will return APR_ENOTIMPL on
+ * platforms without such support.  Removing the file while the shm
+ * is in use is not entirely portable, caller may use this to enhance
+ * obscurity of the resource, but be prepared for the the call to fail,
+ * and for concurrent attempts to create a resource of the same name
+ * to also fail.  The pool cleanup of apr_shm_create (apr_shm_destroy)
+ * also removes the named resource.
+ */
+ACR_DECLARE(int) ACR_ShmRemove(JNIEnv *env, const acr_pchar_t *filename);
+
+/**
+ * Retrieve the base address of the shared memory segment.
+ * NOTE: This address is only usable within the callers address
+ * space, since this API does not guarantee that other attaching
+ * processes will maintain the same address mapping.
+ * @param m The shared memory segment from which to retrieve
+ *        the base address.
+ * @return address, aligned by APR_ALIGN_DEFAULT.
+ */
+ACR_DECLARE(void *) ACR_ShmGetBaseAddr(int m);
+
+/**
+ * Retrieve the length of a shared memory segment in bytes.
+ * @param m The shared memory segment from which to retrieve
+ *        the segment length.
+ */
+ACR_DECLARE(acr_size_t) ACR_ShmGetSize(int m);
+
+/**
+ * Set shared memory permissions.
+ * @param env JNI environment to use.
+ * @param shm the shared for which to set the permissions.
+ * @param perms Permissions to set. See  ACR_FPROT_ flags.
+ * @param uid User that will own the mutex.
+ * @param gid Group that will own the mutex.
+ */
+ACR_DECLARE(int) ACR_ShmPermSet(JNIEnv *env, int shm, int perms,
+                                acr_uid_t uid, acr_uid_t gid);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ACR_SHM_H */
+

Modified: 
commons/sandbox/runtime/trunk/src/main/native/include/arch/darwin/acr_arch_private.h
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/arch/darwin/acr_arch_private.h?rev=801535&r1=801534&r2=801535&view=diff
==============================================================================
--- 
commons/sandbox/runtime/trunk/src/main/native/include/arch/darwin/acr_arch_private.h
 (original)
+++ 
commons/sandbox/runtime/trunk/src/main/native/include/arch/darwin/acr_arch_private.h
 Thu Aug  6 08:10:29 2009
@@ -41,8 +41,31 @@
 #define ACR_JNI_PLATFORM_DECLARE(RT, CL, FN)  \
     JNIEXPORT RT JNICALL 
Java_org_apache_commons_runtime_platform_darwin_##CL##_##FN
 
+/**
+ * Temporary APR flags
+ */
+#define APR_USE_SHMEM_SHMGET                1
+#define APR_USE_SHMEM_MMAP_ANON             1
+#define APR_USE_FCNTL_SERIALIZE             1
+#define APR_USE_PTHREAD_SERIALIZE           1 
+#define APR_PROCESS_LOCK_IS_GLOBAL          0
+#define APR_HAVE_CORKABLE_TCP               0 
+#define APR_HAVE_SA_STORAGE                 0
+#define APR_HAVE_UNION_SEMUN                0
+#define APR_HAVE_SCTP                       0
+#define APR_HAS_SO_ACCEPTFILTER             0
+#define APR_HAS_UNICODE_FS                  0
+#define APR_HAS_PROC_INVOKED                0
+#define APR_HAS_XTHREAD_FILES               0
+#define APR_HAS_OS_UUID                     0
+#define APR_TCP_NOPUSH_FLAG                 0
+#define APR_TCP_NODELAY_INHERITED           1
+#define APR_O_NONBLOCK_INHERITED            1
+#define APR_HAS_LARGE_FILES                 1
+
 #ifdef __cplusplus
 }
 #endif
 
 #endif /* ACR_ARCH_PRIVATE_H */
+

Modified: 
commons/sandbox/runtime/trunk/src/main/native/include/arch/hpux/acr_arch_private.h
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/arch/hpux/acr_arch_private.h?rev=801535&r1=801534&r2=801535&view=diff
==============================================================================
--- 
commons/sandbox/runtime/trunk/src/main/native/include/arch/hpux/acr_arch_private.h
 (original)
+++ 
commons/sandbox/runtime/trunk/src/main/native/include/arch/hpux/acr_arch_private.h
 Thu Aug  6 08:10:29 2009
@@ -37,8 +37,31 @@
 #define ACR_JNI_PLATFORM_DECLARE(RT, CL, FN)  \
     JNIEXPORT RT JNICALL 
Java_org_apache_commons_runtime_platform_hpux_##CL##_##FN
 
+/**
+ * Temporary APR flags
+ */
+#define APR_USE_SHMEM_SHMGET                0
+#define APR_USE_SHMEM_MMAP_ANON             1
+#define APR_USE_SYSVSEM_SERIALIZE           1
+#define APR_USE_PTHREAD_SERIALIZE           1 
+#define APR_PROCESS_LOCK_IS_GLOBAL          0
+#define APR_HAVE_CORKABLE_TCP               0 
+#define APR_HAVE_SA_STORAGE                 0
+#define APR_HAVE_UNION_SEMUN                0
+#define APR_HAVE_SCTP                       0
+#define APR_HAS_SO_ACCEPTFILTER             0
+#define APR_HAS_UNICODE_FS                  0
+#define APR_HAS_PROC_INVOKED                0
+#define APR_HAS_XTHREAD_FILES               0
+#define APR_HAS_OS_UUID                     0
+#define APR_TCP_NOPUSH_FLAG                 0
+#define APR_TCP_NODELAY_INHERITED           0
+#define APR_O_NONBLOCK_INHERITED            0
+#define APR_HAS_LARGE_FILES                 0
+
 #ifdef __cplusplus
 }
 #endif
 
 #endif /* ACR_ARCH_PRIVATE_H */
+

Modified: 
commons/sandbox/runtime/trunk/src/main/native/include/arch/linux/acr_arch_private.h
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/arch/linux/acr_arch_private.h?rev=801535&r1=801534&r2=801535&view=diff
==============================================================================
--- 
commons/sandbox/runtime/trunk/src/main/native/include/arch/linux/acr_arch_private.h
 (original)
+++ 
commons/sandbox/runtime/trunk/src/main/native/include/arch/linux/acr_arch_private.h
 Thu Aug  6 08:10:29 2009
@@ -33,14 +33,35 @@
  * ACR Linux platform private macros and defines
  *
  */
-
 #define ACR_PLATFORM_CLASS_PATH   ACR_CLASS_PATH "platform/linux/"
 #define ACR_JNI_PLATFORM_DECLARE(RT, CL, FN)  \
     JNIEXPORT RT JNICALL 
Java_org_apache_commons_runtime_platform_linux_##CL##_##FN
 
+/**
+ * Temporary APR flags
+ */
+#define APR_USE_SHMEM_SHMGET                1
+#define APR_USE_SHMEM_MMAP_ANON             1
+#define APR_USE_SYSVSEM_SERIALIZE           1
+#define APR_USE_PTHREAD_SERIALIZE           1 
+#define APR_PROCESS_LOCK_IS_GLOBAL          0
+#define APR_HAVE_CORKABLE_TCP               1 
+#define APR_HAVE_SA_STORAGE                 1
+#define APR_HAVE_UNION_SEMUN                0
+#define APR_HAVE_SCTP                       0
+#define APR_HAS_SO_ACCEPTFILTER             0
+#define APR_HAS_UNICODE_FS                  0
+#define APR_HAS_PROC_INVOKED                0
+#define APR_HAS_XTHREAD_FILES               0
+#define APR_HAS_OS_UUID                     1
+#define APR_TCP_NOPUSH_FLAG                 TCP_CORK
+#define APR_TCP_NODELAY_INHERITED           1
+#define APR_O_NONBLOCK_INHERITED            0
+#define APR_HAS_LARGE_FILES                 0
 
 #ifdef __cplusplus
 }
 #endif
 
 #endif /* ACR_ARCH_PRIVATE_H */
+

Modified: 
commons/sandbox/runtime/trunk/src/main/native/include/arch/solaris/acr_arch_private.h
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/arch/solaris/acr_arch_private.h?rev=801535&r1=801534&r2=801535&view=diff
==============================================================================
--- 
commons/sandbox/runtime/trunk/src/main/native/include/arch/solaris/acr_arch_private.h
 (original)
+++ 
commons/sandbox/runtime/trunk/src/main/native/include/arch/solaris/acr_arch_private.h
 Thu Aug  6 08:10:29 2009
@@ -37,8 +37,31 @@
 #define ACR_JNI_PLATFORM_DECLARE(RT, CL, FN)  \
     JNIEXPORT RT JNICALL 
Java_org_apache_commons_runtime_platform_solaris_##CL##_##FN
 
+/**
+ * Temporary APR flags
+ */
+#define APR_USE_SHMEM_SHMGET                1
+#define APR_USE_SHMEM_MMAP_ANON             1
+#define APR_USE_SYSVSEM_SERIALIZE           1
+#define APR_USE_PTHREAD_SERIALIZE           1 
+#define APR_PROCESS_LOCK_IS_GLOBAL          0
+#define APR_HAVE_CORKABLE_TCP               1 
+#define APR_HAVE_SA_STORAGE                 1
+#define APR_HAVE_UNION_SEMUN                1
+#define APR_HAVE_SCTP                       0
+#define APR_HAS_SO_ACCEPTFILTER             0
+#define APR_HAS_UNICODE_FS                  0
+#define APR_HAS_PROC_INVOKED                0
+#define APR_HAS_XTHREAD_FILES               0
+#define APR_HAS_OS_UUID                     1
+#define APR_TCP_NOPUSH_FLAG                 TCP_NOPUSH
+#define APR_TCP_NODELAY_INHERITED           1
+#define APR_O_NONBLOCK_INHERITED            1
+#define APR_HAS_LARGE_FILES                 1
+
 #ifdef __cplusplus
 }
 #endif
 
 #endif /* ACR_ARCH_PRIVATE_H */
+

Modified: 
commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h?rev=801535&r1=801534&r2=801535&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h 
(original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/arch/unix/acr_arch.h 
Thu Aug  6 08:10:29 2009
@@ -38,19 +38,27 @@
 #define INVALID_HANDLE_VALUE ((void *)(ptrdiff_t)-1)
 #define IS_INVALID_HANDLE(h) (((h) == NULL || (h) == INVALID_HANDLE_VALUE))
 
-typedef struct acr_ioh {
-    ACR_SP_ALIGN(void *, h);
-    int          type;
-    unsigned int flags;
-} acr_ioh;
+typedef struct acr_ioh acr_ioh;
+typedef int (acr_ioh_cleanup_fn_t)(void *, int, unsigned int);
+
+struct acr_ioh {
+    void                 *h;
+    acr_ioh_cleanup_fn_t *c;
+    int                   type;
+    unsigned int          flags;
+};
 
 extern acr_ioh *acr_ioh_tab;
 extern int      acr_ioh_mask;
 extern int      acr_ioh_init(int);
 extern int      acr_ioh_alloc(void *, int, unsigned int);
+extern int      acr_ioh_open(void *, int, unsigned int, acr_ioh_cleanup_fn_t 
*);
 extern int      acr_ioh_free(int);
+extern int      acr_ioh_close(int);
 extern void     acr_ioh_cleanup(void);
 
+extern mode_t   ACR_UnixPermsToMode(int);
+
 /** Default number of IO slots
  */
 #define ACR_IOH_SLOTS       (64 * 1024)

Modified: 
commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h?rev=801535&r1=801534&r2=801535&view=diff
==============================================================================
--- 
commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h 
(original)
+++ 
commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch.h 
Thu Aug  6 08:10:29 2009
@@ -274,17 +274,23 @@
     size_t iov_len;   /* Number of bytes */
 };
 
-typedef struct acr_ioh {
-    ACR_SP_ALIGN(void *, h);
-    int          type;
-    unsigned int flags;
-} acr_ioh;
+typedef struct acr_ioh acr_ioh;
+typedef int (acr_ioh_cleanup_fn_t)(void *, int, unsigned int);
+
+struct acr_ioh {
+    void                 *h;
+    acr_ioh_cleanup_fn_t *c;
+    int                   type;
+    unsigned int          flags;
+};
 
 extern acr_ioh *acr_ioh_tab;
 extern int      acr_ioh_mask;
 extern int      acr_ioh_init(int);
 extern int      acr_ioh_alloc(void *, int, unsigned int);
+extern int      acr_ioh_open(void *, int, unsigned int, acr_ioh_cleanup_fn_t 
*);
 extern int      acr_ioh_free(int);
+extern int      acr_ioh_close(int);
 extern void     acr_ioh_cleanup(void);
 
 /** Default number of IO slots

Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/ios.c
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/ios.c?rev=801535&r1=801534&r2=801535&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/ios.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/ios.c Thu Aug  6 
08:10:29 2009
@@ -173,6 +173,12 @@
 
 int acr_ioh_alloc(void *h, int type, unsigned int flags)
 {
+    return acr_ioh_open(h, type, flags, NULL);
+}
+
+int acr_ioh_open(void *h, int type, unsigned int flags,
+                 acr_ioh_cleanup_fn_t *c)
+{
     int i, x, e;
 
     if (!__bitmap) {
@@ -185,6 +191,7 @@
         if (__bitmap[i] != 0xFF) {
             x = (i << 3) + __sbit_mask[__bitmap[i]];
             acr_ioh_tab[x].h     = h;
+            acr_ioh_tab[x].c     = c;
             acr_ioh_tab[x].type  = type;
             acr_ioh_tab[x].flags = flags;
             __SET_BMP(i, x);
@@ -197,6 +204,7 @@
         if (__bitmap[i] != 0xFF) {
             x = (i << 3) + __sbit_mask[__bitmap[i]];
             acr_ioh_tab[x].h     = h;
+            acr_ioh_tab[x].c     = c;
             acr_ioh_tab[x].type  = type;
             acr_ioh_tab[x].flags = flags;
             __SET_BMP(i, x);
@@ -214,6 +222,7 @@
         if (__bitmap[i] != 0xFF) {
             x = (i << 3) + __sbit_mask[__bitmap[i]];
             acr_ioh_tab[x].h     = h;
+            acr_ioh_tab[x].c     = c;
             acr_ioh_tab[x].type  = type;
             acr_ioh_tab[x].flags = flags;
             __SET_BMP(i, x);
@@ -230,12 +239,13 @@
 int acr_ioh_free(int i)
 {
     if (i < 0 || i >= acr_ioh_mask)
-        return ACR_EINVAL;
+        return ACR_EBADF;
     if (!__bitmap)
         return ACR_ENOMEM;
 
     pthread_mutex_lock(&ios_lock);
     acr_ioh_tab[i].h      = INVALID_HANDLE_VALUE;
+    acr_ioh_tab[i].c      = NULL;
     acr_ioh_tab[i].type   = ACR_DT_UNKNOWN;
     acr_ioh_tab[i].flags  = 0;
     __CLR_BIT(__bitmap, i);
@@ -244,6 +254,30 @@
     return 0;
 }
 
+int acr_ioh_close(int i)
+{
+    int rc = 0;
+
+    if (i < 0 || i >= acr_ioh_mask)
+        return ACR_EBADF;
+    if (!__bitmap)
+        return ACR_ENOMEM;
+    if (!IS_INVALID_HANDLE(acr_ioh_tab[i].h) && acr_ioh_tab[i].c) {
+        /* Run the cleanup */
+        rc = (*acr_ioh_tab[i].c)(acr_ioh_tab[i].h, acr_ioh_tab[i].type,
+                                 acr_ioh_tab[i].flags);
+    }
+    pthread_mutex_lock(&ios_lock);
+    acr_ioh_tab[i].h      = INVALID_HANDLE_VALUE;
+    acr_ioh_tab[i].c      = NULL;
+    acr_ioh_tab[i].type   = ACR_DT_UNKNOWN;
+    acr_ioh_tab[i].flags  = 0;
+    __CLR_BIT(__bitmap, i);
+
+    pthread_mutex_unlock(&ios_lock);
+    return rc;
+}
+
 void acr_ioh_cleanup()
 {
     int i;
@@ -252,9 +286,10 @@
         return;
     pthread_mutex_lock(&ios_lock);
     for (i = 0;  i < acr_ioh_mask; i++) {
-        if (!IS_INVALID_HANDLE(acr_ioh_tab[i].h)) {
-            /* TODO: Run the cleanup? */
-
+        if (!IS_INVALID_HANDLE(acr_ioh_tab[i].h) && acr_ioh_tab[i].c) {
+            /* Run the cleanups */
+            (*acr_ioh_tab[i].c)(acr_ioh_tab[i].h, acr_ioh_tab[i].type,
+                                acr_ioh_tab[i].flags);
         }
     }
     free(acr_ioh_tab);

Added: commons/sandbox/runtime/trunk/src/main/native/os/unix/pmutex.c
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/pmutex.c?rev=801535&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/pmutex.c (added)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/pmutex.c Thu Aug  6 
08:10:29 2009
@@ -0,0 +1,217 @@
+/* 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.
+ */
+
+#include "acr.h"
+#include "acr_private.h"
+#include "acr_arch.h"
+#include "acr_error.h"
+#include "acr_memory.h"
+#include "acr_string.h"
+#include "acr_descriptor.h"
+#include "acr_procmutex.h"
+
+#include <sys/ipc.h>
+#include <sys/sem.h>
+#include <sys/file.h>
+
+union semun {
+    int val;
+    struct semid_ds *buf;
+    unsigned short *array;
+};
+
+struct acr_pmutex_t {
+    int   filedes;
+    int   locked;
+    char *fname;
+};
+
+static int mutex_cleanup(void *mutex, int type, unsigned int flags)
+{
+    if (type != ACR_DT_MUTEX) {
+        acr_pmutex_t *m = (acr_pmutex_t *)mutex;
+        if (m->filedes > 0) {
+            union semun ick;
+            ick.val = 0;
+            semctl(m->filedes, 0, IPC_RMID, ick);
+        }
+        free(m->fname);
+        free(m);
+        return ACR_SUCCESS;
+    }
+    return ACR_EINVAL;
+}
+
+ACR_DECLARE(int) ACR_ProcMutexCreate(JNIEnv *_E, const acr_pchar_t *fname)
+{
+    union semun ick;
+    int rc = 0;
+    acr_pmutex_t *m;   
+
+    m = ACR_Calloc(_E, THROW_FMARK, sizeof(acr_pmutex_t));
+    if (!m)
+        return -1;
+    m->fname = ACR_StrdupA(_E, THROW_FMARK, fname);
+    if (!m->fname) {
+        rc =  ACR_GET_OS_ERROR();
+        free(m);
+        ACR_SET_OS_ERROR(rc);
+        return -1;
+    }
+
+    m->filedes = semget(IPC_PRIVATE, 1, IPC_CREAT | 0600);
+
+    if (m->filedes < 0) {
+        rc =  ACR_GET_OS_ERROR();
+        goto cleanup;
+    }
+    ick.val = 1;
+    if (semctl(m->filedes, 0, SETVAL, ick) < 0) {
+        rc =  ACR_GET_OS_ERROR();
+        goto cleanup;
+    }
+    m->locked = 0;
+
+cleanup:
+    if (rc) {
+        if (m->filedes > 0) {
+            ick.val = 0;
+            semctl(m->filedes, 0, IPC_RMID, ick);
+        }
+        free(m->fname);
+        free(m);
+        if (!IS_INVALID_HANDLE(_E)) {
+            if (rc == EACCES)
+                ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESECURITY, 0);
+            else
+                ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO, rc);
+        }
+        ACR_SET_OS_ERROR(rc);
+        return -1;
+    }
+    else {
+        rc = acr_ioh_open(m, ACR_DT_MUTEX, 0, mutex_cleanup);
+        return rc;
+    }
+}
+
+ACR_DECLARE(int) ACR_ProcMutexLock(JNIEnv *_E, int mutex)
+{
+    int rc;
+    struct sembuf op;
+    acr_pmutex_t *m = (acr_pmutex_t *)ACR_IOH(mutex);
+
+    if (IS_INVALID_HANDLE(m) || ACR_IOH_TYPE(mutex) != ACR_DT_MUTEX) {
+        ACR_SET_OS_ERROR(ACR_EINVAL);
+        return -1;
+    }        
+    op.sem_num = 0;
+    op.sem_op  = -1;
+    op.sem_flg = SEM_UNDO;
+
+    do {
+        rc = semop(m->filedes, &op, 1);
+    } while (rc < 0 && errno == EINTR);
+
+    if (rc < 0)
+        return ACR_GET_OS_ERROR();
+    m->locked = 1;
+
+    return ACR_SUCCESS;
+}
+
+ACR_DECLARE(int) ACR_ProcMutexTryLock(JNIEnv *_E, int mutex)
+{
+    int rc;
+    struct sembuf op;
+    acr_pmutex_t *m = (acr_pmutex_t *)ACR_IOH(mutex);
+
+    if (IS_INVALID_HANDLE(m) || ACR_IOH_TYPE(mutex) != ACR_DT_MUTEX) {
+        return ACR_EINVAL;
+    }        
+    op.sem_num = 0;
+    op.sem_op  = -1;
+    op.sem_flg = SEM_UNDO | IPC_NOWAIT;
+
+    do {
+        rc = semop(m->filedes, &op, 1);
+    } while (rc < 0 && errno == EINTR);
+
+    if (rc < 0) {
+        if (errno == EAGAIN) {
+            return ACR_EBUSY;
+        }
+    }
+    else
+        m->locked = 1;
+
+    return ACR_SUCCESS;;
+}
+
+ACR_DECLARE(int) ACR_ProcMutexRelease(JNIEnv *_E, int mutex)
+{
+    int rc;
+    struct sembuf op;
+    acr_pmutex_t *m = (acr_pmutex_t *)ACR_IOH(mutex);
+
+    if (IS_INVALID_HANDLE(m) || ACR_IOH_TYPE(mutex) != ACR_DT_MUTEX) {
+        return ACR_EINVAL;
+    }        
+
+    m->locked  = 0;
+    op.sem_num = 0;
+    op.sem_op  = 1;
+    op.sem_flg = SEM_UNDO;
+    do {
+        rc = semop(m->filedes, &op, 1);
+    } while (rc < 0 && errno == EINTR);
+
+    if (rc < 0)
+        return ACR_GET_OS_ERROR();
+    else
+        return ACR_SUCCESS;
+}
+
+ACR_DECLARE(int) ACR_ProcMutexPermSet(JNIEnv *_E, int mutex, int perms,
+                                      acr_uid_t uid, acr_uid_t gid)
+{
+    union  semun ick;
+    struct semid_ds buf;
+    acr_pmutex_t *m = (acr_pmutex_t *)ACR_IOH(mutex);
+
+    if (IS_INVALID_HANDLE(m) || ACR_IOH_TYPE(mutex) != ACR_DT_MUTEX) {
+        return ACR_EINVAL;
+    }        
+    buf.sem_perm.uid  = uid;
+    buf.sem_perm.gid  = gid;
+    buf.sem_perm.mode = ACR_UnixPermsToMode(perms);
+    ick.buf = &buf;
+
+    if (semctl(m->filedes, 0, IPC_SET, ick) < 0) {
+        return ACR_GET_OS_ERROR();
+    }
+    else
+        return ACR_SUCCESS;
+}
+
+ACR_DECLARE(int) ACR_ProcMutexClose(JNIEnv *_E, int mutex)
+{
+
+    /* Close will call the cleanup function
+     */
+    return acr_ioh_close(mutex);
+}
+

Propchange: commons/sandbox/runtime/trunk/src/main/native/os/unix/pmutex.c
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 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/shm.c?rev=801535&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/shm.c (added)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/shm.c Thu Aug  6 
08:10:29 2009
@@ -0,0 +1,475 @@
+/* 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.
+ */
+
+#include "acr.h"
+#include "acr_private.h"
+#include "acr_arch.h"
+#include "acr_error.h"
+#include "acr_memory.h"
+#include "acr_string.h"
+#include "acr_descriptor.h"
+#include "acr_shm.h"
+
+#include <sys/mman.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/file.h>
+
+#if !defined(SHM_R)
+#define SHM_R 0400
+#endif
+#if !defined(SHM_W)
+#define SHM_W 0200
+#endif
+
+#define ACR_SHM_OWNER   0
+#define ACR_SHM_CHILD   1
+
+struct acr_shm_t {
+    void       *base;           /* base real address */
+    void       *usable;         /* base usable address */
+    acr_size_t  reqsize;        /* requested segment size */
+    acr_size_t  realsize;       /* actual segment size */
+    const char *filename;       /* NULL if anonymous */
+    int         shmid;          /* shmem ID returned from shmget() */
+    key_t       shmkey;
+};
+
+static int shm_owner_cleanup(void *shm, int type, unsigned int flags)
+{
+    int rc = 0;
+    acr_shm_t *m = (acr_shm_t *)shm;
+
+    if (type != ACR_DT_SHM) {
+        return ACR_EINVAL;
+    }
+    /* anonymous shared memory */
+    if (m->filename == NULL) {
+        if (munmap(m->base, m->realsize) == -1) {
+            rc = ACR_GET_OS_ERROR();
+        }
+    }
+    /* name-based shared memory */
+    else {
+        /* Indicate that the segment is to be destroyed as soon
+         * as all processes have detached. This also disallows any
+         * new attachments to the segment.
+         */
+        if (shmctl(m->shmid, IPC_RMID, NULL) == -1 && errno != EINVAL) {
+            rc = ACR_GET_OS_ERROR();
+            goto cleanup;
+        }
+        if (shmdt(m->base) == -1) {
+            rc = ACR_GET_OS_ERROR();
+            goto cleanup;
+        }
+        if (access(m->filename, F_OK)) {
+            rc = ACR_SUCCESS;
+        }
+        else {
+            if (unlink(m->filename))
+                rc = ACR_GET_OS_ERROR();
+        }
+    }
+cleanup:
+    if (m->filename)
+        free((void *)(m->filename));
+    free(m);
+    return rc;
+}
+
+static int shm_child_cleanup(void *shm, int type, unsigned int flags)
+{
+    int rc = 0;
+    acr_shm_t *m = (acr_shm_t *)shm;
+
+    if (type != ACR_DT_SHM) {
+        return ACR_EINVAL;
+    }
+
+    if (m->filename == NULL) {
+        /* It doesn't make sense to detach from an
+         * anonymous memory segment.
+         */
+        rc = ACR_EINVAL;
+    }
+    else {
+        if (shmdt(m->base) == -1) {
+            rc = ACR_GET_OS_ERROR();
+        }
+    }
+    if (m->filename)
+        free((void *)(m->filename));
+    free(m);
+    return rc;
+}
+
+ACR_DECLARE(int) ACR_ShmDestroy(JNIEnv *_E, int shm)
+{
+    int rv;
+
+    rv = acr_ioh_close(shm);
+    if (rv  && !IS_INVALID_HANDLE(_E)) {
+        if (rv == EACCES)
+            ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESECURITY, 0);
+        else
+            ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO, rv);
+    }
+    return rv;
+}
+
+ACR_DECLARE(int) ACR_ShmDetach(JNIEnv *_E, int shm)
+{
+    int rv;
+
+    rv = acr_ioh_close(shm);
+    if (rv  && !IS_INVALID_HANDLE(_E)) {
+        if (rv == EACCES)
+            ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESECURITY, 0);
+        else
+            ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO, rv);
+    }
+    return rv;
+}
+
+ACR_DECLARE(int) ACR_ShmClose(JNIEnv *_E, int shm)
+{
+    int rv;
+
+    rv = acr_ioh_close(shm);
+    if (rv  && !IS_INVALID_HANDLE(_E)) {
+        if (rv == EACCES)
+            ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESECURITY, 0);
+        else
+            ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO, rv);
+    }
+    return rv;
+}
+
+ACR_DECLARE(int) ACR_ShmRemove(JNIEnv *_E, const acr_pchar_t *filename)
+{
+    int     rc = 0;
+    int     file;
+    key_t   shmkey;
+    int     shmid;
+
+    /* Presume that the file already exists; just open for writing.
+     * Mode is not needed cause we don't use O_CREAT flag.
+     */
+    file = open(filename, O_WRONLY);
+    if (file < 0) {
+        rc = ACR_GET_OS_ERROR();
+        goto cleanup;
+    }
+
+    /* ftok() (on solaris at least) requires that the file actually
+     * exist before calling ftok().
+     */
+    shmkey = ftok(filename, 1);
+    if (shmkey == (key_t)-1) {
+        rc = ACR_GET_OS_ERROR();
+        close(file);
+        goto cleanup;
+    }
+    close(file);
+
+    if ((shmid = shmget(shmkey, 0, SHM_R | SHM_W)) < 0) {
+        rc = ACR_GET_OS_ERROR();
+        goto cleanup;
+    }
+
+    /* Indicate that the segment is to be destroyed as soon
+     * as all processes have detached. This also disallows any
+     * new attachments to the segment.
+     */
+    if (shmctl(shmid, IPC_RMID, NULL) == -1) {
+        rc = ACR_GET_OS_ERROR();
+        goto cleanup;
+    }
+
+cleanup:
+    unlink(filename);
+    if (rc  && !IS_INVALID_HANDLE(_E)) {
+        if (rc == EACCES)
+            ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESECURITY, 0);
+        else
+            ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO, rc);
+    }
+    return rc;
+}
+
+ACR_DECLARE(int) ACR_ShmCreate(JNIEnv *_E, acr_size_t reqsize,
+                               const acr_pchar_t *filename)
+{
+    acr_shm_t *shm = NULL;
+    struct shmid_ds shmbuf;
+    int         file;   /* file where metadata is stored */
+    int         rc;
+    acr_size_t  nbytes;
+
+    shm = ACR_Calloc(_E, THROW_FMARK, sizeof(acr_shm_t));
+    if (!shm)
+        return -1;
+    /* Check if they want anonymous or name-based shared memory */
+    if (filename == NULL) {
+        shm->filename = NULL;    
+        shm->reqsize  = 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);
+        if (shm->base == (void *)MAP_FAILED) {
+            rc =  ACR_GET_OS_ERROR();
+            free(shm);
+            if (!IS_INVALID_HANDLE(_E)) {
+                if (rc == EACCES)
+                    ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESECURITY, 0);
+                else
+                    ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO, rc);
+            }
+            ACR_SET_OS_ERROR(rc);
+            return -1;
+        }
+
+        /* store the real size in the metadata */
+        *(acr_size_t*)(shm->base) = shm->realsize;
+        /* metadata isn't usable */
+        shm->usable = (char *)shm->base + 
ACR_ALIGN_DEFAULT(sizeof(acr_size_t));
+    }
+    /* Name-based shared memory */
+    else {
+        shm->reqsize  = reqsize;
+        shm->filename = ACR_StrdupA(_E, THROW_FMARK, filename);
+        if (!shm->filename) {
+            rc =  ACR_GET_OS_ERROR();
+            free(shm);
+            ACR_SET_OS_ERROR(rc);
+            return -1;
+        }
+
+        shm->realsize = reqsize;
+
+        /* FIXME: APR_OS_DEFAULT is too permissive, switch to 600 I think.
+         * Unlike APR we use 0660 which is less permissive
+         */
+        file = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0660);
+        if (file < 0) {
+            rc = ACR_GET_OS_ERROR();
+            goto cleanup;
+        }
+
+        /* ftok() (on solaris at least) requires that the file actually
+         * exist before calling ftok(). */
+        shm->shmkey = ftok(filename, 1);
+        if (shm->shmkey == (key_t)-1) {
+            rc = ACR_GET_OS_ERROR();
+            goto cleanup;
+        }
+
+        if ((shm->shmid = shmget(shm->shmkey, shm->realsize,
+                                 SHM_R | SHM_W | IPC_CREAT | IPC_EXCL)) < 0) {
+            rc = ACR_GET_OS_ERROR();
+            goto cleanup;
+        }
+
+        if ((shm->base = shmat(shm->shmid, NULL, 0)) == (void *)-1) {
+            rc = ACR_GET_OS_ERROR();
+            goto cleanup;
+        }
+        shm->usable = shm->base;
+
+        if (shmctl(shm->shmid, IPC_STAT, &shmbuf) == -1) {
+            rc = ACR_GET_OS_ERROR();
+            goto cleanup;
+        }
+        shmbuf.shm_perm.uid = getuid();
+        shmbuf.shm_perm.gid = getgid();
+        if (shmctl(shm->shmid, IPC_SET, &shmbuf) == -1) {
+            rc = ACR_GET_OS_ERROR();
+            goto cleanup;
+        }
+
+        nbytes = sizeof(reqsize);
+        do {
+            rc = write(file,(const void *)&reqsize, nbytes);
+        } while (rc == (acr_size_t)-1 && errno == EINTR);
+        if (rc == -1) {
+            rc = ACR_GET_OS_ERROR();
+            goto cleanup;            
+        }
+cleanup:
+        if (file > 0)
+            rc = close(file);
+        if (rc) {
+            free((void *)(shm->filename));
+            free(shm);
+            if (!IS_INVALID_HANDLE(_E)) {
+                if (rc == EACCES)
+                    ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESECURITY, 0);
+                else
+                    ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO, rc);
+            }
+            ACR_SET_OS_ERROR(rc);
+            shm = NULL;
+        }
+    }
+    if (shm) {
+        rc = acr_ioh_open(shm, ACR_DT_SHM, ACR_SHM_OWNER, shm_owner_cleanup);
+        return rc;
+    }
+    else
+        return -1;
+}
+
+ACR_DECLARE(int) ACR_ShmAttach(JNIEnv *_E,
+                               const acr_pchar_t *filename)
+{
+    acr_shm_t *shm = NULL;
+    int         file;   /* file where metadata is stored */
+    int         rc;
+    acr_size_t  nbytes;
+
+    if (!filename) {
+        ACR_SET_OS_ERROR(ACR_EINVAL);
+        return -1;
+    }
+    shm = ACR_Calloc(_E, THROW_FMARK, sizeof(acr_shm_t));
+    if (!shm)
+        return -1;
+    shm->filename = ACR_StrdupA(_E, THROW_FMARK, filename);
+    if (!shm->filename) {
+        rc =  ACR_GET_OS_ERROR();
+        free(shm);
+        ACR_SET_OS_ERROR(rc);
+        return -1;
+    }
+
+    file = open(filename, O_RDONLY);
+    if (file < 0) {
+        rc = ACR_GET_OS_ERROR();
+        goto cleanup;
+    }
+
+    nbytes = sizeof(shm->reqsize);
+
+    do {
+        rc = read(file, (void *)&(shm->reqsize), nbytes);
+    } while (rc == -1 && errno == EINTR);
+    if (rc != nbytes) {
+        /* Wrong format */
+        rc = EBADF;
+        close(file);
+        goto cleanup;
+    }
+    rc = close(file);
+    if (rc) {
+        goto cleanup;
+    }
+
+    shm->shmkey = ftok(filename, 1);
+    if (shm->shmkey == (key_t)-1) {
+        rc = ACR_GET_OS_ERROR();
+        goto cleanup;
+    }
+    if ((shm->shmid = shmget(shm->shmkey, 0, SHM_R | SHM_W)) == -1) {
+        rc = ACR_GET_OS_ERROR();
+        goto cleanup;
+    }
+    if ((shm->base = shmat(shm->shmid, NULL, 0)) == (void *)-1) {
+        rc = ACR_GET_OS_ERROR();
+        goto cleanup;
+    }
+    shm->usable   = shm->base;
+    shm->realsize = shm->reqsize;
+
+cleanup:
+    if (rc) {
+        free((void *)(shm->filename));
+        free(shm);
+        if (!IS_INVALID_HANDLE(_E)) {
+            if (rc == EACCES)
+                ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESECURITY, 0);
+            else
+                ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO, rc);
+        }
+        ACR_SET_OS_ERROR(rc);
+        shm = NULL;
+    }
+    if (shm) {
+        rc = acr_ioh_open(shm, ACR_DT_SHM, ACR_SHM_CHILD, shm_child_cleanup);
+        return rc;
+    }
+    else
+        return -1;
+}
+
+ACR_DECLARE(int) ACR_ShmPermSet(JNIEnv *_E, int shm, int perms,
+                                acr_uid_t uid, acr_uid_t gid)
+{
+    int rc = 0;
+    struct shmid_ds shmbuf;
+    int shmid;
+    acr_shm_t *m = (acr_shm_t *)ACR_IOH(shm);
+
+    if (IS_INVALID_HANDLE(m) || ACR_IOH_TYPE(shm) != ACR_DT_SHM) {
+        rc = ACR_EINVAL;
+        goto cleanup;
+    }        
+    if ((shmid = shmget(m->shmkey, 0, SHM_R | SHM_W)) == -1) {
+        rc = ACR_GET_OS_ERROR();
+        goto cleanup;
+    }
+    shmbuf.shm_perm.uid  = uid;
+    shmbuf.shm_perm.gid  = gid;
+    shmbuf.shm_perm.mode = ACR_UnixPermsToMode(perms);
+    if (shmctl(shmid, IPC_SET, &shmbuf) == -1) {
+        rc = ACR_GET_OS_ERROR();
+        goto cleanup;
+    }
+
+cleanup:
+    if (rc && !IS_INVALID_HANDLE(_E)) {
+        if (rc == EACCES)
+            ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESECURITY, 0);
+        else
+            ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO, rc);
+    }
+    return rc;
+}
+
+ACR_DECLARE(void *) ACR_ShmGetBaseAddr(int shm)
+{
+    acr_shm_t *m = (acr_shm_t *)ACR_IOH(shm);
+
+    if (IS_INVALID_HANDLE(m) || ACR_IOH_TYPE(shm) != ACR_DT_SHM) {
+        ACR_SET_OS_ERROR(ACR_EINVAL);
+        return NULL;
+    }
+    else
+        return m->usable;
+}
+
+ACR_DECLARE(acr_size_t) ACR_ShmGetSize(int shm)
+{
+    acr_shm_t *m = (acr_shm_t *)ACR_IOH(shm);
+    if (IS_INVALID_HANDLE(m) || ACR_IOH_TYPE(shm) != ACR_DT_SHM) {
+        ACR_SET_OS_ERROR(ACR_EINVAL);
+        return 0;
+    }
+    else
+        return m->reqsize;
+}
+

Propchange: commons/sandbox/runtime/trunk/src/main/native/os/unix/shm.c
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/ios.c
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/ios.c?rev=801535&r1=801534&r2=801535&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/ios.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/ios.c Thu Aug  6 
08:10:29 2009
@@ -150,6 +150,12 @@
 
 int acr_ioh_alloc(void *h, int type, unsigned int flags)
 {
+    return acr_ioh_open(h, type, flags, NULL);
+}
+
+int acr_ioh_open(void *h, int type, unsigned int flags,
+                 acr_ioh_cleanup_fn_t *c)
+{
     int i, x, e;
 
     if (!__bitmap) {
@@ -162,6 +168,7 @@
         if (__bitmap[i] != 0xFF) {
             x = (i << 3) + __sbit_mask[__bitmap[i]];
             acr_ioh_tab[x].h     = h;
+            acr_ioh_tab[x].c     = c;
             acr_ioh_tab[x].type  = type;
             acr_ioh_tab[x].flags = flags;
             __SET_BMP(i, x);
@@ -174,6 +181,7 @@
         if (__bitmap[i] != 0xFF) {
             x = (i << 3) + __sbit_mask[__bitmap[i]];
             acr_ioh_tab[x].h     = h;
+            acr_ioh_tab[x].c     = c;
             acr_ioh_tab[x].type  = type;
             acr_ioh_tab[x].flags = flags;
             __SET_BMP(i, x);
@@ -191,6 +199,7 @@
         if (__bitmap[i] != 0xFF) {
             x = (i << 3) + __sbit_mask[__bitmap[i]];
             acr_ioh_tab[x].h     = h;
+            acr_ioh_tab[x].c     = c;
             acr_ioh_tab[x].type  = type;
             acr_ioh_tab[x].flags = flags;
             __SET_BMP(i, x);
@@ -207,12 +216,13 @@
 int acr_ioh_free(int i)
 {
     if (i < 0 || i >= acr_ioh_mask)
-        return ACR_EINVAL;
+        return ACR_EBADF;
     if (!__bitmap)
         return ACR_ENOMEM;
 
     EnterCriticalSection(&ios_lock);
     acr_ioh_tab[i].h      = INVALID_HANDLE_VALUE;
+    acr_ioh_tab[i].c      = NULL;
     acr_ioh_tab[i].type   = ACR_DT_UNKNOWN;
     acr_ioh_tab[i].flags  = 0;
     __CLR_BIT(__bitmap, i);
@@ -221,6 +231,30 @@
     return 0;
 }
 
+int acr_ioh_close(int i)
+{
+    int rc = 0;
+
+    if (i < 0 || i >= acr_ioh_mask)
+        return ACR_EBADF;
+    if (!__bitmap)
+        return ACR_ENOMEM;
+    if (!IS_INVALID_HANDLE(acr_ioh_tab[i].h) && acr_ioh_tab[i].c) {
+        /* Run the cleanup */
+        rc = (*acr_ioh_tab[i].c)(acr_ioh_tab[i].h, acr_ioh_tab[i].type,
+                                 acr_ioh_tab[i].flags);
+    }
+    EnterCriticalSection(&ios_lock);
+    acr_ioh_tab[i].h      = INVALID_HANDLE_VALUE;
+    acr_ioh_tab[i].c      = NULL;
+    acr_ioh_tab[i].type   = ACR_DT_UNKNOWN;
+    acr_ioh_tab[i].flags  = 0;
+    __CLR_BIT(__bitmap, i);
+    LeaveCriticalSection(&ios_lock);
+
+    return rc;
+}
+
 void acr_ioh_cleanup()
 {
     int i;
@@ -229,9 +263,10 @@
         return;
     EnterCriticalSection(&ios_lock);
     for (i = 0;  i < acr_ioh_mask; i++) {
-        if (acr_ioh_tab[i].h) {
-            /* TODO: Run the cleanup */
-
+        if (!IS_INVALID_HANDLE(acr_ioh_tab[i].h) && acr_ioh_tab[i].c) {
+            /* Run the cleanups */
+            (*acr_ioh_tab[i].c)(acr_ioh_tab[i].h, acr_ioh_tab[i].type,
+                                acr_ioh_tab[i].flags);
         }
     }
     free(acr_ioh_tab);

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=801535&r1=801534&r2=801535&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/test/testcase.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/test/testcase.c Thu Aug  6 
08:10:29 2009
@@ -28,6 +28,7 @@
 #include "acr_descriptor.h"
 #include "acr_file.h"
 #include "acr_xdr.h"
+#include "acr_shm.h"
 
 #if defined (WIN32)
 #include <io.h>
@@ -637,3 +638,40 @@
     return r;
 }
 
+ACR_JNI_EXPORT_DECLARE(jint, TestPrivate, test060)(ACR_JNISTDARGS, jint d)
+{
+
+    return ACR_ShmCreate(_E, d, NULL);
+}
+
+ACR_JNI_EXPORT_DECLARE(jint, TestPrivate, test061)(ACR_JNISTDARGS, jint d)
+{
+
+    return ACR_ShmCreate(_E, d, "shared");
+}
+
+ACR_JNI_EXPORT_DECLARE(jint, TestPrivate, test062)(ACR_JNISTDARGS, jint s)
+{
+    return ACR_ShmDestroy(_E, s);
+}
+
+ACR_JNI_EXPORT_DECLARE(jint, TestPrivate, test063)(ACR_JNISTDARGS, jint d)
+{
+    return ACR_ShmRemove(_E, "shared");
+}
+
+ACR_JNI_EXPORT_DECLARE(jint, TestPrivate, test064)(ACR_JNISTDARGS, jint d)
+{
+    return ACR_ShmAttach(_E, "shared");
+}
+
+ACR_JNI_EXPORT_DECLARE(jint, TestPrivate, test065)(ACR_JNISTDARGS, jint s)
+{
+    return ACR_ShmDetach(_E, s);
+}
+
+ACR_JNI_EXPORT_DECLARE(jint, TestPrivate, test066)(ACR_JNISTDARGS, jint s)
+{
+    return ACR_ShmGetSize(s);
+}
+

Modified: 
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java
URL: 
http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java?rev=801535&r1=801534&r2=801535&view=diff
==============================================================================
--- 
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java
 (original)
+++ 
commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java
 Thu Aug  6 08:10:29 2009
@@ -104,6 +104,14 @@
     private static native int   test050(int i);
     private static native int   test051(int i);
 
+    private static native int      test060(int l);
+    private static native int      test061(int l);
+    private static native int      test062(int s);
+    private static native int      test063(int d);
+    private static native int      test064(int l);
+    private static native int      test065(int s);
+    private static native int      test066(int s);
+
     private static native String test100(String s);
 
 
@@ -890,5 +898,53 @@
         assertEquals("Result", 0.0, test044(23456789.5678));
     }
 
+    public void testShmCreate()
+        throws Throwable
+    {
+        try {
+            // Remove any previous shared memory
+            test063(0);
+        } catch (Throwable e) {
+            // Ignore
+        }
+        int sa = test061(1024);
+        assertTrue("Shared memory", sa > 0);
+
+        try {
+            // Second invocation must throw exists.
+            int sb = test061(1024);
+            fail("Exception not thrown");
+        } catch (Throwable e) {
+            // Ignore
+        }
+        assertEquals("Shared memory size", 1024, test066(sa));
+
+        int rv = test062(sa);
+        assertEquals("Destroy Shared memory", 0, rv);
+    }
+
+    public void testShmAttach()
+        throws Throwable
+    {
+        int rv;
+        try {
+            // Remove any previous shared memory
+            test063(0);
+        } catch (Throwable e) {
+            // Ignore
+        }
+        int sa = test061(1024);
+        assertTrue("Shared memory", sa > 0);
+
+        int sb = test064(0);
+        assertTrue("Shared memory", sb > 0);
+
+        assertEquals("Shared memory size", 1024, test066(sb));
+        rv = test062(sa);
+        assertEquals("Destroy Shared memory", 0, rv);
+        rv = test065(sb);
+        assertEquals("Destroy Attached memory", 0, rv);
+    }
+
 }
 


Reply via email to