diff options
Diffstat (limited to 'Kernel/Tasks/WaitQueue.h')
-rw-r--r-- | Kernel/Tasks/WaitQueue.h | 40 |
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 }; +}; + +} |