diff options
Diffstat (limited to 'Userland/Libraries/LibCore')
-rw-r--r-- | Userland/Libraries/LibCore/EventLoop.cpp | 15 | ||||
-rw-r--r-- | Userland/Libraries/LibCore/EventLoop.h | 13 |
2 files changed, 23 insertions, 5 deletions
diff --git a/Userland/Libraries/LibCore/EventLoop.cpp b/Userland/Libraries/LibCore/EventLoop.cpp index 2c2a9f6fe1..42734be04d 100644 --- a/Userland/Libraries/LibCore/EventLoop.cpp +++ b/Userland/Libraries/LibCore/EventLoop.cpp @@ -302,7 +302,8 @@ private: }; EventLoop::EventLoop([[maybe_unused]] MakeInspectable make_inspectable) - : m_private(make<Private>()) + : m_wake_pipe_fds(&s_wake_pipe_fds) + , m_private(make<Private>()) { #ifdef __serenity__ if (!s_global_initializers_ran) { @@ -487,11 +488,13 @@ size_t EventLoop::pump(WaitMode mode) return processed_events; } -void EventLoop::post_event(Object& receiver, NonnullOwnPtr<Event>&& event) +void EventLoop::post_event(Object& receiver, NonnullOwnPtr<Event>&& event, ShouldWake should_wake) { Threading::MutexLocker lock(m_private->lock); dbgln_if(EVENTLOOP_DEBUG, "Core::EventLoop::post_event: ({}) << receiver={}, event={}", m_queued_events.size(), receiver, event); m_queued_events.empend(receiver, move(event)); + if (should_wake == ShouldWake::Yes) + wake(); } SignalHandlers::SignalHandlers(int signo, void (*handle_signal)(int)) @@ -839,10 +842,16 @@ void EventLoop::unregister_notifier(Badge<Notifier>, Notifier& notifier) s_notifiers->remove(¬ifier); } +void EventLoop::wake_current() +{ + EventLoop::current().wake(); +} + void EventLoop::wake() { + dbgln_if(EVENTLOOP_DEBUG, "Core::EventLoop::wake()"); int wake_event = 0; - int nwritten = write(s_wake_pipe_fds[1], &wake_event, sizeof(wake_event)); + int nwritten = write((*m_wake_pipe_fds)[1], &wake_event, sizeof(wake_event)); if (nwritten < 0) { perror("EventLoop::wake: write"); VERIFY_NOT_REACHED(); diff --git a/Userland/Libraries/LibCore/EventLoop.h b/Userland/Libraries/LibCore/EventLoop.h index dbdaa146c1..294be5bbec 100644 --- a/Userland/Libraries/LibCore/EventLoop.h +++ b/Userland/Libraries/LibCore/EventLoop.h @@ -34,6 +34,11 @@ public: Yes, }; + enum class ShouldWake { + No, + Yes + }; + explicit EventLoop(MakeInspectable = MakeInspectable::No); ~EventLoop(); static void initialize_wake_pipes(); @@ -51,7 +56,7 @@ public: void spin_until(Function<bool()>); - void post_event(Object& receiver, NonnullOwnPtr<Event>&&); + void post_event(Object& receiver, NonnullOwnPtr<Event>&&, ShouldWake = ShouldWake::No); template<typename Callback> static decltype(auto) with_main_locked(Callback callback) @@ -79,7 +84,8 @@ public: m_queued_events.extend(move(other.m_queued_events)); } - static void wake(); + static void wake_current(); + void wake(); static int register_signal(int signo, Function<void(int)> handler); static void unregister_signal(int handler_id); @@ -126,6 +132,9 @@ private: static thread_local int s_wake_pipe_fds[2]; static thread_local bool s_wake_pipe_initialized; + // The wake pipe of this event loop needs to be accessible from other threads. + int (*m_wake_pipe_fds)[2]; + struct Private; NonnullOwnPtr<Private> m_private; }; |