X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libtest%2Fsignal.cc;h=e680ccbc426d3b087b2cd99aed32c0663bd5a421;hb=9a58df7803d815ca6be695c5fc38469da099620f;hp=86c4a43178d8f66ce0498b1ccbd8d518e1cb10c0;hpb=a833bac7bfb7b59bb95e84cc8989d0edae6a6136;p=awesomized%2Flibmemcached diff --git a/libtest/signal.cc b/libtest/signal.cc index 86c4a431..e680ccbc 100644 --- a/libtest/signal.cc +++ b/libtest/signal.cc @@ -34,7 +34,7 @@ * */ -#include +#include "mem_config.h" #include #include @@ -94,10 +94,23 @@ void SignalThread::test() assert(sigismember(&set, SIGABRT)); assert(sigismember(&set, SIGQUIT)); assert(sigismember(&set, SIGINT)); + assert(sigismember(&set, SIGVTALRM)); } assert(sigismember(&set, SIGUSR2)); } +bool SignalThread::unblock() +{ + int error; + if ((error= pthread_sigmask(SIG_UNBLOCK, &set, NULL)) != 0) + { + Error << "While trying to reset signal mask to original set, pthread_sigmask() died during pthread_sigmask(" << strerror(error) << ")"; + return false; + } + + return true; +} + SignalThread::~SignalThread() { if (is_shutdown() == false) @@ -114,11 +127,7 @@ SignalThread::~SignalThread() #endif sem_destroy(&lock); - int error; - if ((error= pthread_sigmask(SIG_UNBLOCK, &set, NULL)) != 0) - { - Error << "While trying to reset signal mask to original set, pthread_sigmask() died during pthread_sigmask(" << strerror(error) << ")"; - } + unblock(); } extern "C" { @@ -142,6 +151,11 @@ static void *sig_thread(void *arg) switch (sig) { + case SIGVTALRM: + Error << "SIGVTALRM was called"; + context->unblock(); + raise(SIGVTALRM); + case SIGABRT: case SIGUSR2: case SIGINT: @@ -183,6 +197,7 @@ SignalThread::SignalThread() : sigaddset(&set, SIGABRT); sigaddset(&set, SIGQUIT); sigaddset(&set, SIGINT); + sigaddset(&set, SIGVTALRM); } sigaddset(&set, SIGPIPE); @@ -203,10 +218,17 @@ bool SignalThread::setup() { Error << strsignal(SIGQUIT) << " has been previously set."; } + if (sigismember(&original_set, SIGINT)) { Error << strsignal(SIGINT) << " has been previously set."; } + + if (sigismember(&original_set, SIGVTALRM)) + { + Error << strsignal(SIGVTALRM) << " has been previously set."; + } + if (sigismember(&original_set, SIGUSR2)) { Error << strsignal(SIGUSR2) << " has been previously set.";