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 2013/03/23 06:30:33 UTC

svn commit: r1460101 - in /commons/proper/daemon/branches/1.0.x/src/native/windows: apps/prunsrv/prunsrv.c include/javajni.h src/javajni.c

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);
+    }
+}