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 17:41:26 UTC

svn commit: r806220 - in /commons/sandbox/runtime/trunk/src/main/native: Makefile.in Makefile.msc.in include/acr_error.h include/acr_semaphore.h os/unix/psema.c os/unix/pshm.c os/win32/psema.c shared/sema.c

Author: mturk
Date: Thu Aug 20 15:41:26 2009
New Revision: 806220

URL: http://svn.apache.org/viewvc?rev=806220&view=rev
Log:
initial semaphore wrapper API

Added:
    commons/sandbox/runtime/trunk/src/main/native/shared/sema.c   (with props)
Modified:
    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_error.h
    commons/sandbox/runtime/trunk/src/main/native/include/acr_semaphore.h
    commons/sandbox/runtime/trunk/src/main/native/os/unix/psema.c
    commons/sandbox/runtime/trunk/src/main/native/os/unix/pshm.c
    commons/sandbox/runtime/trunk/src/main/native/os/win32/psema.c

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=806220&r1=806219&r2=806220&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/Makefile.in (original)
+++ commons/sandbox/runtime/trunk/src/main/native/Makefile.in Thu Aug 20 15:41:26 2009
@@ -97,6 +97,7 @@
 	$(SRCDIR)/shared/sha1.$(OBJ) \
 	$(SRCDIR)/shared/sha2.$(OBJ) \
 	$(SRCDIR)/shared/sbuf.$(OBJ) \
+	$(SRCDIR)/shared/sema.$(OBJ) \
 	$(SRCDIR)/shared/shm.$(OBJ) \
 	$(SRCDIR)/shared/string.$(OBJ) \
 	$(SRCDIR)/shared/tables.$(OBJ) \

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=806220&r1=806219&r2=806220&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 15:41:26 2009
@@ -88,6 +88,7 @@
 	$(SRCDIR)/shared/sha1.$(OBJ) \
 	$(SRCDIR)/shared/sha2.$(OBJ) \
 	$(SRCDIR)/shared/sbuf.$(OBJ) \
+	$(SRCDIR)/shared/sema.$(OBJ) \
 	$(SRCDIR)/shared/shm.$(OBJ) \
 	$(SRCDIR)/shared/string.$(OBJ) \
 	$(SRCDIR)/shared/tables.$(OBJ) \

Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h?rev=806220&r1=806219&r2=806220&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_error.h Thu Aug 20 15:41:26 2009
@@ -137,6 +137,12 @@
         ACR_SET_OS_ERROR((S));                                              \
     } else _E = _E
 
+#define ACR_THROW_EX_IF_ERR(X, S)                                           \
+    if ((S) && IS_VALID_HANDLE(_E)) {                                       \
+        ACR_ThrowException(_E, THROW_NMARK, (X), (S));                      \
+        ACR_SET_OS_ERROR((S));                                              \
+    } else _E = _E
+
 #define ACR_THROW_IO_ERRNO()                                                \
     if (IS_VALID_HANDLE(_E)) {                                              \
         int _se = ACR_GET_OS_ERROR();                                       \

Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_semaphore.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_semaphore.h?rev=806220&r1=806219&r2=806220&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/acr_semaphore.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/acr_semaphore.h Thu Aug 20 15:41:26 2009
@@ -97,6 +97,24 @@
  */
 ACR_DECLARE(int) ACR_SemaphoreRemove(JNIEnv *env, const acr_pchar_t *name);
 
+/**
+ * Create and initialize a semaphore that can be used to synchronize processes.
+ * @param env JNI environment to use.
+ * @param name A name to use for the semaphore.
+ * @param value Initial semaphore value.
+ */
+ACR_DECLARE(jobject) ACR_SemaphoreObjectCreate(JNIEnv *env,
+                                               const acr_pchar_t *name,
+                                               int value);
+
+/**
+ * Re-open a semaphore in child process.
+ * @param env JNI environment to use.
+ * @param name A name of the semaphore to open.
+ */
+ACR_DECLARE(jobject) ACR_SemaphoreObjectAttach(JNIEnv *env,
+                                               const acr_pchar_t *name);
+
 #ifdef __cplusplus
 }
 #endif

Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/psema.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/psema.c?rev=806220&r1=806219&r2=806220&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/psema.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/psema.c Thu Aug 20 15:41:26 2009
@@ -289,3 +289,111 @@
     ACR_UnloadClass(_E, &_clazzn);
 }
 
