X-Git-Url: https://git.sesse.net/?p=cubemap;a=blobdiff_plain;f=thread.h;h=26e648e5332d6a3016d0ec59d4a58b58b09033a8;hp=12aa133d82f77781e6de0b3273e8dc0128232d76;hb=71fc5575037bead8b6e927a1fffd199e4fc4514b;hpb=ba03a3ed19cc8b02d4bb198edfd1c8bee9f28e35 diff --git a/thread.h b/thread.h index 12aa133..26e648e 100644 --- a/thread.h +++ b/thread.h @@ -1,19 +1,12 @@ #ifndef _THREAD_H #define _THREAD_H -#include #include -struct timespec; - -// A thread class with start/stop and signal functionality. -// -// SIGUSR1 is blocked during execution of do_work(), so that you are guaranteed -// to receive it when doing wait_for_activity(), and never elsewhere. This means -// that you can test whatever status flags you'd want before calling -// wait_for_activity(), and then be sure that it actually returns immediately -// if a SIGUSR1 (ie., wakeup()) happened, even if it were sent between your test -// and the wait_for_activity() call. +// A rather generic thread class with start/stop functionality. +// NOTE: stop is somewhat racy (there's no guaranteed breakout from syscalls), +// since signals don't stick. We'll need to figure out something more +// intelligent later, probably based on sending a signal to an fd. class Thread { public: @@ -22,38 +15,21 @@ public: void stop(); protected: - // Recovers the this pointer, blocks SIGUSR1, and calls do_work(). + // Recovers the this pointer, and calls do_work(). static void *do_work_thunk(void *arg); virtual void do_work() = 0; - // Waits until there is activity of the given type on (or an error), - // or until a wakeup. Returns true if there was actually activity on - // the file descriptor. - // - // If fd is -1, wait until a wakeup or timeout. - // if timeout_ts is NULL, there is no timeout. - bool wait_for_activity(int fd, short events, const timespec *timeout_ts); - - // Wait until a wakeup. - void wait_for_wakeup(const timespec *timeout_ts) { wait_for_activity(-1, 0, timeout_ts); } - - // Make wait_for_activity() return. - void wakeup(); + volatile bool should_stop; - bool should_stop(); - - // The signal set as it were before we blocked SIGUSR1. - sigset_t sigset_without_usr1_block; + // A pipe that you can poll on if you want to see when should_stop + // has been set to true; stop() will write a single byte to the pipe + // and then close the other end. + int stop_fd_read; private: pthread_t worker_thread; - - // Protects should_stop_status. - pthread_mutex_t should_stop_mutex; - - // If this is set, the thread should return as soon as possible from do_work(). - bool should_stop_status; + int stop_fd_write; }; #endif // !defined(_THREAD_H)