summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2022-01-07 00:45:27 +0100
committerAndreas Kling <kling@serenityos.org>2022-01-07 00:50:26 +0100
commit0631d3fed5623c1f2b0d6085ab24e4dd69c6ce99 (patch)
tree575c446e901381cdb630e792f725331b998576d9 /Userland
parentf0b500a062c4162a26782412ff72a019a7433c37 (diff)
downloadserenity-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')
-rw-r--r--Userland/Libraries/LibCore/EventLoop.cpp23
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(&notifier);
}
void EventLoop::unregister_notifier(Badge<Notifier>, Notifier& notifier)
{
+ Threading::MutexLocker locker(s_notifiers_mutex);
s_notifiers->remove(&notifier);
}