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 2011/04/14 16:58:25 UTC

svn commit: r1092317 - in /commons/sandbox/runtime/trunk/src/main/native/os/win32: arch_defs.h init.c semaphore.c winapi.c

Author: mturk
Date: Thu Apr 14 14:58:25 2011
New Revision: 1092317

URL: http://svn.apache.org/viewvc?rev=1092317&view=rev
Log:
Add win32 semaphore methods

Modified:
    commons/sandbox/runtime/trunk/src/main/native/os/win32/arch_defs.h
    commons/sandbox/runtime/trunk/src/main/native/os/win32/init.c
    commons/sandbox/runtime/trunk/src/main/native/os/win32/semaphore.c
    commons/sandbox/runtime/trunk/src/main/native/os/win32/winapi.c

Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/arch_defs.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/arch_defs.h?rev=1092317&r1=1092316&r2=1092317&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/arch_defs.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/arch_defs.h Thu Apr 14 14:58:25 2011
@@ -150,4 +150,61 @@ static __inline int isblank(int c)
     return c == ' ' || c == '\t';
 }
 
+#define WAIT_OBJECT_SIGNAL      WAIT_OBJECT_0
+#define WAIT_OBJECT_SIGPIPE    (WAIT_OBJECT_0 + 1)
+#define WAIT_OBJECT_1          (WAIT_OBJECT_0 + 1)
+#define WAIT_OBJECT_2          (WAIT_OBJECT_0 + 2)
+#define WAIT_OBJECT_3          (WAIT_OBJECT_0 + 3)
+#define WAIT_OBJECT_4          (WAIT_OBJECT_0 + 4)
+
+extern HANDLE acr_raised_event;
+extern volatile LONG acr_signal_waiters;
+
+static __inline DWORD AcrWaitForObjectOrSignal(HANDLE handle, DWORD dwTimeout)
+{
+    DWORD  rc;
+    HANDLE wh[2];
+
+    wh[0] = acr_raised_event;
+    wh[1] = handle;
+    InterlockedIncrement(&acr_signal_waiters);
+    rc =  WaitForMultipleObjectsEx(2, wh, FALSE, dwTimeout, TRUE);
+    InterlockedDecrement(&acr_signal_waiters);
+    if (rc <  (WAIT_OBJECT_0 + 2))
+        return rc;
+    else if (rc == WAIT_IO_COMPLETION)
+        return WAIT_OBJECT_0;
+    else if (rc >= WAIT_ABANDONED_0 && rc < (WAIT_ABANDONED_0 + 2))
+        return WAIT_OBJECT_0 + rc - WAIT_ABANDONED_0;
+    else
+        return rc;
+}
+
+static __inline DWORD AcrWaitForMultipleObjectsOrSignal(DWORD nCount,
+                                                        const HANDLE *handles,
+                                                        DWORD dwTimeout)
+{
+    DWORD  rc;
+    DWORD  wn;
+    HANDLE wh[MAXIMUM_WAIT_OBJECTS];
+
+    wh[0] = acr_raised_event;
+    for (wn = 0; wn < nCount; wn++) {
+        if (wn > (MAXIMUM_WAIT_OBJECTS - 2))
+            break;
+        wh[wn + 1] = handles[wn];
+    }
+    InterlockedIncrement(&acr_signal_waiters);
+    rc =  WaitForMultipleObjectsEx(nCount + 1, wh, FALSE, dwTimeout, TRUE);
+    InterlockedDecrement(&acr_signal_waiters);
+    if (rc < (WAIT_OBJECT_0 + MAXIMUM_WAIT_OBJECTS))
+        return rc;
+    else if (rc == WAIT_IO_COMPLETION)
+        return WAIT_OBJECT_0;
+    else if (rc >= WAIT_ABANDONED_0 && rc < (WAIT_ABANDONED_0 + nCount))
+        return WAIT_OBJECT_0 + rc - WAIT_ABANDONED_0;
+    else
+        return rc;
+}
+
 #endif /* _ACR_ARCH_DEFS_H_ */

Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/init.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/init.c?rev=1092317&r1=1092316&r2=1092317&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/init.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/init.c Thu Apr 14 14:58:25 2011
@@ -31,6 +31,7 @@ static DWORD            _threadkey = TLS
 HANDLE                  _heap_handle = 0;
 LPSYSTEM_INFO           acr_osinf = &osinf;
 LPOSVERSIONINFOEXA      acr_osver = &osver;
+HANDLE                  acr_raised_event = 0;
 
 typedef struct tlsd_t
 {
@@ -146,6 +147,9 @@ JNI_OnLoad(JavaVM *vm, void *reserved)
     GetSystemInfo(acr_osinf);
     acr_osver->dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
     GetVersionExA((LPOSVERSIONINFOA)acr_osver);
+    acr_raised_event = CreateEvent(0, TRUE, FALSE, 0);
+    if (IS_INVALID_HANDLE(acr_raised_event))
+        return JNI_ERR;
 
     if ((env = AcrGetJNIEnv()) == 0)
         return JNI_ERR;

Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/semaphore.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/semaphore.c?rev=1092317&r1=1092316&r2=1092317&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/semaphore.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/semaphore.c Thu Apr 14 14:58:25 2011
@@ -52,3 +52,83 @@ ACR_JNI_EXPORT(jobject, Semaphore, getIm
     }
     return (*env)->NewObject(env, _clazzn.i, J4MID(0000));
 }
