sigprocmask call moved to InitNetXMSProcess; necessary signal calls moved to InitNetX...
authorVictor Kirhenshtein <victor@netxms.org>
Mon, 5 Dec 2016 08:09:53 +0000 (10:09 +0200)
committerVictor Kirhenshtein <victor@netxms.org>
Mon, 5 Dec 2016 08:09:53 +0000 (10:09 +0200)
include/nms_util.h
src/agent/core/nxagentd.cpp
src/libnetxms/threads.cpp
src/libnetxms/tools.cpp
src/server/netxmsd/netxmsd.cpp

index c3c79af..a870306 100644 (file)
@@ -2210,6 +2210,7 @@ String LIBNETXMS_EXPORTABLE EscapeStringForAgent(const TCHAR *s);
 StringList LIBNETXMS_EXPORTABLE *ParseCommandLine(const TCHAR *cmdline);
 
 #if !defined(_WIN32) && !defined(_NETWARE) && defined(NMS_THREADS_H_INCLUDED)
+void LIBNETXMS_EXPORTABLE BlockAllSignals(bool processWide);
 void LIBNETXMS_EXPORTABLE StartMainLoop(ThreadFunction pfSignalHandler, ThreadFunction pfMain);
 #endif
 
index 19edc6b..24fe368 100644 (file)
@@ -576,8 +576,6 @@ static void WriteSubAgentMsg(int logLevel, int debugLevel, const TCHAR *pszMsg)
 static THREAD_RESULT THREAD_CALL SignalHandler(void *pArg)
 {
        sigset_t signals;
-       int nSignal;
-
        sigemptyset(&signals);
        sigaddset(&signals, SIGTERM);
        sigaddset(&signals, SIGINT);
@@ -589,10 +587,9 @@ static THREAD_RESULT THREAD_CALL SignalHandler(void *pArg)
        sigaddset(&signals, SIGPIPE);
 #endif
 
-       sigprocmask(SIG_BLOCK, &signals, NULL);
-
-       while(1)
+       while(true)
        {
+               int nSignal;
                if (sigwait(&signals, &nSignal) == 0)
                {
                        switch(nSignal)
@@ -1393,14 +1390,6 @@ int main(int argc, char *argv[])
 
    InitNetXMSProcess();
 
-#if defined(__sun) || defined(_AIX) || defined(__hpux)
-   signal(SIGPIPE, SIG_IGN);
-   signal(SIGHUP, SIG_IGN);
-   signal(SIGQUIT, SIG_IGN);
-   signal(SIGUSR1, SIG_IGN);
-   signal(SIGUSR2, SIG_IGN);
-#endif
-
    // Check for alternate config file location
 #ifdef _WIN32
    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\NetXMS\\Agent"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
index c7fee0b..67754f0 100644 (file)
@@ -173,26 +173,36 @@ Condition& Condition::operator =(const Condition& src)
 #endif
 
 /**
- * Start main loop and signal handler for daemon
+ * Block all signals on a thread
  */
-void LIBNETXMS_EXPORTABLE StartMainLoop(ThreadFunction pfSignalHandler, ThreadFunction pfMain)
+void LIBNETXMS_EXPORTABLE BlockAllSignals(bool processWide)
 {
-   THREAD hThread;
-   struct utsname un;
-   int nModel = 0;
    sigset_t signals;
-
-   // Block signals
    sigemptyset(&signals);
    sigaddset(&signals, SIGTERM);
    sigaddset(&signals, SIGINT);
-   sigaddset(&signals, SIGPIPE);
    sigaddset(&signals, SIGSEGV);
    sigaddset(&signals, SIGCHLD);
    sigaddset(&signals, SIGHUP);
    sigaddset(&signals, SIGUSR1);
    sigaddset(&signals, SIGUSR2);
-   sigprocmask(SIG_BLOCK, &signals, NULL);
+#if !defined(__sun) && !defined(_AIX) && !defined(__hpux)
+   sigaddset(&signals, SIGPIPE);
+#endif
+   if (processWide)
+      sigprocmask(SIG_BLOCK, &signals, NULL);
+   else
+      pthread_sigmask(SIG_BLOCK, &signals, NULL);
+}
+
+/**
+ * Start main loop and signal handler for daemon
+ */
+void LIBNETXMS_EXPORTABLE StartMainLoop(ThreadFunction pfSignalHandler, ThreadFunction pfMain)
+{
+   THREAD hThread;
+   struct utsname un;
+   int nModel = 0;
 
    if (uname(&un) != -1)
    {
index 8b2b23e..8639104 100644 (file)
@@ -93,6 +93,16 @@ void LIBNETXMS_EXPORTABLE InitNetXMSProcess()
 #ifdef _WIN32
    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
 #endif
+
+#if defined(__sun) || defined(_AIX) || defined(__hpux)
+   signal(SIGPIPE, SIG_IGN);
+   signal(SIGHUP, SIG_IGN);
+   signal(SIGQUIT, SIG_IGN);
+   signal(SIGUSR1, SIG_IGN);
+   signal(SIGUSR2, SIG_IGN);
+#endif
+
+   BlockAllSignals(true);
 }
 
 /**
index ba3e0d8..022aa71 100644 (file)
 #include <dbghelp.h>
 #endif
 
-#ifndef _WIN32
-#include <signal.h>
-#endif
-
 #if defined(_WITH_ENCRYPTION) && defined(_WIN32)
 #include <openssl/applink.c>
 #endif
@@ -333,14 +329,6 @@ int main(int argc, char* argv[])
 {
    InitNetXMSProcess();
 
-#ifndef _WIN32
-   signal(SIGPIPE, SIG_IGN);
-   signal(SIGHUP, SIG_IGN);
-   signal(SIGQUIT, SIG_IGN);
-   signal(SIGUSR1, SIG_IGN);
-   signal(SIGUSR2, SIG_IGN);
-#endif
-
    // Check for alternate config file location
 #ifdef _WIN32
    HKEY hKey;