diff options
author | Andreas Kling <kling@serenityos.org> | 2022-01-07 00:45:27 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-01-07 00:50:26 +0100 |
commit | 0631d3fed5623c1f2b0d6085ab24e4dd69c6ce99 (patch) | |
tree | 575c446e901381cdb630e792f725331b998576d9 /Userland/Libraries/LibCore | |
parent | f0b500a062c4162a26782412ff72a019a7433c37 (diff) | |
download | serenity-0631d3fed5623c1f2b0d6085ab24e4dd69c6ce99.zip |
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.
Diffstat (limited to 'Userland/Libraries/LibCore')
-rw-r--r-- | Userland/Libraries/LibCore/EventLoop.cpp | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/Userland/Libraries/LibCore/EventLoop.cpp b/Userland/Libraries/LibCore/EventLoop.cpp index 40b5608747..09fc1394c8 100644 --- a/Userland/Libraries/LibCore/EventLoop.cpp +++ b/Userland/Libraries/LibCore/EventLoop.cpp @@ -59,6 +59,8 @@ static Vector<EventLoop&>* s_event_loop_stack; static NeverDestroyed<IDAllocator> s_id_allocator; static HashMap<int, NonnullOwnPtr<EventLoopTimer>>* s_timers; static HashTable<Notifier*>* s_notifiers; +static Threading::Mutex s_notifiers_mutex; + int EventLoop::s_wake_pipe_fds[2]; static RefPtr<InspectorServerConnection> 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& notifier) { + Threading::MutexLocker locker(s_notifiers_mutex); s_notifiers->set(¬ifier); } void EventLoop::unregister_notifier(Badge<Notifier>, Notifier& notifier) { + Threading::MutexLocker locker(s_notifiers_mutex); s_notifiers->remove(¬ifier); } |