diff --git a/CMakeLists.txt b/CMakeLists.txt index cb41d3ea286bf5..21b6c542c52fc4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,8 +82,8 @@ include(CheckSymbolExists) CHECK_SYMBOL_EXISTS(__u8 "sys/types.h;linux/types.h" HAVE___U8) CHECK_SYMBOL_EXISTS(__u64 "sys/types.h;linux/types.h" HAVE___U64) CHECK_SYMBOL_EXISTS(__s64 "sys/types.h;linux/types.h" HAVE___S64) - CHECK_SYMBOL_EXISTS(res_nquery "resolv.h" HAVE_RES_NQUERY) +CHECK_SYMBOL_EXISTS(sys_siglist "signal.h;string.h" HAVE_SYS_SIGLIST) include(CheckCXXSourceCompiles) CHECK_CXX_SOURCE_COMPILES(" @@ -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_THREAD_SAFE_STRSIGNAL "strsignal is thread safe" OFF) +if(WITH_THREAD_SAFE_STRSIGNAL) + set(HAVE_THREAD_SAFE_STRSIGNAL 1 CACHE INTERNAL "Thread safe strsignal supported.") +endif(WITH_THREAD_SAFE_STRSIGNAL) + # Now create a useable config.h configure_file( ${PROJECT_SOURCE_DIR}/src/include/config-h.in.cmake diff --git a/configure.ac b/configure.ac index 2abdb78b7cb3fe..1e1ac892ae9040 100644 --- a/configure.ac +++ b/configure.ac @@ -1090,6 +1090,9 @@ AC_CHECK_FUNC([pthread_spin_init], LIBS="$saved_LIBS" CFLAGS="$saved_CFLAGS" + +AC_CHECK_DECL([sys_siglist],[AC_DEFINE(HAVE_SYS_SIGLIST, 1, [Define if you have sys_siglist])],[], [#include #include ]) + AC_CHECK_TYPES([int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t]) diff --git a/src/global/signal_handler.cc b/src/global/signal_handler.cc index 560f2fdfd52cef..46ad21928b7a4e 100644 --- a/src/global/signal_handler.cc +++ b/src/global/signal_handler.cc @@ -12,6 +12,7 @@ * */ +#include "acconfig.h" #include "common/BackTrace.h" #include "common/perf_counters.h" #include "common/config.h" @@ -30,6 +31,9 @@ extern char *sys_siglist[]; #endif +#ifndef HAVE_THREAD_SAFE_STRSIGNAL +static Mutex lock("strsignal"); +#endif void install_sighandler(int signum, signal_handler_t handler, int flags) { @@ -54,7 +58,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,8 +103,9 @@ 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(); @@ -376,5 +381,14 @@ void unregister_async_signal_handler(int signum, signal_handler_t handler) g_signal_handler->unregister_handler(signum, handler); } - - +char* sig_str(int signum) +{ +#ifdef HAVE_SYS_SIGLIST + return sys_siglist[signum]; +#else +# ifndef HAVE_THREAD_SAFE_STRSIGNAL + Mutex::Locker l(lock); +# endif + return strsignal(signum); +#endif +} diff --git a/src/global/signal_handler.h b/src/global/signal_handler.h index 3a11f54315eaba..fe27f36f72a866 100644 --- a/src/global/signal_handler.h +++ b/src/global/signal_handler.h @@ -20,6 +20,8 @@ typedef void (*signal_handler_t)(int); +char* sig_str(int signum); + void install_sighandler(int signum, signal_handler_t handler, int flags); // handles SIGHUP diff --git a/src/include/config-h.in.cmake b/src/include/config-h.in.cmake index 1907a98ce9982f..6476cf0e4c1f1f 100644 --- a/src/include/config-h.in.cmake +++ b/src/include/config-h.in.cmake @@ -246,4 +246,10 @@ /* res_query is thread safe */ #cmakedefine HAVE_THREAD_SAFE_RES_QUERY +/* Define if HAVE_SYS_SIGLIST */ +#cmakedefine HAVE_SYS_SIGLIST + +/* Define if HAVE_THREAD_SAFE_STRSIGNAL */ +#cmakedefine HAVE_THREAD_SAFE_STRSIGNAL + #endif /* CONFIG_H */ diff --git a/src/mds/MDSDaemon.cc b/src/mds/MDSDaemon.cc index 9fcff34ab25680..15867c55e47c5f 100644 --- a/src/mds/MDSDaemon.cc +++ b/src/mds/MDSDaemon.cc @@ -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) { diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index cbf37c2f878092..59a24a99f66cda 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -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 @@ void Monitor::do_admin_command(string command, cmdmap_t& cmdmap, string format, 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(); } diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index c47aa5fb9785d0..6badfffeedeacd 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -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(); } diff --git a/src/test/mon/test_mon_workloadgen.cc b/src/test/mon/test_mon_workloadgen.cc index e18906d1931489..64575fe5e92b6b 100644 --- a/src/test/mon/test_mon_workloadgen.cc +++ b/src/test/mon/test_mon_workloadgen.cc @@ -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();