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