#include <cerrno>
#include <pthread.h>
+#include <signal.h>
+#include <boost/noncopyable.hpp>
#include <boost/scoped_ptr.hpp>
using std::string;
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
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?