roo_threads
API Documentation for roo_threads
Loading...
Searching...
No Matches
condition_variable.h
Go to the documentation of this file.
1#pragma once
2
4#include "roo_time.h"
5
6#ifdef ROO_THREADS_SINGLETHREADED
7
9
10namespace roo_threads {
11/// @brief Backend namespace for single-threaded synchronization fallbacks.
12namespace singlethreaded {
13
14/// @ingroup roo_threads_api_condition_variable
15/// @copydoc roo_threads::doc::cv_status
16enum class cv_status { no_timeout, timeout };
17
18/// @ingroup roo_threads_api_condition_variable
19/// @brief Single-threaded backend implementation of `roo::condition_variable`.
20/// @copydoc roo_threads::doc::condition_variable
21class condition_variable {
22 public:
23 /// @copydoc roo_threads::doc::condition_variable::condition_variable
24 condition_variable() noexcept {}
25
26 condition_variable(const condition_variable&) = delete;
27 condition_variable& operator=(const condition_variable&) = delete;
28
29 // Untimed wait is left intentionally unimplemented, as it would block
30 // indefinitely.
31 /// @copydoc roo_threads::doc::condition_variable::wait
32 /// @note Not available in single-threaded mode.
33 void wait(unique_lock<mutex>& lock) noexcept;
34
35 // Untimed wait is left intentionally unimplemented, as it would block
36 // indefinitely.
37 /// @copydoc roo_threads::doc::condition_variable::wait
38 /// @note Not available in single-threaded mode.
39 template <class Predicate>
40 void wait(unique_lock<mutex>& lock, Predicate pred);
41
42 /// @copydoc roo_threads::doc::condition_variable::notify_one
43 void notify_one() noexcept {}
44
45 /// @copydoc roo_threads::doc::condition_variable::notify_all
46 void notify_all() noexcept {}
47
48 /// @copydoc roo_threads::doc::condition_variable::wait_until
49 cv_status wait_until(unique_lock<mutex>& lock, const roo_time::Uptime& when) {
50 return wait_for(lock, when - roo_time::Uptime::Now());
51 }
52
53 /// @copydoc roo_threads::doc::condition_variable::wait_until
54 template <typename Predicate>
55 bool wait_until(unique_lock<mutex>& lock, const roo_time::Uptime& when,
56 Predicate p) {
57 while (!p())
58 if (wait_until(lock, when) == cv_status::timeout) return p();
59 return true;
60 }
61
62 /// @copydoc roo_threads::doc::condition_variable::wait_for
63 cv_status wait_for(unique_lock<mutex>& lock,
64 const roo_time::Duration& duration) {
65 roo_time::Delay(duration);
66 return cv_status::timeout;
67 }
68
69 /// @copydoc roo_threads::doc::condition_variable::wait_for
70 template <typename Predicate>
71 bool wait_for(unique_lock<mutex>& lock, const roo_time::Duration& duration,
72 Predicate p) {
73 return wait_until(lock, roo_time::Uptime::Now() + duration, p);
74 }
75};
76
77} // namespace singlethreaded
78} // namespace roo_threads
79
80#endif // ROO_THREADS_SINGLETHREADED
cv_status
Status returned from timed wait operations.