]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
signal_handler: added support for using reentrant strsignal() implementations vs... 6796/head
authorJohn Coyle <dx9err@gmail.com>
Mon, 7 Dec 2015 18:33:32 +0000 (13:33 -0500)
committerJohn Coyle <dx9err@gmail.com>
Wed, 9 Dec 2015 18:08:59 +0000 (13:08 -0500)
musl libc does not provide sys_siglist. It does provide a reentrant implementation of strsignal().

Added a cmake build option for using reentrant strsignal() impls instead of sys_siglist.

Signed-off-by: John Coyle <dx9err@gmail.com>
CMakeLists.txt
src/global/signal_handler.cc
src/global/signal_handler.h
src/include/config-h.in.cmake
src/mds/MDSDaemon.cc
src/mon/Monitor.cc
src/osd/OSD.cc
src/test/mon/test_mon_workloadgen.cc

index cb41d3ea286bf5b0e583aad487ebba995e09fd61..d79f0e794a81c4de0ea624d5a3167c34dbbbb739 100644 (file)
@@ -223,6 +223,11 @@ if(WITH_THREAD_SAFE_RES_QUERY)
     set(HAVE_THREAD_SAFE_RES_QUERY 1 CACHE INTERNAL "Thread safe res_query supported.")
 endif(WITH_THREAD_SAFE_RES_QUERY)
 
+option(WITH_REENTRANT_STRSIGNAL "strsignal is reentrant" OFF)
+if(WITH_REENTRANT_STRSIGNAL)
+    set(HAVE_REENTRANT_STRSIGNAL 1 CACHE INTERNAL "Reentrant strsignal is supported.")
+endif(WITH_REENTRANT_STRSIGNAL)
+
 # Now create a useable config.h
 configure_file(
   ${PROJECT_SOURCE_DIR}/src/include/config-h.in.cmake
index 560f2fdfd52cef2a43b6dc53a3fc92ff9cf99daa..120767650eb386dbd89803bf4d39af47c260b53e 100644 (file)
@@ -30,7 +30,6 @@
 extern char *sys_siglist[]; 
 #endif 
 
-
 void install_sighandler(int signum, signal_handler_t handler, int flags)
 {
   int ret;
@@ -54,7 +53,7 @@ void install_sighandler(int signum, signal_handler_t handler, int flags)
 #else
     snprintf(buf, sizeof(buf), "install_sighandler: sigaction returned "
            "%d when trying to install a signal handler for %s\n",
-            ret, sys_siglist[signum]);
+            ret, sig_str(signum));
 #endif
     dout_emergency(buf);
     exit(1);
@@ -99,7 +98,7 @@ static void handle_fatal_signal(int signum)
            "in thread %llx\n", message, (unsigned long long)pthread_self());
 #else
   snprintf(buf, sizeof(buf), "*** Caught signal (%s) **\n "
-           "in thread %llx\n", sys_siglist[signum], (unsigned long long)pthread_self());
+           "in thread %llx\n", sig_str(signum), (unsigned long long)pthread_self());
 #endif
   dout_emergency(buf);
   pidfile_remove();
index 3a11f54315eabaa893d643513195364583ffb416..d768e4e47c7243e4e219c2eb8c3944067401596f 100644 (file)
 #include <signal.h>
 #include <string>
 
+#include "acconfig.h"
+
 typedef void (*signal_handler_t)(int);
 
+#ifndef HAVE_REENTRANT_STRSIGNAL
+# define sig_str(signum) sys_siglist[signum]
+#else
+# define sig_str(signum) strsignal(signum)
+#endif
+
 void install_sighandler(int signum, signal_handler_t handler, int flags);
 
 // handles SIGHUP
index 1907a98ce9982f792417fcbd08f101274ac33aa1..8e376abb4d0fe13b3378cf10a0f382262d5cf38b 100644 (file)
 /* res_query is thread safe */
 #cmakedefine HAVE_THREAD_SAFE_RES_QUERY
 
+/* Define if HAVE_REENTRANT_STRSIGNAL */
+#cmakedefine HAVE_REENTRANT_STRSIGNAL
+
 #endif /* CONFIG_H */
index 9fcff34ab25680fc93bdca7cb5233f566060067f..15867c55e47c5f22d64de19faaf82bbaa7d939d4 100644 (file)
@@ -993,7 +993,7 @@ void MDSDaemon::_handle_mds_map(MDSMap *oldmap)
 void MDSDaemon::handle_signal(int signum)
 {
   assert(signum == SIGINT || signum == SIGTERM);
-  derr << "*** got signal " << sys_siglist[signum] << " ***" << dendl;
+  derr << "*** got signal " << sig_str(signum) << " ***" << dendl;
   {
     Mutex::Locker l(mds_lock);
     if (stopping) {
index cbf37c2f878092f57df7adb4fa543d6e02054b65..59a24a99f66cdae9127e3d5ee5156decb7ffa4dd 100644 (file)
@@ -62,6 +62,8 @@
 #include "common/perf_counters.h"
 #include "common/admin_socket.h"
 
+#include "global/signal_handler.h"
+
 #include "include/color.h"
 #include "include/ceph_fs.h"
 #include "include/str_list.h"
@@ -356,7 +358,7 @@ abort:
 void Monitor::handle_signal(int signum)
 {
   assert(signum == SIGINT || signum == SIGTERM);
-  derr << "*** Got Signal " << sys_siglist[signum] << " ***" << dendl;
+  derr << "*** Got Signal " << sig_str(signum) << " ***" << dendl;
   shutdown();
 }
 
index c47aa5fb9785d0fc333f0cd573e19c20c6fdb28c..6badfffeedeacd5de558d05708c23290e68a6ee4 100644 (file)
@@ -1648,7 +1648,7 @@ void cls_initialize(ClassHandler *ch);
 void OSD::handle_signal(int signum)
 {
   assert(signum == SIGINT || signum == SIGTERM);
-  derr << "*** Got signal " << sys_siglist[signum] << " ***" << dendl;
+  derr << "*** Got signal " << sig_str(signum) << " ***" << dendl;
   shutdown();
 }
 
index e18906d19314892b316e127171e004a5c42fe341..64575fe5e92b6baab4af65f68fb2d75402d57fa9 100644 (file)
@@ -935,7 +935,7 @@ void handle_test_signal(int signum)
   if ((signum != SIGINT) && (signum != SIGTERM))
     return;
 
-  std::cerr << "*** Got signal " << sys_siglist[signum] << " ***" << std::endl;
+  std::cerr << "*** Got signal " << sig_str(signum) << " ***" << std::endl;
   Mutex::Locker l(shutdown_lock);
   if (shutdown_timer) {
     shutdown_timer->cancel_all_events();