+static int sem_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_SemaphoreObjectCreate(JNIEnv *_E,
+                                               const acr_pchar_t *name,
+                                               int value)
+{
+    jobject semo;
+    jobject semd;
+    int     isem;
+
+    isem = ACR_SemaphoreCreate(_E, name, value);
+    if (isem < 0) {
+
+        return NULL;
+    }
+    /* Create Descriptor Object */
+    semd = ACR_DescriptorCreate(_E, ACR_DT_SEMAPHORE, isem, NULL,
+                                sem_descriptor_cleanup);
+    if (!semd) {
+
+        return NULL;
+    }
+    semo = (*_E)->NewObject(_E, _clazzn.i, J4MID(0000), semd);
+    return semo;
+}
+
+ACR_DECLARE(jobject) ACR_SemaphoreObjectAttach(JNIEnv *_E,
+                                               const acr_pchar_t *name)
+{
+    jobject semo;
+    jobject semd;
+    int     isem;
+
+    isem = ACR_SemaphoreAttach(_E, name);
+    if (isem < 0) {
+
+        return NULL;
+    }
+    /* Create Descriptor Object */
+    semd = ACR_DescriptorCreate(_E, ACR_DT_SEMAPHORE, isem, NULL,
+                                sem_descriptor_cleanup);
+    if (!semd) {
+
+        return NULL;
+    }
+    semo = (*_E)->NewObject(_E, _clazzn.i, J4MID(0000), semd);
+    return semo;
+}
+
+ACR_JNI_EXPORT_DECLARE(jobject, Semaphore, create1)(ACR_JNISTDARGS,
+                                                    jstring name,
+                                                    jint value)
+{
+
+    jobject semo = NULL;
+    UNREFERENCED_O;
+
+    WITH_CSTR(name) {
+        semo = ACR_SemaphoreObjectCreate(_E, J2S(name), value);
+    } END_WITH_CSTR(name);
+
+    return semo;
+}
+
+ACR_JNI_EXPORT_DECLARE(jobject, Semaphore, create2)(ACR_JNISTDARGS,
+                                                    jstring name)
+{
+
+    jobject semo = NULL;
+    UNREFERENCED_O;
+
+    WITH_CSTR(name) {
+        semo = ACR_SemaphoreObjectAttach(_E, J2S(name));
+    } END_WITH_CSTR(name);
+
+    return semo;
+}
+
+ACR_JNI_EXPORT_DECLARE(jint, Semaphore, remove0)(ACR_JNISTDARGS,
+                                                 jstring name)
+{
+
+    int rc = ACR_SUCCESS;
+    UNREFERENCED_O;
+
+    WITH_CSTR(name) {
+        rc = ACR_SemaphoreRemove(_E, J2S(name));
+    } END_WITH_CSTR(name);
+    return rc;
+}
+

Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/pshm.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/pshm.c?rev=806220&r1=806219&r2=806220&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/unix/pshm.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/unix/pshm.c Thu Aug 20 15:41:26 2009
@@ -195,12 +195,7 @@
 
 finally:
     unlink(filename);
-    if (rc  && IS_VALID_HANDLE(_E)) {
-        if (ACR_STATUS_IS_EACCES(rc))
-            ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESECURITY, 0);
-        else
-            ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO, rc);
-    }
+    ACR_THROW_IO_IF_ERR(rc);
     return rc;
 }
 
