Merge in updated yatl.
[m6w6/libmemcached] / libtest / signal.cc
index 86c4a43178d8f66ce0498b1ccbd8d518e1cb10c0..1c4ecb7381c3fddfc790563e7a65ea2268540ed9 100644 (file)
@@ -34,7 +34,7 @@
  *
  */
 
-#include <config.h>
+#include "libtest/yatlcon.h"
 #include <libtest/common.h>
 
 #include <csignal>
@@ -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.";