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 2010/09/24 15:16:44 UTC

svn commit: r1000858 - in /commons/proper/daemon/trunk/src: native/windows/apps/prunsrv/prunsrv.c native/windows/include/javajni.h native/windows/src/javajni.c samples/build.xml

Author: mturk
Date: Fri Sep 24 13:16:44 2010
New Revision: 1000858

URL: http://svn.apache.org/viewvc?rev=1000858&view=rev
Log:
Fix DAEMON-100 by making sure the JVM is loaded in the same thread as started

Modified:
    commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c
    commons/proper/daemon/trunk/src/native/windows/include/javajni.h
    commons/proper/daemon/trunk/src/native/windows/src/javajni.c
    commons/proper/daemon/trunk/src/samples/build.xml

Modified: commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c
URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c?rev=1000858&r1=1000857&r2=1000858&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c (original)
+++ commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c Fri Sep 24 13:16:44 2010
@@ -231,6 +231,8 @@ static HANDLE gSignalThread  = NULL;
 static HANDLE gPidfileHandle = NULL;
 static LPWSTR gPidfileName   = NULL;
 static BOOL   gSignalValid   = TRUE;
+static APXJAVA_THREADARGS gRargs;
+
 
 DWORD WINAPI eventThread(LPVOID lpParam)
 {
@@ -991,20 +993,20 @@ static DWORD serviceStart()
             apxLogWrite(APXLOG_MARK_ERROR "Failed creating java %S", _jni_jvmpath);
             return 1;
         }
