]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[4065] New threads got all signals blocked
authorFrancis Dupont <fdupont@isc.org>
Tue, 22 Sep 2015 14:58:44 +0000 (16:58 +0200)
committerFrancis Dupont <fdupont@isc.org>
Tue, 22 Sep 2015 14:58:44 +0000 (16:58 +0200)
src/lib/util/threads/thread.cc

index 4ec90fdcac91e2cbdcf3970e5f3aeba91b31ec3b..568f6f8e2e54b3a8da236ce865d161cd158ca9a4 100644 (file)
@@ -21,7 +21,9 @@
 #include <cerrno>
 
 #include <pthread.h>
+#include <signal.h>
 
+#include <boost/noncopyable.hpp>
 #include <boost/scoped_ptr.hpp>
 
 using std::string;
@@ -33,6 +35,30 @@ namespace isc {
 namespace util {
 namespace thread {
 
+namespace {
+
+// Signal blocker class.
+class Blocker : boost::noncopyable {
+public:
+    // Constructor blocks all signals
+    Blocker() {
+       sigset_t new_mask;
+       sigfillset(&new_mask);
+       pthread_sigmask(SIG_BLOCK, &new_mask, &old_mask_);
+    }
+
+    // Destructor restores the previous signal mask
+    ~Blocker() {
+       pthread_sigmask(SIG_SETMASK, &old_mask_, 0);
+    }
+
+private:
+    // The previous signal mask
+    sigset_t old_mask_;
+};
+
+}
+
 // The implementation of the Thread class.
 //
 // This internal state is not deleted until the thread terminates and is either
@@ -105,6 +131,7 @@ Thread::Thread(const boost::function<void ()>& main) :
     impl_(NULL)
 {
     auto_ptr<Impl> impl(new Impl(main));
+    Blocker blocker;
     const int result = pthread_create(&impl->tid_, NULL, &Impl::run,
                                       impl.get());
     // Any error here?