@@ -216,10 +211,7 @@
 
     if (reqsize > ACR_SIZE_T_MAX) {
         /* Guard against insane sizes */
-        if (IS_VALID_HANDLE(_E)) {
-            ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EINVAL, 0);
-        }
-        ACR_SET_OS_ERROR(ACR_EINVAL);
+        ACR_THROW_EX_IF_ERR(ACR_EX_EINVAL, ACR_EINVAL);
         return -1;
     }
     shm = ACR_Calloc(_E, THROW_FMARK, sizeof(acr_shm_t));
@@ -236,13 +228,7 @@
         if (shm->base == (void *)MAP_FAILED) {
             rc =  ACR_GET_OS_ERROR();
             free(shm);
-            if (IS_VALID_HANDLE(_E)) {
-                if (ACR_STATUS_IS_EACCES(rc))
-                    ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESECURITY, 0);
-                else
-                    ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO, rc);
-            }
-            ACR_SET_OS_ERROR(rc);
+            ACR_THROW_IO_IF_ERR(rc);
             return -1;
         }
 
@@ -322,10 +308,7 @@
         if (rc) {
             free((void *)(shm->filename));
             free(shm);
-            if (IS_VALID_HANDLE(_E)) {
-                ACR_THROW_EIO(rc);
-            }
-            ACR_SET_OS_ERROR(rc);
+            ACR_THROW_IO_IF_ERR(rc);
             shm = NULL;
         }
     }
@@ -347,7 +330,7 @@
     acr_size_t  nbytes;
 
     if (!filename) {
-        ACR_SET_OS_ERROR(ACR_EINVAL);
+        ACR_THROW_IO_IF_ERR(ACR_EINVAL);
         return -1;
     }
     shm = ACR_Calloc(_E, THROW_FMARK, sizeof(acr_shm_t));
@@ -408,10 +391,7 @@
     if (rc) {
         free((void *)(shm->filename));
         free(shm);
-        if (IS_VALID_HANDLE(_E)) {
-            ACR_THROW_EIO(rc);
-        }
-        ACR_SET_OS_ERROR(rc);
+        ACR_THROW_IO_IF_ERR(rc);
         shm = NULL;
     }
     if (shm) {
@@ -435,10 +415,9 @@
     m->filename = NULL;
 
     rc = acr_ioh_close(shm);
+
 finally:
-    if (rc  && IS_VALID_HANDLE(_E)) {
-        ACR_THROW_EIO(rc);
-    }
+    ACR_THROW_IO_IF_ERR(rc);
     return rc;
 }
 
@@ -467,9 +446,7 @@
     }
 
 finally:
-    if (rc && IS_VALID_HANDLE(_E)) {
-        ACR_THROW_EIO(rc);
-    }
+    ACR_THROW_IO_IF_ERR(rc);
     return rc;
 }
 
@@ -545,7 +522,7 @@
         return NULL;
     }
     /* Create Descriptor Object */