+
+ACR_JNI_EXPORT(jlong, WindowsSemaphore, create0)(JNI_STDARGS,
+                                                 jstring name,
+                                                 jint value, jlong sd)
+{
+    HANDLE sp  = 0;
+    int maxval = 32767;
+    SECURITY_ATTRIBUTES sa;
+
+    if (value > maxval)
+        maxval = value;
+    /* Mark the semaphore as non inheritable
+     * with Modify access to Authenticated users
+     */
+    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
+    sa.lpSecurityDescriptor = J2P(sd, PSECURITY_DESCRIPTOR);
+    sa.bInheritHandle = FALSE;
+
+    WITH_WSTR(name) {
+        sp = CreateSemaphoreW(&sa, (LONG)value, (LONG)maxval, J2S(name));
+        if (sp == 0) {
+            int rc = ACR_GET_OS_ERROR();
+            if (ACR_STATUS_IS_EEXIST(rc)) {
+                ACR_THROW(ACR_EX_EEXIST, 0);
+            }
+            else if (ACR_STATUS_IS_EACCES(rc)) {
+                ACR_THROW(ACR_EX_EACCES, 0);
+            }
+            else {
+                ACR_THROW(ACR_EX_ESYS, rc);
+            }
+        }
+    } DONE_WITH_STR(name);
+
+    return P2J(sp);
+}
+
+ACR_JNI_EXPORT(jlong, WindowsSemaphore, open0)(JNI_STDARGS,
+                                               jstring name)
+{
+    HANDLE sp  = 0;
+
+    WITH_WSTR(name) {
+        sp =  OpenSemaphoreW(READ_CONTROL | SEMAPHORE_MODIFY_STATE, FALSE, J2S(name));
+        if (sp == 0) {
+            int rc = ACR_GET_OS_ERROR();
+            if (ACR_STATUS_IS_ENOENT(rc)) {
+                ACR_THROW(ACR_EX_ENOENT, 0);
+            }
+            else if (ACR_STATUS_IS_EACCES(rc)) {
+                ACR_THROW(ACR_EX_EACCES, 0);
+            }
+            else {
+                ACR_THROW(ACR_EX_ESYS, rc);
+            }
+        }
+    } DONE_WITH_STR(name);
+
+    return P2J(sp);
+}
+
+ACR_JNI_EXPORT(jint, WindowsSemaphore, try0)(JNI_STDARGS, jlong sem)
+{
+
+    DWORD ws = WaitForSingleObject(J2P(sem, HANDLE), 0);
+    if (ws == WAIT_OBJECT_0 || ws == WAIT_ABANDONED)
+        return 0;
+    else if (ws == WAIT_TIMEOUT)
+        return ACR_EBUSY;
+    else
+        return ACR_GET_OS_ERROR();
+}
+
+ACR_JNI_EXPORT(jint, PosixSemaphore, release0)(JNI_STDARGS, jlong sem)
+{
+    if (ReleaseSemaphore(J2P(sem, HANDLE), 1, 0))
+        return 0;
+    else
+        return ACR_GET_OS_ERROR();
+}

Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/winapi.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/winapi.c?rev=1092317&r1=1092316&r2=1092317&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/winapi.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/winapi.c Thu Apr 14 14:58:25 2011
@@ -27,6 +27,8 @@
 /* Closest we can get to directly using Win32 API
  */
 
+volatile LONG acr_signal_waiters = 0;
+
 static PSECURITY_ATTRIBUTES _null_SA[2] = { 0, 0 };
 static SECURITY_ATTRIBUTES  _zero_SA[2];
 
@@ -104,10 +106,10 @@ ACR_WIN_EXPORT(jlong, Api, ConvertString
 
 ACR_WIN_EXPORT(jint, Api, CloseHandle)(JNI_STDARGS, jlong handle)
 {
-    if (!CloseHandle(J2P(handle, HANDLE)))
-        return ACR_GET_OS_ERROR();
-    else
+    if (CloseHandle(J2P(handle, HANDLE)))
         return 0;
+    else
+        return ACR_GET_OS_ERROR();
 }
 
 ACR_WIN_EXPORT(void, Api, LocalFree)(JNI_STDARGS, jlong ptr)
@@ -149,3 +151,9 @@ ACR_WIN_EXPORT(jlong, Api, AllocateWellK
     }
     return P2J(sid);
 }
+
+
+ACR_WIN_EXPORT(jint, Api, WaitForSingleObject)(JNI_STDARGS, jlong handle, jint timeout)
+{
+    return WaitForSingleObject(J2P(handle, HANDLE), (DWORD)timeout);
+}