Author: mturk Date: Sat Mar 23 05:30:32 2013 New Revision: 1460101 URL: http://svn.apache.org/r1460101 Log: Fix DumpThreads from services. Seems the call to AttachConsole makes the message pipe unusable. Use console window to detect if we have or have not a console
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 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=1460101&r1=1460100&r2=1460101&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 Sat Mar 23 05:30:32 2013 @@ -263,8 +263,11 @@ DWORD WINAPI eventThread(LPVOID lpParam) continue; } if (dw == WAIT_OBJECT_0 && gSignalValid) { - if (!GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0)) - apxLogWrite(APXLOG_MARK_SYSERR); + if (!GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0)) { + /* Invoke Thread dump */ + if (gWorker && _jni_startup) + apxJavaDumpAllStacks(gWorker); + } ResetEvent(gSignalEvent); continue; } @@ -284,15 +287,13 @@ static BOOL redirectStdStreams(APX_STDWR BOOL aErr = FALSE; BOOL aOut = FALSE; - if (lpWrapper->szStdOutFilename || lpWrapper->szStdErrFilename) { - /* Alloc console if it doesn't exists. */ - if (!AttachConsole(ATTACH_PARENT_PROCESS) && - GetLastError() == ERROR_INVALID_HANDLE) { - HWND hc; - AllocConsole(); - if ((hc = GetConsoleWindow()) != NULL) - ShowWindow(hc, SW_HIDE); - } + /* Allocate console if we have none + */ + if (GetConsoleWindow() == NULL) { + HWND hc; + AllocConsole(); + if ((hc = GetConsoleWindow()) != NULL) + ShowWindow(hc, SW_HIDE); } /* redirect to file or console */ if (lpWrapper->szStdOutFilename) { 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=1460101&r1=1460100&r2=1460101&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 Sat Mar 23 05:30:32 2013 @@ -32,7 +32,7 @@ typedef struct stAPXJAVA_THREADARGS DWORD bJniVfprintf; LPCSTR szClassName; LPCSTR szMethodName; - LPCVOID lpArguments; + LPCVOID lpArguments; BOOL setErrorOrOut; LPCWSTR szStdErrFilename; LPCWSTR szStdOutFilename; @@ -63,10 +63,12 @@ DWORD apxJavaSetOptions(APXHANDLE BOOL apxDestroyJvm(DWORD dwTimeout); -DWORD apxGetVmExitCode(); +DWORD apxGetVmExitCode(); void apxSetVmExitCode(DWORD exitCode); +void apxJavaDumpAllStacks(APXHANDLE hJava); + __APXEND_DECLS #endif /* _JAVAJNI_H_INCLUDED_ */ 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=1460101&r1=1460100&r2=1460101&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 Sat Mar 23 05:30:32 2013 @@ -47,6 +47,9 @@ static DYNLOAD_FPTR_DECLARE(JNI_CreateJa DYNOLAD_TYPE_DECLARE(JNI_GetCreatedJavaVMs, JNICALL, jint)(JavaVM **, jsize, jsize *); static DYNLOAD_FPTR_DECLARE(JNI_GetCreatedJavaVMs) = NULL; +DYNOLAD_TYPE_DECLARE(JVM_DumpAllStacks, JNICALL, void)(JNIEnv *, jclass); +static DYNLOAD_FPTR_DECLARE(JVM_DumpAllStacks) = NULL; + static HANDLE _st_sys_jvmDllHandle = NULL; static JavaVM *_st_sys_jvm = NULL; @@ -142,31 +145,40 @@ typedef struct APX_JDK1_1InitArgs { static DWORD vmExitCode = 0; -static __inline BOOL __apxJvmAttach(LPAPXJAVAVM lpJava) +static __inline BOOL __apxJvmAttachEnv(LPAPXJAVAVM lpJava, JNIEnv **lpEnv, + LPBOOL lpAttached) { jint _iStatus; - if (!_st_sys_jvm) + if (!_st_sys_jvm || !lpJava->lpJvm) return FALSE; _iStatus = (*(lpJava->lpJvm))->GetEnv(lpJava->lpJvm, - (void **)&(lpJava->lpEnv), + (void **)lpEnv, lpJava->iVersion); if (_iStatus != JNI_OK) { - if (_iStatus == JNI_EDETACHED) + if (_iStatus == JNI_EDETACHED) { _iStatus = (*(lpJava->lpJvm))->AttachCurrentThread(lpJava->lpJvm, - (void **)&(lpJava->lpEnv), NULL); + (void **)lpEnv, NULL); + if (lpAttached) + *lpAttached = TRUE; + } } if (_iStatus != JNI_OK) { - lpJava->lpEnv = NULL; + *lpEnv = NULL; return FALSE; } else return TRUE; } +static __inline BOOL __apxJvmAttach(LPAPXJAVAVM lpJava) +{ + return __apxJvmAttachEnv(lpJava, &lpJava->lpEnv, NULL); +} + static __inline BOOL __apxJvmDetach(LPAPXJAVAVM lpJava) { - if (!_st_sys_jvm) + if (!_st_sys_jvm || !lpJava->lpJvm) return FALSE; if ((*(lpJava->lpJvm))->DetachCurrentThread(lpJava->lpJvm) != JNI_OK) { lpJava->lpEnv = NULL; @@ -282,6 +294,7 @@ static BOOL __apxLoadJvmDll(LPCWSTR szJv DYNLOAD_FPTR_LOAD(JNI_GetDefaultJavaVMInitArgs, _st_sys_jvmDllHandle); DYNLOAD_FPTR_LOAD(JNI_CreateJavaVM, _st_sys_jvmDllHandle); DYNLOAD_FPTR_LOAD(JNI_GetCreatedJavaVMs, _st_sys_jvmDllHandle); + DYNLOAD_FPTR_LOAD(JVM_DumpAllStacks, _st_sys_jvmDllHandle); if (!DYNLOAD_FPTR(JNI_GetDefaultJavaVMInitArgs) || !DYNLOAD_FPTR(JNI_CreateJavaVM) || @@ -930,7 +943,7 @@ static DWORD WINAPI __apxJavaWorkerThrea lpJava->dwWorkerStatus = 1; SetEvent(lpJava->hWorkerInit); /* Ensure apxJavaStart worker has read our status */ - WaitForSingleObject(lpJava->hWorkerSync, INFINITE); + WaitForSingleObject(lpJava->hWorkerSync, INFINITE); JNICALL_3(CallStaticVoidMethod, lpJava->clWorker.jClazz, lpJava->clWorker.jMethod, @@ -1263,3 +1276,21 @@ void apxSetVmExitCode(DWORD exitCode) { return; } +void +apxJavaDumpAllStacks(APXHANDLE hJava) +{ + BOOL bAttached; + LPAPXJAVAVM lpJava; + JNIEnv *lpEnv = NULL; + + if (DYNLOAD_FPTR(JVM_DumpAllStacks) == NULL || + hJava == NULL || + hJava->dwType != APXHANDLE_TYPE_JVM) + return; + lpJava = APXHANDLE_DATA(hJava); + if (__apxJvmAttachEnv(lpJava, &lpEnv, &bAttached)) { + DYNLOAD_FPTR(JVM_DumpAllStacks)(lpEnv, NULL); + if (bAttached) + (*(lpJava->lpJvm))->DetachCurrentThread(lpJava->lpJvm); + } +}