-        if (!apxJavaInitialize(gWorker, _jni_classpath, _jni_jvmoptions,
-                               SO_JVMMS, SO_JVMMX, SO_JVMSS, SO_JNIVFPRINTF)) {
-            rv = 2;
-            apxLogWrite(APXLOG_MARK_ERROR "Failed initializing java %s", _jni_classpath);
-            goto cleanup;
-        }
-        if (!apxJavaLoadMainClass(gWorker, _jni_rclass, _jni_rmethod, _jni_rparam)) {
-            rv = 3;
-            apxLogWrite(APXLOG_MARK_ERROR "Failed loading main %s class %s", _jni_rclass, _jni_classpath);
-            goto cleanup;
-        }
-        apxJavaSetOut(gWorker, TRUE,  gStdwrap.szStdErrFilename);
-        apxJavaSetOut(gWorker, FALSE, gStdwrap.szStdOutFilename);
-        if (!apxJavaStart(gWorker)) {
+        gRargs.hJava            = gWorker;
+        gRargs.szClassPath      = _jni_classpath;
+        gRargs.lpOptions        = _jni_jvmoptions;
+        gRargs.dwMs             = SO_JVMMS;
+        gRargs.dwMx             = SO_JVMMX;
+        gRargs.dwSs             = SO_JVMSS;
+        gRargs.bJniVfprintf     = SO_JNIVFPRINTF;        
+        gRargs.szClassName      = _jni_rclass;
+        gRargs.szMethodName     = _jni_rmethod;
+        gRargs.lpArguments      = _jni_rparam;
+        gRargs.szStdErrFilename = gStdwrap.szStdErrFilename;
+        gRargs.szStdOutFilename = gStdwrap.szStdOutFilename;
+
+        if (!apxJavaStartThread(&gRargs)) {
             rv = 4;
             apxLogWrite(APXLOG_MARK_ERROR "Failed to start Java");
             goto cleanup;

Modified: commons/proper/daemon/trunk/src/native/windows/include/javajni.h
URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/windows/include/javajni.h?rev=1000858&r1=1000857&r2=1000858&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/native/windows/include/javajni.h (original)
+++ commons/proper/daemon/trunk/src/native/windows/include/javajni.h Fri Sep 24 13:16:44 2010
@@ -21,6 +21,23 @@ __APXBEGIN_DECLS
 
 #define     APX_JVM_DESTROY 0x00000001
 
+typedef struct stAPXJAVA_THREADARGS
+{
+    LPVOID      hJava;
+    LPCSTR      szClassPath;
+    LPCVOID     lpOptions;
+    DWORD       dwMs;
+    DWORD       dwMx;
+    DWORD       dwSs;
+    DWORD       bJniVfprintf;
+    LPCSTR      szClassName;
+    LPCSTR      szMethodName;
+    LPCVOID     lpArguments;    
+    BOOL        setErrorOrOut;
+    LPCWSTR     szStdErrFilename;
+    LPCWSTR     szStdOutFilename;
+} APXJAVA_THREADARGS, *LPAPXJAVA_THREADARGS;
+
 APXHANDLE   apxCreateJava(APXHANDLE hPool, LPCWSTR szJvmDllPath);
 
 BOOL        apxJavaInitialize(APXHANDLE hJava, LPCSTR szClassPath,
@@ -36,6 +53,7 @@ BOOL        apxJavaLoadMainClass(APXHAND
                                  LPCVOID lpArguments);
 
 BOOL        apxJavaStart(APXHANDLE hJava);
+BOOL        apxJavaStartThread(LPAPXJAVA_THREADARGS pArgs);
 
 DWORD       apxJavaWait(APXHANDLE hJava, DWORD dwMilliseconds, BOOL bKill);
 

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=1000858&r1=1000857&r2=1000858&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/native/windows/src/javajni.c (original)
+++ commons/proper/daemon/trunk/src/native/windows/src/javajni.c Fri Sep 24 13:16:44 2010
@@ -15,6 +15,8 @@
  */
 
 #include "apxwin.h"
+#include "handles.h"
+#include "javajni.h"
 #include "private.h"
 
 #include <jni.h>
@@ -667,24 +669,10 @@ apxJavaInitialize(APXHANDLE hJava, LPCST
         apxFree(szCp);
         apxFree(lpJvmOptions);
     }
-    /* Load standard classes */
-    if (rv) {
-        jclass jClazz = JNICALL_1(FindClass, JAVA_CLASSSTRING);
-        if (!jClazz) {
-            apxLogWrite(APXLOG_MARK_ERROR "FindClass "  JAVA_CLASSSTRING " failed");
-            goto cleanup;
-        }
-        lpJava->clString.jClazz = JNICALL_1(NewGlobalRef, jClazz);
-        JNI_LOCAL_UNREF(jClazz);
-
+    if (rv)
         return TRUE;
-    }
     else
         return FALSE;
-
-cleanup:
-    JVM_EXCEPTION_CLEAR(lpJava);
-    return FALSE;
 }
 
 /* ANSI version only */
@@ -796,6 +784,14 @@ apxJavaLoadMainClass(APXHANDLE hJava, LP
     lpJava = APXHANDLE_DATA(hJava);
     if (!__apxJvmAttach(lpJava))
         return FALSE;
+    jClazz = JNICALL_1(FindClass, JAVA_CLASSSTRING);
+    if (!jClazz) {
+        JVM_EXCEPTION_CLEAR(lpJava);
+        apxLogWrite(APXLOG_MARK_ERROR "FindClass "  JAVA_CLASSSTRING " failed");
+        return FALSE;
+    }
+    lpJava->clString.jClazz = JNICALL_1(NewGlobalRef, jClazz);
+    JNI_LOCAL_UNREF(jClazz);
 
     /* Find the class */
     jClazz  = JNICALL_1(FindClass, szClassName);
@@ -876,6 +872,62 @@ finished:
     return 0;
 }
 
+static DWORD WINAPI __apxJavaWorkerThread2(LPVOID lpParameter)
+{
+#define WORKER_EXIT(x)  { rv = x; goto finished; }
+    DWORD rv = 0;
+    LPAPXJAVAVM lpJava;
+    LPAPXJAVA_THREADARGS pArgs = (LPAPXJAVA_THREADARGS)lpParameter;
+    APXHANDLE hJava;
+    
+    hJava = (APXHANDLE)pArgs->hJava;
+    if (hJava->dwType != APXHANDLE_TYPE_JVM)
+        WORKER_EXIT(0);
+
+    if (!apxJavaInitialize(pArgs->hJava,
+                           pArgs->szClassPath,
+                           pArgs->lpOptions,
+                           pArgs->dwMs, pArgs->dwMx, pArgs->dwSs,
+                           pArgs->bJniVfprintf)) {
+        WORKER_EXIT(2);
+    }
+
+    if (!apxJavaLoadMainClass(pArgs->hJava,
+                              pArgs->szClassName,
+                              pArgs->szMethodName,
+                              pArgs->lpArguments)) {
+        WORKER_EXIT(2);
+    }
+    apxJavaSetOut(pArgs->hJava, TRUE,  pArgs->szStdErrFilename);
+    apxJavaSetOut(pArgs->hJava, FALSE, pArgs->szStdOutFilename);
+
+    lpJava = APXHANDLE_DATA(pArgs->hJava);
+    /* Check if we have a class and a method */
+    if (!lpJava->clWorker.jClazz || !lpJava->clWorker.jMethod)
+        WORKER_EXIT(2);
+    if (!__apxJvmAttach(lpJava))
+        WORKER_EXIT(3);
+    apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread started %s:%s",
+                lpJava->clWorker.sClazz, lpJava->clWorker.sMethod);
+    lpJava->dwWorkerStatus = 1;
+    JNICALL_3(CallStaticVoidMethod,
+              lpJava->clWorker.jClazz,
+              lpJava->clWorker.jMethod,
+              lpJava->clWorker.jArgs);
+
+    JVM_EXCEPTION_CLEAR(lpJava);
+    __apxJvmDetach(lpJava);
+    apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread %s:%s finished",
+                lpJava->clWorker.sClazz, lpJava->clWorker.sMethod);
+finished:
+    lpJava->dwWorkerStatus = 0;
+    apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread finished %s:%s",
+                lpJava->clWorker.sClazz, lpJava->clWorker.sMethod);
+    ExitThread(rv);
+    /* never gets here but keep the compiler happy */
+    return 0;
+}
+
 
 BOOL
 apxJavaStart(APXHANDLE hJava)
