X-Git-Url: https://git.sesse.net/?p=nageru;a=blobdiff_plain;f=quittable_sleeper.h;h=71e49f7731de3d49359f32cf048bcb639a7294a0;hp=ba00e73b1184e9d388c04867b080773247547820;hb=703e00da89118df9be0354dda621bed023e6030e;hpb=f07adb19f0e2571bf4894ec57e6fcfe4a3e5fd95 diff --git a/quittable_sleeper.h b/quittable_sleeper.h index ba00e73..71e49f7 100644 --- a/quittable_sleeper.h +++ b/quittable_sleeper.h @@ -26,33 +26,47 @@ public: should_quit_var = false; } + void wakeup() + { + std::lock_guard l(mu); + should_wakeup_var = true; + quit_cond.notify_all(); + } + bool should_quit() const { std::lock_guard l(mu); return should_quit_var; } + // Returns false if woken up early. template - void sleep_for(const std::chrono::duration &duration) + bool sleep_for(const std::chrono::duration &duration) { std::chrono::steady_clock::time_point t = std::chrono::steady_clock::now() + std::chrono::duration_cast(duration); - sleep_until(t); + return sleep_until(t); } + // Returns false if woken up early. template - void sleep_until(const std::chrono::time_point &t) + bool sleep_until(const std::chrono::time_point &t) { std::unique_lock lock(mu); quit_cond.wait_until(lock, t, [this]{ - return should_quit_var; + return should_quit_var || should_wakeup_var; }); + if (should_wakeup_var) { + should_wakeup_var = false; + return false; + } + return !should_quit_var; } private: mutable std::mutex mu; - bool should_quit_var = false; + bool should_quit_var = false, should_wakeup_var = false; std::condition_variable quit_cond; };