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]

Reply via email to