-    shmd = ACR_DescriptorCreate(_E, ACR_DT_USER, ishm, NULL,
+    shmd = ACR_DescriptorCreate(_E, ACR_DT_SHM, ishm, NULL,
                                 shm_descriptor_cleanup);
     if (!shmd) {
 
@@ -568,7 +545,7 @@
         return NULL;
     }
     /* Create Descriptor Object */
-    shmd = ACR_DescriptorCreate(_E, ACR_DT_USER, ishm, NULL,
+    shmd = ACR_DescriptorCreate(_E, ACR_DT_SHM, ishm, NULL,
                                 shm_descriptor_cleanup);
     if (!shmd) {
 

Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/psema.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/psema.c?rev=806220&r1=806219&r2=806220&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/psema.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/psema.c Thu Aug 20 15:41:26 2009
@@ -239,3 +239,111 @@
     ACR_UnloadClass(_E, &_clazzn);
 }
 
+static int sem_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_SemaphoreObjectCreate(JNIEnv *_E,
+                                               const acr_pchar_t *name,
+                                               int value)
+{
+    jobject semo;
+    jobject semd;
+    int     isem;
+
+    isem = ACR_SemaphoreCreate(_E, name, value);
+    if (isem < 0) {
+
+        return NULL;
+    }
+    /* Create Descriptor Object */
+    semd = ACR_DescriptorCreate(_E, ACR_DT_SEMAPHORE, isem, NULL,
+                                sem_descriptor_cleanup);
+    if (!semd) {
+
+        return NULL;
+    }
+    semo = (*_E)->NewObject(_E, _clazzn.i, J4MID(0000), semd);
+    return semo;
+}
+
+ACR_DECLARE(jobject) ACR_SemaphoreObjectAttach(JNIEnv *_E,
+                                               const acr_pchar_t *name)
+{
+    jobject semo;
+    jobject semd;
+    int     isem;
+
+    isem = ACR_SemaphoreAttach(_E, name);
+    if (isem < 0) {
+
+        return NULL;
+    }
+    /* Create Descriptor Object */
+    semd = ACR_DescriptorCreate(_E, ACR_DT_SEMAPHORE, isem, NULL,
+                                sem_descriptor_cleanup);
+    if (!semd) {
+
+        return NULL;
+    }
+    semo = (*_E)->NewObject(_E, _clazzn.i, J4MID(0000), semd);
+    return semo;
+}
+
+ACR_JNI_EXPORT_DECLARE(jobject, Semaphore, create1)(ACR_JNISTDARGS,
+                                                    jstring name,
+                                                    jint value)
+{
+
+    jobject semo = NULL;
+    UNREFERENCED_O;
+
+    WITH_WSTR(name) {
+        semo = ACR_SemaphoreObjectCreate(_E, J2W(name), value);
+    } END_WITH_WSTR(name);
+
+    return semo;
+}
+
+ACR_JNI_EXPORT_DECLARE(jobject, Semaphore, create2)(ACR_JNISTDARGS,
+                                                    jstring name)
+{
+
+    jobject semo = NULL;
+    UNREFERENCED_O;
+
+    WITH_WSTR(name) {
+        semo = ACR_SemaphoreObjectAttach(_E, J2W(name));
+    } END_WITH_WSTR(name);
+
+    return semo;
+}
+
+ACR_JNI_EXPORT_DECLARE(jint, Semaphore, remove0)(ACR_JNISTDARGS,
+                                                 jstring name)
+{
+
+    int rc = ACR_SUCCESS;
+    UNREFERENCED_O;
+
+    WITH_WSTR(name) {
+        rc = ACR_SemaphoreRemove(_E, J2W(name));
+    } END_WITH_WSTR(name);
+    return rc;
+}
+

Added: commons/sandbox/runtime/trunk/src/main/native/shared/sema.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/sema.c?rev=806220&view=auto
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/shared/sema.c (added)
+++ commons/sandbox/runtime/trunk/src/main/native/shared/sema.c Thu Aug 20 15:41:26 2009
@@ -0,0 +1,39 @@
+/* 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_clazz.h"
+#include "acr_error.h"
+#include "acr_memory.h"
+#include "acr_string.h"
+#include "acr_descriptor.h"
+#include "acr_pointer.h"
+#include "acr_semaphore.h"
+
+ACR_JNI_EXPORT_DECLARE(jobject, Semaphore, create0)(ACR_JNISTDARGS,
+                                                    jint value)
+{
+
+    jobject semo = NULL;
+    UNREFERENCED_O;
+
+    semo = ACR_SemaphoreObjectCreate(_E, NULL, value);
+
+    return semo;
+}
+

Propchange: commons/sandbox/runtime/trunk/src/main/native/shared/sema.c
------------------------------------------------------------------------------
    svn:eol-style = native