Skip to content

Commit

Permalink
signal_handler: fallback to strsignal when sys_siglist is not impleme…
Browse files Browse the repository at this point in the history
…nted

musl libc does not provide sys_siglist.

Added feature check for sys_siglist and a fallback to strsignal().

Assumes strsignal(3) is not thread safe (http://pubs.opengroup.org/onlinepubs/9699919799/functions/strsignal.html). Added WITH_THREAD_SAFE_STRSIGNAL build option for thread safe impls.

Signed-off-by: John Coyle <dx9err@gmail.com>
  • Loading branch information
dx9 committed Dec 4, 2015
1 parent 15a81bb commit 00b2b6b
Show file tree
Hide file tree
Showing 9 changed files with 41 additions and 9 deletions.
7 changes: 6 additions & 1 deletion CMakeLists.txt
Expand Up @@ -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("
Expand Down Expand Up @@ -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
Expand Down
3 changes: 3 additions & 0 deletions configure.ac
Expand Up @@ -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 <signal.h> #include <string.h>])

AC_CHECK_TYPES([int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t,
int64_t, uint64_t])

Expand Down
22 changes: 18 additions & 4 deletions src/global/signal_handler.cc
Expand Up @@ -12,6 +12,7 @@
*
*/

#include "acconfig.h"
#include "common/BackTrace.h"
#include "common/perf_counters.h"
#include "common/config.h"
Expand All @@ -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)
{
Expand All @@ -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);
Expand Down Expand Up @@ -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();

Expand Down Expand Up @@ -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
}
2 changes: 2 additions & 0 deletions src/global/signal_handler.h
Expand Up @@ -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
Expand Down
6 changes: 6 additions & 0 deletions src/include/config-h.in.cmake
Expand Up @@ -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 */
2 changes: 1 addition & 1 deletion src/mds/MDSDaemon.cc
Expand Up @@ -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) {
Expand Down
4 changes: 3 additions & 1 deletion src/mon/Monitor.cc
Expand Up @@ -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"
Expand Down Expand Up @@ -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();
}

Expand Down
2 changes: 1 addition & 1 deletion src/osd/OSD.cc
Expand Up @@ -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();
}

Expand Down
2 changes: 1 addition & 1 deletion src/test/mon/test_mon_workloadgen.cc
Expand Up @@ -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();
Expand Down

0 comments on commit 00b2b6b

Please sign in to comment.