Author: mturk Date: Thu Jun 16 02:59:24 2005 New Revision: 190890 URL: http://svn.apache.org/viewcvs?rev=190890&view=rev Log: Add Thread Dump to manager application. This will generate a CTRL+BREAK console event. That's why we need to AllocConsole call. If the service flag (InteractWithDesktop) is checked, then the new console window will be displayed.
Modified: jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunmgr/prunmgr.c jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunmgr/prunmgr.h jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunsrv/prunsrv.c jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/include/apxwin.h jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/include/javajni.h jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/src/javajni.c jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/src/utils.c Modified: jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunmgr/prunmgr.c URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunmgr/prunmgr.c?rev=190890&r1=190889&r2=190890&view=diff ============================================================================== --- jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunmgr/prunmgr.c (original) +++ jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunmgr/prunmgr.c Thu Jun 16 02:59:24 2005 @@ -32,6 +32,7 @@ #define TMNU_STOP TEXT("Stop service") #define TMNU_EXIT TEXT("Exit") #define TMNU_ABOUT TEXT("About") +#define TMNU_DUMP TEXT("Thread Dump") /* Display only Started/Paused status */ #define STAT_STARTED TEXT("Started") @@ -116,6 +117,7 @@ apxAppendMenuItem(hMnu, IDM_TM_CONFIG, TMNU_CONF, TRUE, TRUE); apxAppendMenuItem(hMnu, IDM_TM_START, TMNU_START, FALSE, canStart); apxAppendMenuItem(hMnu, IDM_TM_STOP, TMNU_STOP, FALSE, canStop); + apxAppendMenuItem(hMnu, IDM_TM_DUMP, TMNU_DUMP, FALSE, canStop); apxAppendMenuItem(hMnu, IDM_TM_EXIT, TMNU_EXIT, FALSE, TRUE); apxAppendMenuItem(hMnu, -1, NULL, FALSE, FALSE); apxAppendMenuItem(hMnu, IDM_TM_ABOUT, TMNU_ABOUT, FALSE, TRUE); @@ -1433,6 +1435,28 @@ } +static void signalService(LPCWSTR szServiceName) +{ + HANDLE event; + WCHAR en[SIZ_DESLEN]; + int i; + lstrcpyW(en, szServiceName); + lstrcatW(en, L"SIGNAL"); + for (i = 0; i < lstrlenW(en); i++) { + if (en[i] >= L'a' && en[i] <= L'z') + en[i] = en[i] - 32; + } + + + event = OpenEventW(EVENT_MODIFY_STATE, FALSE, en); + if (event) { + SetEvent(event); + CloseHandle(event); + } + else + apxDisplayError(TRUE, NULL, 0, "Unable to open the Event Mutex"); + +} LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) @@ -1491,6 +1515,9 @@ _currentEntry->lpConfig->lpDisplayName, __restartServiceCallback, NULL); break; + case IDM_TM_DUMP: + signalService(_currentEntry->szServiceName); + break; case IDMS_REFRESH: if (bEnableTry && (_currentEntry = apxServiceEntry(hService, TRUE)) != NULL) { Modified: jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunmgr/prunmgr.h URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunmgr/prunmgr.h?rev=190890&r1=190889&r2=190890&view=diff ============================================================================== --- jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunmgr/prunmgr.h (original) +++ jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunmgr/prunmgr.h Thu Jun 16 02:59:24 2005 @@ -34,6 +34,7 @@ #define IDM_TM_RESTART 2004 #define IDM_TM_CONFIG 2005 #define IDM_TM_ABOUT 2006 +#define IDM_TM_DUMP 2007 #define IDMS_REFRESH 2020 Modified: jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunsrv/prunsrv.c URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunsrv/prunsrv.c?rev=190890&r1=190889&r2=190890&view=diff ============================================================================== --- jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunsrv/prunsrv.c (original) +++ jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/apps/prunsrv/prunsrv.c Thu Jun 16 02:59:24 2005 @@ -53,6 +53,7 @@ static LPCWSTR PRSRV_JVM = L"jvm"; static LPCWSTR PRSRV_MANUAL = L"manual"; static LPCWSTR PRSRV_JBIN = L"\\bin\\java.exe"; +static LPCWSTR PRSRV_SIGNAL = L"SIGNAL"; static LPWSTR _service_name = NULL; /* Allowed procrun commands */ @@ -192,14 +193,31 @@ static CHAR _jni_sclass[SIZ_RESLEN] = {'\0'}; /* Shutdown class */ static HANDLE gShutdownEvent = NULL; +static HANDLE gSignalEvent = NULL; +static HANDLE gSignalThread = NULL; +static BOOL gSignalValid = TRUE; + +DWORD WINAPI eventThread(LPVOID lpParam) +{ + for (;;) { + DWORD dw = WaitForSingleObject(gSignalEvent, INFINITE); + if (dw == WAIT_OBJECT_0 && gSignalValid) { + if (!GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, 0)) + apxLogWrite(APXLOG_MARK_SYSERR); + ResetEvent(gSignalEvent); + } + else + break; + } + ExitThread(0); + return 0; +} + /* redirect console stdout/stderr to files * so that java messages can get logged * If stderrfile is not specified it will * go to stdoutfile. */ - - - static BOOL redirectStdStreams(APX_STDWRAP *lpWrapper) { BOOL aErr = FALSE; @@ -752,7 +770,7 @@ return 1; } if (!apxJavaInitialize(hWorker, _jni_classpath, _jni_jvmoptions, - SO_JVMMS, SO_JVMMX, SO_JVMSS, TRUE)) { + SO_JVMMS, SO_JVMMX, SO_JVMSS)) { rv = 2; apxLogWrite(APXLOG_MARK_ERROR "Failed initializing java %s", _jni_classpath); goto cleanup; @@ -834,6 +852,14 @@ */ if (!IS_INVALID_HANDLE(hWorker)) apxCloseHandle(hWorker); + if (gSignalEvent) { + gSignalValid = FALSE; + SetEvent(gSignalEvent); + WaitForSingleObject(gSignalThread, 1000); + CloseHandle(gSignalEvent); + CloseHandle(gSignalThread); + gSignalEvent = NULL; + } SetEvent(gShutdownEvent); if (timeout > 0x7FFFFFFF) timeout = INFINITE; /* If the timeout was '-1' wait forewer */ @@ -899,7 +925,7 @@ return 1; } if (!apxJavaInitialize(gWorker, _jni_classpath, _jni_jvmoptions, - SO_JVMMS, SO_JVMMX, SO_JVMSS, _service_mode)) { + SO_JVMMS, SO_JVMMX, SO_JVMSS)) { rv = 2; apxLogWrite(APXLOG_MARK_ERROR "Failed initializing java %s", _jni_classpath); goto cleanup; @@ -1008,12 +1034,7 @@ switch (dwCtrlType) { case CTRL_BREAK_EVENT: apxLogWrite(APXLOG_MARK_INFO "Console CTRL+BREAK event signaled"); - if (_service_mode) { - serviceStop(); - return TRUE; - } - else - return FALSE; + return FALSE; case CTRL_C_EVENT: apxLogWrite(APXLOG_MARK_INFO "Console CTRL+C event signaled"); serviceStop(); @@ -1026,6 +1047,12 @@ apxLogWrite(APXLOG_MARK_INFO "Console SHUTDOWN event signaled"); serviceStop(); return TRUE; + case CTRL_LOGOFF_EVENT: + apxLogWrite(APXLOG_MARK_INFO "Console LOGOFF event signaled"); + if (!_service_mode) { + serviceStop(); + } + return TRUE; break; } @@ -1047,6 +1074,24 @@ apxLogWrite(APXLOG_MARK_DEBUG "Inside ServiceMain..."); + if (_service_name) { + WCHAR en[SIZ_DESLEN]; + int i; + PSECURITY_ATTRIBUTES sa = GetNullACL(); + lstrcpyW(en, _service_name); + lstrcatW(en, PRSRV_SIGNAL); + for (i = 0; i < lstrlenW(en); i++) { + if (en[i] >= L'a' && en[i] <= L'z') + en[i] = en[i] - 32; + } + gSignalEvent = CreateEventW(sa, TRUE, FALSE, en); + CleanNullACL((void *)sa); + + if (gSignalEvent) { + DWORD tid; + gSignalThread = CreateThread(NULL, 0, eventThread, NULL, 0, &tid); + } + } /* Check the StartMode */ if (SO_STARTMODE) { if (!lstrcmpiW(SO_STARTMODE, PRSRV_JVM)) { @@ -1113,6 +1158,8 @@ _service_name); goto cleanup; } + /* Allocate console so that events gets processed */ + AllocConsole(); } reportServiceStatus(SERVICE_START_PENDING, NO_ERROR, 3000); if ((rc = serviceStart()) == 0) { @@ -1155,6 +1202,7 @@ BOOL rv = FALSE; _service_mode = FALSE; + _service_name = lpCmdline->szApplication; apxLogWrite(APXLOG_MARK_INFO "Debuging Service..."); serviceMain(0, NULL); apxLogWrite(APXLOG_MARK_INFO "Debug service finished."); Modified: jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/include/apxwin.h URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/include/apxwin.h?rev=190890&r1=190889&r2=190890&view=diff ============================================================================== --- jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/include/apxwin.h (original) +++ jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/include/apxwin.h Thu Jun 16 02:59:24 2005 @@ -190,6 +190,9 @@ #define AplMoveMemory AplCopyMemory +PSECURITY_ATTRIBUTES GetNullACL(); +void CleanNullACL(void *sa); + __APXEND_DECLS #endif /* _APXWIN_H_INCLUDED_ */ Modified: jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/include/javajni.h URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/include/javajni.h?rev=190890&r1=190889&r2=190890&view=diff ============================================================================== --- jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/include/javajni.h (original) +++ jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/include/javajni.h Thu Jun 16 02:59:24 2005 @@ -22,7 +22,7 @@ BOOL apxJavaInitialize(APXHANDLE hJava, LPCSTR szClassPath, LPCVOID lpOptions, DWORD dwMs, DWORD dwMx, - DWORD dwSs, BOOL bReduceSignals); + DWORD dwSs); BOOL apxJavaLoadMainClass(APXHANDLE hJava, LPCSTR szClassName, LPCSTR szMethodName, Modified: jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/src/javajni.c URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/src/javajni.c?rev=190890&r1=190889&r2=190890&view=diff ============================================================================== --- jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/src/javajni.c (original) +++ jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/src/javajni.c Thu Jun 16 02:59:24 2005 @@ -311,7 +311,7 @@ BOOL apxJavaInitialize(APXHANDLE hJava, LPCSTR szClassPath, LPCVOID lpOptions, DWORD dwMs, DWORD dwMx, - DWORD dwSs, BOOL bReduceSignals) + DWORD dwSs) { LPAPXJAVAVM lpJava; JDK1_1InitArgs vmArgs11; @@ -369,20 +369,11 @@ ++sOptions; if (dwSs) ++sOptions; - if (bReduceSignals) - ++sOptions; nOptions = __apxMultiSzToJvmOptions(hJava->hPool, lpOptions, &lpJvmOptions, sOptions); szCp = apxPoolAlloc(hJava->hPool, sizeof(JAVA_CLASSPATH) + lstrlenA(szClassPath)); lstrcpyA(szCp, JAVA_CLASSPATH); lstrcatA(szCp, szClassPath); - if (bReduceSignals) { - /* reduce signals to skip registering console - * control handler - */ - lpJvmOptions[nOptions - sOptions].optionString = "-Xrs"; - --sOptions; - } lpJvmOptions[nOptions - sOptions].optionString = szCp; --sOptions; /* default JNI error printer */ Modified: jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/src/utils.c URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/src/utils.c?rev=190890&r1=190889&r2=190890&view=diff ============================================================================== --- jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/src/utils.c (original) +++ jakarta/commons/proper/daemon/trunk/src/native/nt/procrun/src/utils.c Thu Jun 16 02:59:24 2005 @@ -944,3 +944,47 @@ return NULL; } } + +/* To share the semaphores with other processes, we need a NULL ACL + * Code from MS KB Q106387 + */ +PSECURITY_ATTRIBUTES GetNullACL() +{ + PSECURITY_DESCRIPTOR pSD; + PSECURITY_ATTRIBUTES sa; + + sa = (PSECURITY_ATTRIBUTES) LocalAlloc(LPTR, sizeof(SECURITY_ATTRIBUTES)); + sa->nLength = sizeof(sizeof(SECURITY_ATTRIBUTES)); + + pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); + sa->lpSecurityDescriptor = pSD; + + if (pSD == NULL || sa == NULL) { + return NULL; + } + SetLastError(0); + if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION) + || GetLastError()) { + LocalFree( pSD ); + LocalFree( sa ); + return NULL; + } + if (!SetSecurityDescriptorDacl(pSD, TRUE, (PACL) NULL, FALSE) + || GetLastError()) { + LocalFree( pSD ); + LocalFree( sa ); + return NULL; + } + + sa->bInheritHandle = FALSE; + return sa; +} + + +void CleanNullACL(void *sa) +{ + if (sa) { + LocalFree(((PSECURITY_ATTRIBUTES)sa)->lpSecurityDescriptor); + LocalFree(sa); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]