X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libtest%2Fsignal.cc;h=1c4ecb7381c3fddfc790563e7a65ea2268540ed9;hb=9065046a3fd404f72fb090cb0da65cfa8443032f;hp=86c4a43178d8f66ce0498b1ccbd8d518e1cb10c0;hpb=47f45992107361ad58c170bdf78fdc92523fab06;p=awesomized%2Flibmemcached diff --git a/libtest/signal.cc b/libtest/signal.cc index 86c4a431..1c4ecb73 100644 --- a/libtest/signal.cc +++ b/libtest/signal.cc @@ -34,7 +34,7 @@ * */ -#include +#include "libtest/yatlcon.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.";