@@ -902,6 +954,26 @@ apxJavaStart(APXHANDLE hJava)
     return TRUE;
 }
 
+apxJavaStartThread(LPAPXJAVA_THREADARGS pArgs)
+{
+
+    LPAPXJAVAVM lpJava;
+    lpJava = APXHANDLE_DATA(pArgs->hJava);
+    lpJava->hWorkerThread = CreateThread(NULL,
+                                         lpJava->szStackSize,
+                                         __apxJavaWorkerThread2,
+                                         pArgs, CREATE_SUSPENDED,
+                                         &lpJava->iWorkerThread);
+    if (IS_INVALID_HANDLE(lpJava->hWorkerThread)) {
+        apxLogWrite(APXLOG_MARK_SYSERR);
+        return FALSE;
+    }
+    ResumeThread(lpJava->hWorkerThread);
+    /* Give some time to initialize the thread */
+    Sleep(1000);
+    return TRUE;
+}
+
 DWORD
 apxJavaSetOptions(APXHANDLE hJava, DWORD dwOptions)
 {

Modified: commons/proper/daemon/trunk/src/samples/build.xml
URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/samples/build.xml?rev=1000858&r1=1000857&r2=1000858&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/samples/build.xml (original)
+++ commons/proper/daemon/trunk/src/samples/build.xml Fri Sep 24 13:16:44 2010
@@ -24,7 +24,7 @@
   <property name="source.home" value="."/>
 
   <property name="maven.repo.local" value="${user.home}/.m2/repository"/>
-  <property name="commons-collections.jar" value="${maven.repo.local}/commons-collections/commons-collections/3.1/commons-collections-3.1.jar"/>
+  <property name="commons-collections.jar" value="commons-collections-3.2.1.jar"/>
 
   <target name="jars" depends="SimpleDaemon,ServiceDaemon,AloneService,ProcrunService"/>
 
@@ -117,7 +117,7 @@
   <path id="compile.classpath">
     <!-- output jar filename may vary between releases -->
     <fileset dir="../../dist" includes="commons-daemon-*.jar"/>
-    <pathelement location="${commons-collections.jar}"/>
+    <fileset dir="." includes="${commons-collections.jar}"/>
   </path>
 
 </project>