|
@@ -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?
|