Skip to content

Commit

Permalink
signal_handler: added support for using reentrant strsignal() impleme…
Browse files Browse the repository at this point in the history
…ntations vs. sys_siglist[]

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>
  • Loading branch information
dx9 committed Dec 9, 2015
1 parent 15a81bb commit 82c40b6
Show file tree
Hide file tree
Showing 8 changed files with 24 additions and 7 deletions.
5 changes: 5 additions & 0 deletions CMakeLists.txt
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_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
Expand Down
5 changes: 2 additions & 3 deletions src/global/signal_handler.cc
Expand Up @@ -30,7 +30,6 @@
extern char *sys_siglist[];
#endif


void install_sighandler(int signum, signal_handler_t handler, int flags)
{
int ret;
Expand All @@ -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);
Expand Down Expand Up @@ -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();
Expand Down
8 changes: 8 additions & 0 deletions src/global/signal_handler.h
Expand Up @@ -18,8 +18,16 @@
#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
Expand Down
3 changes: 3 additions & 0 deletions src/include/config-h.in.cmake
Expand Up @@ -246,4 +246,7 @@
/* res_query is thread safe */
#cmakedefine HAVE_THREAD_SAFE_RES_QUERY

/* Define if HAVE_REENTRANT_STRSIGNAL */
#cmakedefine HAVE_REENTRANT_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 82c40b6

Please sign in to comment.