+ uatomic_or(&_state, WAITER_TEARDOWN);
+}
+
+lttng::synchro::wait_queue::wait_queue()
+{
+ cds_wfs_init(&_stack);
+}
+
+void lttng::synchro::wait_queue::add(waiter &waiter) noexcept
+{
+ (void) cds_wfs_push(&_stack, &waiter._wait_queue_node);
+}
+
+void lttng::synchro::wait_queue::wake_all()
+{
+ /* Move all waiters from the queue to our local stack. */
+ auto *waiters = __cds_wfs_pop_all(&_stack);
+
+ /* Wake all waiters in our stack head. */
+ cds_wfs_node *iter, *iter_n;
+ cds_wfs_for_each_blocking_safe(waiters, iter, iter_n) {
+ auto& waiter = *lttng::utils::container_of(
+ iter, <tng::synchro::waiter::_wait_queue_node);
+
+ /* Don't wake already running threads. */
+ if (waiter._state & WAITER_RUNNING) {
+ continue;
+ }
+
+ waiter.get_waker().wake();
+ }