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);
+}