X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=src%2Fcommon%2Fwaiter.hpp;h=7f5c2f171f4e10448e011cff42a0cc7022d05a85;hb=32670d719327feb585374283a50eeb76ce36b962;hp=8ea0c2d83f450ad7ff6da749f57e6e0424c68e13;hpb=75f62e5383c6ea1f62fb488a94f4a8f98400db71;p=lttng-tools.git diff --git a/src/common/waiter.hpp b/src/common/waiter.hpp index 8ea0c2d83..7f5c2f171 100644 --- a/src/common/waiter.hpp +++ b/src/common/waiter.hpp @@ -18,38 +18,89 @@ #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 { + friend waiter; + +public: + waker(const waker&) = default; + waker(waker&&) = default; + waker& operator=(const waker& other) + { + _state = other._state; + return *this; + } + waker& operator=(waker&& other) + { + _state = other._state; + return *this; + } + + void wake(); + + ~waker() = default; -struct lttng_wait_queue { - struct cds_wfs_stack stack; +private: + waker(int32_t& state) : _state{ state } + { + } + + int32_t& _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 */