Process SIGUSR1 synchronously similar to other signals. Move signal
handler setup from potentially shared library code. Use osm log locking
with file reopening in order to prevent races with osm_log().

Signed-off-by: Sasha Khapyorsky <[EMAIL PROTECTED]>
---
 osm/include/opensm/osm_log.h |   21 +++++++++++++++++++++
 osm/opensm/libopensm.map     |    3 ++-
 osm/opensm/main.c            |   17 +++++++++++++++++
 osm/opensm/osm_log.c         |   41 +++++++++++------------------------------
 4 files changed, 51 insertions(+), 31 deletions(-)

diff --git a/osm/include/opensm/osm_log.h b/osm/include/opensm/osm_log.h
index 7197439..55e996a 100644
--- a/osm/include/opensm/osm_log.h
+++ b/osm/include/opensm/osm_log.h
@@ -253,6 +253,27 @@ osm_log_init_v2(
 *      osm_log_destroy
 *********/
 
+/****f* OpenSM: Log/osm_log_reopen_file
+* NAME
+*      osm_log_reopen_file
+*
+* DESCRIPTION
+*      The osm_log_reopen_file function reopens the log file
+*
+* SYNOPSIS
+*/
+int
+osm_log_reopen_file(
+       osm_log_t *p_log);
+/*
+* PARAMETERS
+*      p_log
+*              [in] Pointer to the log object.
+*
+* RETURN VALUES
+*      0 on success or nonzero value otherwise.
+*********/
+
 /****f* OpenSM: Log/osm_log_init
 * NAME
 *      osm_log_init
diff --git a/osm/opensm/libopensm.map b/osm/opensm/libopensm.map
index c200384..909b641 100644
--- a/osm/opensm/libopensm.map
+++ b/osm/opensm/libopensm.map
@@ -1,10 +1,11 @@
-OPENSM_1.4 {
+OPENSM_1.5 {
        global:
                osm_log;
                osm_log_printf;
                osm_is_debug;
                osm_log_init;
                osm_log_init_v2;
+               osm_log_reopen_file;
                osm_mad_pool_construct;
                osm_mad_pool_destroy;
                osm_mad_pool_init;
diff --git a/osm/opensm/main.c b/osm/opensm/main.c
index 374d323..d63c95c 100644
--- a/osm/opensm/main.c
+++ b/osm/opensm/main.c
@@ -71,6 +71,7 @@ osm_opensm_t osm;
 volatile unsigned int osm_exit_flag = 0;
 
 static volatile unsigned int osm_hup_flag = 0;
+static volatile unsigned int osm_usr1_flag = 0;
 
 #define GUID_ARRAY_SIZE 64
 #define INVALID_GUID (0xFFFFFFFFFFFFFFFFULL)
@@ -91,6 +92,11 @@ static void mark_hup_flag(int signum)
        osm_hup_flag = 1;
 }
 
+static void mark_usr1_flag(int signum)
+{
+       osm_usr1_flag = 1;
+}
+
 static sigset_t saved_sigset;
 
 static void block_signals()
@@ -101,6 +107,9 @@ static void block_signals()
        sigaddset(&set, SIGINT);
        sigaddset(&set, SIGTERM);
        sigaddset(&set, SIGHUP);
+#ifndef HAVE_OLD_LINUX_THREADS
+       sigaddset(&set, SIGUSR1);
+#endif
        pthread_sigmask(SIG_SETMASK, &set, &saved_sigset);
 }
 
@@ -115,6 +124,10 @@ static void setup_signals()
        sigaction(SIGTERM, &act, NULL);
        act.sa_handler = mark_hup_flag;
        sigaction(SIGHUP, &act, NULL);
+#ifndef HAVE_OLD_LINUX_THREADS
+       act.sa_handler = mark_usr1_flag;
+       sigaction(SIGUSR1, &act, NULL);
+#endif
        pthread_sigmask(SIG_SETMASK, &saved_sigset, NULL);
 }
 #endif /* __WIN__ */
@@ -946,6 +959,10 @@ main(
       else
         cl_thread_suspend( 10000 );
 
+      if (osm_usr1_flag) {
+        osm_usr1_flag = 0;
+        osm_log_reopen_file(&osm.log);
+      }
       if (osm_hup_flag) {
         osm_hup_flag = 0;
         /* a HUP signal should only start a new heavy sweep */
diff --git a/osm/opensm/osm_log.c b/osm/opensm/osm_log.c
index 56c6482..6d9a450 100644
--- a/osm/opensm/osm_log.c
+++ b/osm/opensm/osm_log.c
@@ -58,7 +58,6 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <errno.h>
-#include <signal.h>
 
 static int log_exit_count = 0;
 
@@ -290,24 +289,16 @@ open_out_port(IN osm_log_t *p_log)
     return (0);
 }
 
-
-osm_log_t *handler_log = NULL;
-void
-sigusr1_handler(int signal)
-{
-       fclose(handler_log->out_port);
-       open_out_port(handler_log);
-}
-
-static void
-setup_sigusr1_handler(osm_log_t *p_log)
+int osm_log_reopen_file(osm_log_t *p_log)
 {
-       struct sigaction act;
-       act.sa_handler = sigusr1_handler;
-       sigemptyset(&(act.sa_mask));
-       act.sa_flags = 0;
-       handler_log = p_log;
-       sigaction(SIGUSR1, &act, NULL);
+       int ret;
+       if (p_log->out_port == stdout || p_log->out_port == stderr)
+               return 0;
+       cl_spinlock_acquire(&p_log->lock);
+       fclose(p_log->out_port);
+       ret = open_out_port(p_log);
+       cl_spinlock_release(&p_log->lock);
+       return ret;
 }
 
 ib_api_status_t
@@ -330,21 +321,11 @@ osm_log_init_v2(
 
   if (log_file == NULL || !strcmp(log_file, "-") ||
       !strcmp(log_file, "stdout"))
-  {
     p_log->out_port = stdout;
-  }
   else if (!strcmp(log_file, "stderr"))
-  {
     p_log->out_port = stderr;
-  }
-  else
-  {
-         setup_sigusr1_handler(p_log);
-         if (open_out_port(p_log))
-         {
-                 return (IB_UNKNOWN_ERROR);
-         }
-  }
+  else if (open_out_port(p_log))
+    return (IB_UNKNOWN_ERROR);
 
   if (cl_spinlock_init( &p_log->lock ) == CL_SUCCESS) 
     return IB_SUCCESS;
-- 
1.5.0.rc0.g2484-dirty


_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to