X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=src%2Fcommon%2Fwaiter.hpp;h=75c9ac447da2ce1320c9bf6c26d5a1b458abc7c1;hb=HEAD;hp=8ea0c2d83f450ad7ff6da749f57e6e0424c68e13;hpb=f40b76aed659ff694cf948bf8ebd1d4b5741c986;p=lttng-tools.git diff --git a/src/common/waiter.hpp b/src/common/waiter.hpp index 8ea0c2d83..cdd0913cc 100644 --- a/src/common/waiter.hpp +++ b/src/common/waiter.hpp @@ -14,42 +14,85 @@ #include "macros.hpp" -#include +#include #include #include -struct lttng_waiter { - struct cds_wfs_node wait_queue_node; - int32_t state; -}; +namespace lttng { +namespace synchro { +class waiter; +class wait_queue; + +class waker final { + friend waiter; + +public: + waker(const waker&) noexcept = default; + waker(waker&&) noexcept = default; + waker& operator=(const waker& other) noexcept = default; + waker& operator=(waker&& other) noexcept = default; + + void wake(); + + ~waker() = default; -struct lttng_wait_queue { - struct cds_wfs_stack stack; +private: + explicit waker(int32_t& state) noexcept : _state{ state } + { + } + + std::reference_wrapper _state; }; -void lttng_waiter_init(struct lttng_waiter *waiter); +class waiter final { + friend wait_queue; -void lttng_waiter_wait(struct lttng_waiter *waiter); +public: + waiter(); -/* - * lttng_waiter_wake must only be called by a single waker. - * It is invalid for multiple "wake" operations to be invoked - * on a single waiter without re-initializing it before. - */ -void lttng_waiter_wake(struct lttng_waiter *waiter); + /* Deactivate copy and assignment. */ + waiter(const waiter&) = delete; + waiter(waiter&&) = delete; + waiter& operator=(const waiter&) = delete; + waiter& operator=(waiter&&) = delete; + ~waiter() = default; -void lttng_wait_queue_init(struct lttng_wait_queue *queue); + void arm() noexcept; + void wait(); -/* - * Atomically add a waiter to a wait queue. - * A full memory barrier is issued before being added to the wait queue. - */ -void lttng_wait_queue_add(struct lttng_wait_queue *queue, struct lttng_waiter *waiter); + waker get_waker(); -/* - * Wake every waiter present in the wait queue and remove them from - * the queue. - */ -void lttng_wait_queue_wake_all(struct lttng_wait_queue *queue); +private: + cds_wfs_node _wait_queue_node; + int32_t _state; +}; + +class wait_queue final { +public: + wait_queue(); + + /* Deactivate copy and assignment. */ + wait_queue(const wait_queue&) = delete; + wait_queue(wait_queue&&) = delete; + wait_queue& operator=(const wait_queue&) = delete; + wait_queue& operator=(wait_queue&&) = delete; + ~wait_queue() = default; + + /* + * Atomically add a waiter to a wait queue. + * A full memory barrier is issued before being added to the wait queue. + */ + void add(waiter& waiter) noexcept; + /* + * Wake every waiter present in the wait queue and remove them from + * the queue. + */ + void wake_all(); + +private: + cds_wfs_stack _stack; +}; +} /* namespace synchro */ +} /* namespace lttng */ #endif /* LTTNG_WAITER_H */