On 4 November 2011 12:52, <mt...@apache.org> wrote: > Author: mturk > Date: Fri Nov 4 12:52:08 2011 > New Revision: 1197541 > > URL: http://svn.apache.org/viewvc?rev=1197541&view=rev > Log: > Make a code a bit safer on invalid parameters. Make sure it doesn't crash at > least
The default --StartClass is now "Main", and --StopClass defaults to "java/lang/System" - in which case the default --StopMethod is "exit" - is that correct? If so, I can update the docs accordingly. > Modified: > commons/proper/daemon/trunk/src/native/windows/apps/prunsrv/prunsrv.c > commons/proper/daemon/trunk/src/native/windows/src/javajni.c > > 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=1197541&r1=1197540&r2=1197541&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 > Nov 4 12:52:08 2011 > @@ -1303,9 +1303,15 @@ void WINAPI serviceMain(DWORD argc, LPTS > if (IS_VALID_STRING(SO_STARTMODE)) { > if (!lstrcmpiW(SO_STARTMODE, PRSRV_JVM)) { > _jni_startup = TRUE; > - _jni_rclass = WideToANSI(SO_STARTCLASS); > - /* Exchange all dots with slashes */ > - apxStrCharReplaceA(_jni_rclass, '.', '/'); > + if (IS_VALID_STRING(SO_STARTCLASS)) { > + _jni_rclass = WideToANSI(SO_STARTCLASS); > + /* Exchange all dots with slashes */ > + apxStrCharReplaceA(_jni_rclass, '.', '/'); > + } > + else { > + /* Presume its main */ > + _jni_rclass = WideToANSI(L"Main"); > + } > _jni_rparam = SO_STARTPARAMS; > } > else if (!lstrcmpiW(SO_STARTMODE, PRSRV_JAVA)) { > @@ -1345,14 +1351,14 @@ void WINAPI serviceMain(DWORD argc, LPTS > if (IS_VALID_STRING(SO_STOPMODE)) { > if (!lstrcmpiW(SO_STOPMODE, PRSRV_JVM)) { > _jni_shutdown = TRUE; > - _jni_sclass = WideToANSI(SO_STOPCLASS); > if (IS_VALID_STRING(SO_STOPCLASS)) { > + _jni_sclass = WideToANSI(SO_STOPCLASS); > apxStrCharReplaceA(_jni_sclass, '.', '/'); > - _jni_sparam = SO_STOPPARAMS; > } > else { > - _jni_sclass = "java/lang/System"; > + _jni_sclass = WideToANSI(L"java/lang/System"); > } > + _jni_sparam = SO_STOPPARAMS; > } > else if (!lstrcmpiW(SO_STOPMODE, PRSRV_JAVA)) { > LPWSTR jx = NULL, szJH = SO_JAVAHOME; > > 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=1197541&r1=1197540&r2=1197541&view=diff > ============================================================================== > --- commons/proper/daemon/trunk/src/native/windows/src/javajni.c (original) > +++ commons/proper/daemon/trunk/src/native/windows/src/javajni.c Fri Nov 4 > 12:52:08 2011 > @@ -792,8 +792,18 @@ apxJavaLoadMainClass(APXHANDLE hJava, LP > if (hJava->dwType != APXHANDLE_TYPE_JVM) > return FALSE; > lpJava = APXHANDLE_DATA(hJava); > - if (!__apxJvmAttach(lpJava)) > + if (!lpJava) > return FALSE; > + if (IS_EMPTY_STRING(szMethodName)) > + szMethodName = "main"; > + if (lstrcmpA(szClassName, "java/lang/System") == 0) { > + /* Usable only for exit method, so force */ > + szSignature = "(I)V"; > + szMethodName = "exit"; > + } > + lstrlcpyA(lpJava->clWorker.sClazz, 1024, szClassName); > + lstrlcpyA(lpJava->clWorker.sMethod, 512, szMethodName); > + > jClazz = JNICALL_1(FindClass, JAVA_CLASSSTRING); > if (!jClazz) { > JVM_EXCEPTION_CLEAR(lpJava); > @@ -802,7 +812,6 @@ apxJavaLoadMainClass(APXHANDLE hJava, LP > } > lpJava->clString.jClazz = JNICALL_1(NewGlobalRef, jClazz); > JNI_LOCAL_UNREF(jClazz); > - > /* Find the class */ > jClazz = JNICALL_1(FindClass, szClassName); > if (!jClazz) { > @@ -814,15 +823,6 @@ apxJavaLoadMainClass(APXHANDLE hJava, LP > lpJava->clWorker.jClazz = JNICALL_1(NewGlobalRef, jClazz); > JNI_LOCAL_UNREF(jClazz); > > - if (!szMethodName) > - szMethodName = "main"; > - if (lstrcmpA(szClassName, "java/lang/System") == 0) { > - /* Usable only for exit method, so force */ > - szSignature = "(I)V"; > - szMethodName = "exit"; > - } > - lstrlcpyA(lpJava->clWorker.sClazz, 1024, szClassName); > - lstrlcpyA(lpJava->clWorker.sMethod, 512, szMethodName); > lpJava->clWorker.jMethod = JNICALL_3(GetStaticMethodID, > lpJava->clWorker.jClazz, > szMethodName, szSignature); > @@ -855,16 +855,18 @@ apxJavaLoadMainClass(APXHANDLE hJava, LP > */ > static DWORD WINAPI __apxJavaWorkerThread(LPVOID lpParameter) > { > -#define WORKER_EXIT(x) { rv = x; goto finished; } > +#define WORKER_EXIT(x) do { rv = x; goto finished; } while(0) > DWORD rv = 0; > - LPAPXJAVAVM lpJava; > + LPAPXJAVAVM lpJava = NULL; > LPAPXJAVA_THREADARGS pArgs = (LPAPXJAVA_THREADARGS)lpParameter; > APXHANDLE hJava; > > - hJava = (APXHANDLE)pArgs->hJava; > + hJava = (APXHANDLE)pArgs->hJava; > if (hJava->dwType != APXHANDLE_TYPE_JVM) > WORKER_EXIT(1); > - > + lpJava = APXHANDLE_DATA(pArgs->hJava); > + if (!lpJava) > + WORKER_EXIT(1); > if (!apxJavaInitialize(pArgs->hJava, > pArgs->szClassPath, > pArgs->lpOptions, > @@ -882,17 +884,16 @@ static DWORD WINAPI __apxJavaWorkerThrea > pArgs->szClassName, > pArgs->szMethodName, > pArgs->lpArguments)) { > - WORKER_EXIT(2); > + WORKER_EXIT(3); > } > 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); > + WORKER_EXIT(4); > if (!__apxJvmAttach(lpJava)) > - WORKER_EXIT(3); > + WORKER_EXIT(5); > apxLogWrite(APXLOG_MARK_DEBUG "Java Worker thread started %s:%s", > lpJava->clWorker.sClazz, lpJava->clWorker.sMethod); > lpJava->dwWorkerStatus = 1; > @@ -902,26 +903,30 @@ static DWORD WINAPI __apxJavaWorkerThrea > lpJava->clWorker.jMethod, > lpJava->clWorker.jArgs); > if (JVM_EXCEPTION_CHECK(lpJava)) { > - WORKER_EXIT(4); > + WORKER_EXIT(6); > } > else { > __apxJvmDetach(lpJava); > } > 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); > + if (lpJava) { > + 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; > + return rv; > } > > +BOOL > apxJavaStart(LPAPXJAVA_THREADARGS pArgs) > { > - > LPAPXJAVAVM lpJava; > lpJava = APXHANDLE_DATA(pArgs->hJava); > + if (!lpJava) > + return FALSE; > lpJava->dwWorkerStatus = 0; > lpJava->hWorkerSync = CreateEvent(NULL, FALSE, FALSE, NULL); > lpJava->hWorkerThread = CreateThread(NULL, > @@ -936,6 +941,8 @@ apxJavaStart(LPAPXJAVA_THREADARGS pArgs) > ResumeThread(lpJava->hWorkerThread); > /* Wait until the worker thread initializes */ > WaitForSingleObject(lpJava->hWorkerSync, INFINITE); > + if (lpJava->dwWorkerStatus == 0) > + return FALSE; > if (lstrcmpA(lpJava->clWorker.sClazz, "java/lang/System")) { > /* Give some time to initialize the thread > * Unless we are calling System.exit(0). > > > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org