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 2012/10/22 08:38:03 UTC
svn commit: r1400773 - in
/commons/proper/daemon/branches/1.0.x/src/native/windows:
apps/prunsrv/prunsrv.c include/javajni.h src/javajni.c src/log.c
src/rprocess.c
Author: mturk
Date: Mon Oct 22 06:38:03 2012
New Revision: 1400773
URL: http://svn.apache.org/viewvc?rev=1400773&view=rev
Log:
Apply DAEMON-244 patch
Modified:
commons/proper/daemon/branches/1.0.x/src/native/windows/apps/prunsrv/prunsrv.c
commons/proper/daemon/branches/1.0.x/src/native/windows/include/javajni.h
commons/proper/daemon/branches/1.0.x/src/native/windows/src/javajni.c
commons/proper/daemon/branches/1.0.x/src/native/windows/src/log.c
commons/proper/daemon/branches/1.0.x/src/native/windows/src/rprocess.c
Modified: commons/proper/daemon/branches/1.0.x/src/native/windows/apps/prunsrv/prunsrv.c
URL: http://svn.apache.org/viewvc/commons/proper/daemon/branches/1.0.x/src/native/windows/apps/prunsrv/prunsrv.c?rev=1400773&r1=1400772&r2=1400773&view=diff
==============================================================================
--- commons/proper/daemon/branches/1.0.x/src/native/windows/apps/prunsrv/prunsrv.c (original)
+++ commons/proper/daemon/branches/1.0.x/src/native/windows/apps/prunsrv/prunsrv.c Mon Oct 22 06:38:03 2012
@@ -826,15 +826,19 @@ static BOOL docmdUpdateService(LPAPXCMDL
}
-/* Report the service status to the SCM
+/* Report the service status to the SCM, including service specific exit code
*/
-int reportServiceStatus(DWORD dwCurrentState,
+int reportServiceStatusE(DWORD dwCurrentState,
DWORD dwWin32ExitCode,
- DWORD dwWaitHint)
+ DWORD dwWaitHint,
+ DWORD dwServiceSpecificExitCode)
{
static DWORD dwCheckPoint = 1;
BOOL fResult = TRUE;
+ apxLogWrite(APXLOG_MARK_DEBUG "reportServiceStatus: %d, %d, %d, %d",
+ dwCurrentState, dwWin32ExitCode, dwWaitHint, dwServiceSpecificExitCode);
+
if (_service_mode && _service_status_handle) {
if (dwCurrentState == SERVICE_START_PENDING)
_service_status.dwControlsAccepted = 0;
@@ -844,6 +848,7 @@ int reportServiceStatus(DWORD dwCurrentS
_service_status.dwCurrentState = dwCurrentState;
_service_status.dwWin32ExitCode = dwWin32ExitCode;
_service_status.dwWaitHint = dwWaitHint;
+ _service_status.dwServiceSpecificExitCode = dwServiceSpecificExitCode;
if ((dwCurrentState == SERVICE_RUNNING) ||
(dwCurrentState == SERVICE_STOPPED))
@@ -858,6 +863,22 @@ int reportServiceStatus(DWORD dwCurrentS
return fResult;
}
+/* Report the service status to the SCM
+ */
+int reportServiceStatus(DWORD dwCurrentState,
+ DWORD dwWin32ExitCode,
+ DWORD dwWaitHint)
+{
+ return reportServiceStatusE(dwCurrentState, dwWin32ExitCode, dwWaitHint, 0);
+}
+
+int reportServiceStatusStopped(DWORD exitCode) {
+ if(exitCode) {
+ return reportServiceStatusE(SERVICE_STOPPED, ERROR_SERVICE_SPECIFIC_ERROR, 0, exitCode);
+ } else {
+ return reportServiceStatus(SERVICE_STOPPED, NO_ERROR, 0);
+ }
+}
BOOL child_callback(APXHANDLE hObject, UINT uMsg,
WPARAM wParam, LPARAM lParam)
@@ -889,7 +910,8 @@ static int onExitStart(void)
{
if (_service_mode) {
apxLogWrite(APXLOG_MARK_DEBUG "Start exit hook called ...");
- reportServiceStatus(SERVICE_STOPPED, NO_ERROR, 0);
+ apxLogWrite(APXLOG_MARK_DEBUG "VM exit code: %d", apxGetVmExitCode());
+ reportServiceStatusStopped(apxGetVmExitCode());
}
return 0;
}
@@ -1526,12 +1548,12 @@ void WINAPI serviceMain(DWORD argc, LPTS
reportServiceStatus(SERVICE_STOP_PENDING, NO_ERROR, 0);
}
apxLogWrite(APXLOG_MARK_DEBUG "JVM destroyed.");
- reportServiceStatus(SERVICE_STOPPED, NO_ERROR, 0);
+ reportServiceStatusStopped(apxGetVmExitCode());
return;
cleanup:
/* Cleanup */
- reportServiceStatus(SERVICE_STOPPED, ERROR_SERVICE_SPECIFIC_ERROR, rc);
+ reportServiceStatusStopped(rc);
gExitval = rc;
return;
}
Modified: commons/proper/daemon/branches/1.0.x/src/native/windows/include/javajni.h
URL: http://svn.apache.org/viewvc/commons/proper/daemon/branches/1.0.x/src/native/windows/include/javajni.h?rev=1400773&r1=1400772&r2=1400773&view=diff
==============================================================================
--- commons/proper/daemon/branches/1.0.x/src/native/windows/include/javajni.h (original)
+++ commons/proper/daemon/branches/1.0.x/src/native/windows/include/javajni.h Mon Oct 22 06:38:03 2012
@@ -63,6 +63,9 @@ DWORD apxJavaSetOptions(APXHANDLE
BOOL apxDestroyJvm(DWORD dwTimeout);
+DWORD apxGetVmExitCode();
+
+void apxSetVmExitCode(DWORD exitCode);
__APXEND_DECLS
Modified: commons/proper/daemon/branches/1.0.x/src/native/windows/src/javajni.c
URL: http://svn.apache.org/viewvc/commons/proper/daemon/branches/1.0.x/src/native/windows/src/javajni.c?rev=1400773&r1=1400772&r2=1400773&view=diff
==============================================================================
--- commons/proper/daemon/branches/1.0.x/src/native/windows/src/javajni.c (original)
+++ commons/proper/daemon/branches/1.0.x/src/native/windows/src/javajni.c Mon Oct 22 06:38:03 2012
@@ -139,6 +139,8 @@ typedef struct APX_JDK1_1InitArgs {
#define JAVA_CLASSSTRING "java/lang/String"
#define MSVCRT71_DLLNAME L"\\msvcrt71.dll"
+static DWORD vmExitCode = 0;
+
static __inline BOOL __apxJvmAttach(LPAPXJAVAVM lpJava)
{
jint _iStatus;
@@ -438,6 +440,13 @@ static jint JNICALL __apxJniVfprintf(FIL
return rv;
}
+static void JNICALL __apxJniExit(jint exitCode)
+{
+ apxLogWrite(APXLOG_MARK_DEBUG "Exit hook with exit code %d", exitCode);
+ vmExitCode = exitCode;
+ return;
+}
+
static LPSTR __apxStrIndexA(LPCSTR szStr, int nCh)
{
LPSTR pStr;
@@ -624,6 +633,9 @@ apxJavaInitialize(APXHANDLE hJava, LPCST
++sOptions;
if (szClassPath && *szClassPath)
++sOptions;
+
+ sOptions++; /* unconditionally set for extraInfo exit */
+
nOptions = __apxMultiSzToJvmOptions(hJava->hPool, lpOptions,
&lpJvmOptions, sOptions);
if (szClassPath && *szClassPath) {
@@ -641,6 +653,12 @@ apxJavaInitialize(APXHANDLE hJava, LPCST
lpJvmOptions[nOptions - sOptions].extraInfo = __apxJniVfprintf;
--sOptions;
}
+
+ /* unconditionally add hook for System.exit() in order to store exit code */
+ lpJvmOptions[nOptions - sOptions].optionString = "exit";
+ lpJvmOptions[nOptions - sOptions].extraInfo = __apxJniExit;
+ --sOptions;
+
if (dwMs) {
wsprintfA(iB[0], "-Xms%dm", dwMs);
lpJvmOptions[nOptions - sOptions].optionString = iB[0];
@@ -903,6 +921,10 @@ static DWORD WINAPI __apxJavaWorkerThrea
lpJava->clWorker.jMethod,
lpJava->clWorker.jArgs);
if (JVM_EXCEPTION_CHECK(lpJava)) {
+ apxLogWrite(APXLOG_MARK_DEBUG "Exception has been thrown");
+ vmExitCode = 1;
+ (*((lpJava)->lpEnv))->ExceptionDescribe((lpJava)->lpEnv);
+ __apxJvmDetach(lpJava);
WORKER_EXIT(6);
}
else {
@@ -1215,3 +1237,12 @@ apxJavaSetOut(APXHANDLE hJava, BOOL setE
}
+DWORD apxGetVmExitCode(void) {
+ return vmExitCode;
+}
+
+void apxSetVmExitCode(DWORD exitCode) {
+ vmExitCode = exitCode;
+ return;
+}
+
Modified: commons/proper/daemon/branches/1.0.x/src/native/windows/src/log.c
URL: http://svn.apache.org/viewvc/commons/proper/daemon/branches/1.0.x/src/native/windows/src/log.c?rev=1400773&r1=1400772&r2=1400773&view=diff
==============================================================================
--- commons/proper/daemon/branches/1.0.x/src/native/windows/src/log.c (original)
+++ commons/proper/daemon/branches/1.0.x/src/native/windows/src/log.c Mon Oct 22 06:38:03 2012
@@ -363,6 +363,11 @@ apxLogWrite(
wsprintfA(sb, "(%10s:%-4d) ", f, dwLine);
WriteFile(lf->hFile, sb, lstrlenA(sb), &wr, NULL);
}
+
+ /* add thread ID to log output */
+ wsprintfA(sb, "[%5d] ", GetCurrentThreadId());
+ WriteFile(lf->hFile, sb, lstrlenA(sb), &wr, NULL);
+
if (len)
WriteFile(lf->hFile, buffer, len, &wr, NULL);
Modified: commons/proper/daemon/branches/1.0.x/src/native/windows/src/rprocess.c
URL: http://svn.apache.org/viewvc/commons/proper/daemon/branches/1.0.x/src/native/windows/src/rprocess.c?rev=1400773&r1=1400772&r2=1400773&view=diff
==============================================================================
--- commons/proper/daemon/branches/1.0.x/src/native/windows/src/rprocess.c (original)
+++ commons/proper/daemon/branches/1.0.x/src/native/windows/src/rprocess.c Mon Oct 22 06:38:03 2012
@@ -116,6 +116,12 @@ static DWORD WINAPI __apxProcWorkerThrea
if (WaitForSingleObject(lpProc->stProcInfo.hProcess,
INFINITE) == WAIT_OBJECT_0) {
lpProc->dwChildStatus |= CHILD_MAINTREAD_FINISHED;
+
+ /* store worker's exit code as VM exit code for later use */
+ GetExitCodeProcess(lpProc->stProcInfo.hProcess, &dwExitCode);
+ apxLogWrite(APXLOG_MARK_DEBUG "Child process exit code %d", dwExitCode);
+ apxSetVmExitCode(dwExitCode);
+
#if 0
if (hProcess->fnCallback)
(*hProcess->fnCallback)(hProcess, WM_QUIT, (WPARAM)dwExitCode, 0);