9 // A thread class with start/stop and signal functionality.
11 // SIGUSR1 is blocked during execution of do_work(), so that you are guaranteed
12 // to receive it when doing wait_for_activity(), and never elsewhere. This means
13 // that you can test whatever status flags you'd want before calling
14 // wait_for_activity(), and then be sure that it actually returns immediately
15 // if a SIGUSR1 (ie., wakeup()) happened, even if it were sent between your test
16 // and the wait_for_activity() call.
25 // Recovers the this pointer, blocks SIGUSR1, and calls do_work().
26 static void *do_work_thunk(void *arg);
28 virtual void do_work() = 0;
30 // Waits until there is activity of the given type on <fd> (or an error),
31 // or until a wakeup. Returns true if there was actually activity on
32 // the file descriptor.
34 // If fd is -1, wait until a wakeup or timeout.
35 // if timeout_ts is NULL, there is no timeout.
36 bool wait_for_activity(int fd, short events, const timespec *timeout_ts);
38 // Wait until a wakeup.
39 void wait_for_wakeup(const timespec *timeout_ts) { wait_for_activity(-1, 0, timeout_ts); }
41 // Make wait_for_activity() return. Note that this is a relatively expensive
47 // The signal set as it were before we blocked SIGUSR1.
48 sigset_t sigset_without_usr1_block;
51 pthread_t worker_thread;
53 // Protects should_stop_status.
54 pthread_mutex_t should_stop_mutex;
56 // If this is set, the thread should return as soon as possible from do_work().
57 bool should_stop_status;
60 #endif // !defined(_THREAD_H)