mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 13:07:46 +00:00
LibCore: Allow event loops on other threads to wake up
Because the wake pipe is thread-local, it was previously not possible to wake an event loop across a thread. Therefore, this commit rearchitects event loop waking by making the wake function a member of the event loop itself and having it keep a pointer to its thread's wake pipe. The global wake() function calls wake on the current thread's event loop. This also fixes a bug in BackgroundAction: it should wake the event loop it was created on, instead of the current thread's event loop.
This commit is contained in:
parent
716a3429fa
commit
704bb361bb
4 changed files with 27 additions and 9 deletions
|
@ -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();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue