X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libtest%2Fsignal.cc;h=165915f56e63bc2cf0f4fc2aacfedb67a3beb763;hb=17690735658d7b44f91579df91e31da9ae185158;hp=86c4a43178d8f66ce0498b1ccbd8d518e1cb10c0;hpb=9139975f5fe7895259645117b1e0e9a6cb9c27cc;p=m6w6%2Flibmemcached diff --git a/libtest/signal.cc b/libtest/signal.cc index 86c4a431..165915f5 100644 --- a/libtest/signal.cc +++ b/libtest/signal.cc @@ -34,7 +34,7 @@ * */ -#include +#include "libtest/yatlcon.h" #include #include @@ -91,13 +91,27 @@ void SignalThread::test() assert(magic_memory == MAGIC_MEMORY); if (bool(getenv("LIBTEST_IN_GDB")) == false) { + assert(sigismember(&set, SIGALRM)); 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 +128,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 +152,19 @@ static void *sig_thread(void *arg) switch (sig) { + case SIGALRM: + Error << "SIGALRM"; + if (gdb_is_caller()) + { + abort(); + } + exit(EXIT_SKIP); + + case SIGVTALRM: + Error << "SIGVTALRM was called"; + context->unblock(); + raise(SIGVTALRM); + case SIGABRT: case SIGUSR2: case SIGINT: @@ -180,10 +203,17 @@ SignalThread::SignalThread() : sigemptyset(&set); if (bool(getenv("LIBTEST_IN_GDB")) == false) { + sigaddset(&set, SIGALRM); sigaddset(&set, SIGABRT); sigaddset(&set, SIGQUIT); sigaddset(&set, SIGINT); + sigaddset(&set, SIGVTALRM); + } + else + { + Out << "Inside of GDB, disabling signal handlers"; } + sigaddset(&set, SIGPIPE); sigaddset(&set, SIGUSR2); @@ -203,10 +233,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.";