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/01/03 06:55:33 UTC

svn commit: r1054530 - /commons/proper/daemon/trunk/src/native/windows/src/javajni.c

Author: mturk
Date: Mon Jan  3 05:55:32 2011
New Revision: 1054530

URL: http://svn.apache.org/viewvc?rev=1054530&view=rev
Log:
DAEMON-190 Wait for worker thread to fully initialize before checking its status

Modified:
    commons/proper/daemon/trunk/src/native/windows/src/javajni.c

Modified: commons/proper/daemon/trunk/src/native/windows/src/javajni.c
URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/windows/src/javajni.c?rev=1054530&r1=1054529&r2=1054530&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/native/windows/src/javajni.c (original)
+++ commons/proper/daemon/trunk/src/native/windows/src/javajni.c Mon Jan  3 05:55:32 2011
@@ -112,6 +112,7 @@ typedef struct APXJAVAVM {
     DWORD           iWorkerThread;
     DWORD           dwWorkerStatus;
     SIZE_T          szStackSize;
+    HANDLE          hWorkerSync;
 } APXJAVAVM, *LPAPXJAVAVM;
 
 /* This is no longer exported in jni.h
@@ -888,6 +889,7 @@ static DWORD WINAPI __apxJavaWorkerThrea
     apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread started %s:%s",
                 lpJava->clWorker.sClazz, lpJava->clWorker.sMethod);
     lpJava->dwWorkerStatus = 1;
+    SetEvent(lpJava->hWorkerSync);
     JNICALL_3(CallStaticVoidMethod,
               lpJava->clWorker.jClazz,
               lpJava->clWorker.jMethod,
@@ -902,6 +904,7 @@ finished:
     lpJava->dwWorkerStatus = 0;
     apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread finished %s:%s with status=%d",
                 lpJava->clWorker.sClazz, lpJava->clWorker.sMethod, rv);
+    SetEvent(lpJava->hWorkerSync);
     ExitThread(rv);
     /* never gets here but keep the compiler happy */
     return 0;
@@ -912,16 +915,20 @@ apxJavaStart(LPAPXJAVA_THREADARGS pArgs)
 
     LPAPXJAVAVM lpJava;
     lpJava = APXHANDLE_DATA(pArgs->hJava);
-    lpJava->hWorkerThread = CreateThread(NULL,
-                                         lpJava->szStackSize,
-                                         __apxJavaWorkerThread,
-                                         pArgs, CREATE_SUSPENDED,
-                                         &lpJava->iWorkerThread);
+    lpJava->dwWorkerStatus = 0;
+    lpJava->hWorkerSync    = CreateEvent(NULL, FALSE, FALSE, NULL);
+    lpJava->hWorkerThread  = CreateThread(NULL,
+                                          lpJava->szStackSize,
+                                          __apxJavaWorkerThread,
+                                          pArgs, CREATE_SUSPENDED,
+                                          &lpJava->iWorkerThread);
     if (IS_INVALID_HANDLE(lpJava->hWorkerThread)) {
         apxLogWrite(APXLOG_MARK_SYSERR);
         return FALSE;
     }
     ResumeThread(lpJava->hWorkerThread);
+    /* Wait until the worker thread initializes */
+    WaitForSingleObject(lpJava->hWorkerSync, INFINITE);
     if (lstrcmpA(lpJava->clWorker.sClazz, "java/lang/System")) {
         /* Give some time to initialize the thread
          * Unless we are calling System.exit(0).