From 0631d3fed5623c1f2b0d6085ab24e4dd69c6ce99 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 7 Jan 2022 00:45:27 +0100 Subject: [PATCH] LibCore: Guard access to EventLoop notifiers set with a mutex This fixes a CI flake we've been seeing lately in TestLibCoreStream. The solution itself is somewhat of a stop-gap as there are more thorough event loop threading improvements in the works. --- Userland/Libraries/LibCore/EventLoop.cpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/Userland/Libraries/LibCore/EventLoop.cpp b/Userland/Libraries/LibCore/EventLoop.cpp index 40b56087472..09fc1394c81 100644 --- a/Userland/Libraries/LibCore/EventLoop.cpp +++ b/Userland/Libraries/LibCore/EventLoop.cpp @@ -59,6 +59,8 @@ static Vector* s_event_loop_stack; static NeverDestroyed s_id_allocator; static HashMap>* s_timers; static HashTable* s_notifiers; +static Threading::Mutex s_notifiers_mutex; + int EventLoop::s_wake_pipe_fds[2]; static RefPtr s_inspector_server_connection; @@ -605,13 +607,17 @@ retry: int max_fd_added = -1; add_fd_to_set(s_wake_pipe_fds[0], rfds); max_fd = max(max_fd, max_fd_added); - for (auto& notifier : *s_notifiers) { - if (notifier->event_mask() & Notifier::Read) - add_fd_to_set(notifier->fd(), rfds); - if (notifier->event_mask() & Notifier::Write) - add_fd_to_set(notifier->fd(), wfds); - if (notifier->event_mask() & Notifier::Exceptional) - VERIFY_NOT_REACHED(); + + { + Threading::MutexLocker locker(s_notifiers_mutex); + for (auto& notifier : *s_notifiers) { + if (notifier->event_mask() & Notifier::Read) + add_fd_to_set(notifier->fd(), rfds); + if (notifier->event_mask() & Notifier::Write) + add_fd_to_set(notifier->fd(), wfds); + if (notifier->event_mask() & Notifier::Exceptional) + VERIFY_NOT_REACHED(); + } } bool queued_events_is_empty; @@ -698,6 +704,7 @@ try_select_again: if (!marked_fd_count) return; + Threading::MutexLocker locker(s_notifiers_mutex); for (auto& notifier : *s_notifiers) { if (FD_ISSET(notifier->fd(), &rfds)) { if (notifier->event_mask() & Notifier::Event::Read) @@ -763,11 +770,13 @@ bool EventLoop::unregister_timer(int timer_id) void EventLoop::register_notifier(Badge, Notifier& notifier) { + Threading::MutexLocker locker(s_notifiers_mutex); s_notifiers->set(¬ifier); } void EventLoop::unregister_notifier(Badge, Notifier& notifier) { + Threading::MutexLocker locker(s_notifiers_mutex); s_notifiers->remove(¬ifier); }