summaryrefslogtreecommitdiff
path: root/Kernel/DoubleBuffer.h
diff options
context:
space:
mode:
authorTom <tomut@yahoo.com>2020-11-29 16:05:27 -0700
committerAndreas Kling <kling@serenityos.org>2020-11-30 13:17:02 +0100
commit046d6855f5e8a5039b319a47c3018a16d4c2f960 (patch)
tree9021179989bea74ec7d14a4c30d77eb2b2609f23 /Kernel/DoubleBuffer.h
parent6a620562cc7298c2f591a06817ff560c9ef1deac (diff)
downloadserenity-046d6855f5e8a5039b319a47c3018a16d4c2f960.zip
Kernel: Move block condition evaluation out of the Scheduler
This makes the Scheduler a lot leaner by not having to evaluate block conditions every time it is invoked. Instead evaluate them as the states change, and unblock threads at that point. This also implements some more waitid/waitpid/wait features and behavior. For example, WUNTRACED and WNOWAIT are now supported. And wait will now not return EINTR when SIGCHLD is delivered at the same time.
Diffstat (limited to 'Kernel/DoubleBuffer.h')
-rw-r--r--Kernel/DoubleBuffer.h8
1 files changed, 8 insertions, 0 deletions
diff --git a/Kernel/DoubleBuffer.h b/Kernel/DoubleBuffer.h
index b855fb8853..6db3718b8e 100644
--- a/Kernel/DoubleBuffer.h
+++ b/Kernel/DoubleBuffer.h
@@ -29,6 +29,7 @@
#include <AK/Types.h>
#include <Kernel/KBuffer.h>
#include <Kernel/Lock.h>
+#include <Kernel/Thread.h>
#include <Kernel/UserOrKernelBuffer.h>
namespace Kernel {
@@ -53,6 +54,12 @@ public:
size_t space_for_writing() const { return m_space_for_writing; }
+ void set_unblock_callback(Function<void()> callback)
+ {
+ ASSERT(!m_unblock_callback);
+ m_unblock_callback = move(callback);
+ }
+
private:
void flip();
void compute_lockfree_metadata();
@@ -68,6 +75,7 @@ private:
InnerBuffer m_buffer2;
KBuffer m_storage;
+ Function<void()> m_unblock_callback;
size_t m_capacity { 0 };
size_t m_read_buffer_index { 0 };
size_t m_space_for_writing { 0 };