LibCore: Remove awkward EventLoop::wake_once() API

This was used in exactly one place, to avoid sending multiple
CustomEvents to the enqueuer thread in Audio::ConnectionToServer.

Instead of this, we now just send a CustomEvent and wake the enqueuer
thread. If it wakes up and has multiple CustomEvents, they get delivered
and ignored in no time anyway. Since they only get ignored if there's
no work to be done, this seems harmless.
This commit is contained in:
Andreas Kling 2023-04-23 18:20:38 +02:00
parent 896d1e4f42
commit 9601b516b8
3 changed files with 7 additions and 31 deletions

View file

@ -69,7 +69,8 @@ ErrorOr<void> ConnectionToServer::async_enqueue(FixedArray<Sample>&& samples)
update_good_sleep_time(); update_good_sleep_time();
m_user_queue->append(move(samples)); m_user_queue->append(move(samples));
// Wake the background thread to make sure it starts enqueuing audio. // Wake the background thread to make sure it starts enqueuing audio.
m_enqueuer_loop->wake_once(*this, 0); m_enqueuer_loop->post_event(*this, make<Core::CustomEvent>(0));
m_enqueuer_loop->wake();
async_start_playback(); async_start_playback();
return {}; return {};

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> * Copyright (c) 2018-2023, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2022, kleines Filmröllchen <malu.bertsch@gmail.com> * Copyright (c) 2022, kleines Filmröllchen <malu.bertsch@gmail.com>
* Copyright (c) 2022, the SerenityOS developers. * Copyright (c) 2022, the SerenityOS developers.
* *
@ -518,30 +518,11 @@ size_t EventLoop::pump(WaitMode mode)
return processed_events; return processed_events;
} }
void EventLoop::post_event(Object& receiver, NonnullOwnPtr<Event>&& event, ShouldWake should_wake) void EventLoop::post_event(Object& receiver, NonnullOwnPtr<Event>&& event)
{ {
Threading::MutexLocker lock(m_private->lock); Threading::MutexLocker lock(m_private->lock);
dbgln_if(EVENTLOOP_DEBUG, "Core::EventLoop::post_event: ({}) << receiver={}, event={}", m_queued_events.size(), receiver, event); dbgln_if(EVENTLOOP_DEBUG, "Core::EventLoop::post_event: ({}) << receiver={}, event={}", m_queued_events.size(), receiver, event);
m_queued_events.empend(receiver, move(event)); m_queued_events.empend(receiver, move(event));
if (should_wake == ShouldWake::Yes)
wake();
}
void EventLoop::wake_once(Object& receiver, int custom_event_type)
{
Threading::MutexLocker lock(m_private->lock);
dbgln_if(EVENTLOOP_DEBUG, "Core::EventLoop::wake_once: event type {}", custom_event_type);
auto identical_events = m_queued_events.find_if([&](auto& queued_event) {
if (queued_event.receiver.is_null())
return false;
auto const& event = queued_event.event;
auto is_receiver_identical = queued_event.receiver.ptr() == &receiver;
auto event_id_matches = event->type() == Event::Type::Custom && static_cast<CustomEvent const*>(event.ptr())->custom_type() == custom_event_type;
return is_receiver_identical && event_id_matches;
});
// Event is not in the queue yet, so we want to wake.
if (identical_events.is_end())
post_event(receiver, make<CustomEvent>(custom_event_type), ShouldWake::Yes);
} }
void EventLoop::add_job(NonnullRefPtr<Promise<NonnullRefPtr<Object>>> job_promise) void EventLoop::add_job(NonnullRefPtr<Promise<NonnullRefPtr<Object>>> job_promise)

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> * Copyright (c) 2018-2023, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2022, kleines Filmröllchen <filmroellchen@serenityos.org> * Copyright (c) 2022, kleines Filmröllchen <filmroellchen@serenityos.org>
* Copyright (c) 2022, the SerenityOS developers. * Copyright (c) 2022, the SerenityOS developers.
* *
@ -55,11 +55,6 @@ public:
Yes, Yes,
}; };
enum class ShouldWake {
No,
Yes
};
enum class WaitMode { enum class WaitMode {
WaitForEvents, WaitForEvents,
PollForEvents, PollForEvents,
@ -82,9 +77,8 @@ public:
// Pump the event loop until some condition is met. // Pump the event loop until some condition is met.
void spin_until(Function<bool()>); void spin_until(Function<bool()>);
// Post an event to this event loop and possibly wake the loop. // Post an event to this event loop.
void post_event(Object& receiver, NonnullOwnPtr<Event>&&, ShouldWake = ShouldWake::No); void post_event(Object& receiver, NonnullOwnPtr<Event>&&);
void wake_once(Object& receiver, int custom_event_type);
void add_job(NonnullRefPtr<Promise<NonnullRefPtr<Object>>> job_promise); void add_job(NonnullRefPtr<Promise<NonnullRefPtr<Object>>> job_promise);