summaryrefslogtreecommitdiff
path: root/Kernel/Tasks/WaitQueue.h
diff options
context:
space:
mode:
Diffstat (limited to 'Kernel/Tasks/WaitQueue.h')
-rw-r--r--Kernel/Tasks/WaitQueue.h40
1 files changed, 40 insertions, 0 deletions
diff --git a/Kernel/Tasks/WaitQueue.h b/Kernel/Tasks/WaitQueue.h
new file mode 100644
index 0000000000..a5e60d62aa
--- /dev/null
+++ b/Kernel/Tasks/WaitQueue.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2020, the SerenityOS developers.
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/Atomic.h>
+#include <Kernel/Locking/Spinlock.h>
+#include <Kernel/Tasks/Thread.h>
+
+namespace Kernel {
+
+class WaitQueue final : public Thread::BlockerSet {
+public:
+ u32 wake_one();
+ u32 wake_n(u32 wake_count);
+ u32 wake_all();
+
+ template<class... Args>
+ Thread::BlockResult wait_on(Thread::BlockTimeout const& timeout, Args&&... args)
+ {
+ return Thread::current()->block<Thread::WaitQueueBlocker>(timeout, *this, forward<Args>(args)...);
+ }
+
+ template<class... Args>
+ void wait_forever(Args&&... args)
+ {
+ (void)Thread::current()->block<Thread::WaitQueueBlocker>({}, *this, forward<Args>(args)...);
+ }
+
+protected:
+ virtual bool should_add_blocker(Thread::Blocker& b, void*) override;
+
+private:
+ bool m_wake_requested { false };
+};
+
+}