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>