Services: Use direct references to main event loops
Store direct Core::EventLoop references in WebDriver and the Compositor when callbacks post back to the process main loop. The main event loop is intentionally kept alive for the lifetime of these services, so these paths no longer need WeakEventLoopReference guards.
This commit is contained in:
parent
83b293e4f2
commit
b51fde39a2
4 changed files with 14 additions and 25 deletions
|
|
@ -284,13 +284,10 @@ void CompositorState::present_frame(Web::Compositor::CompositorContextId context
|
|||
m_pending_async_presents.append(context_id, viewport_rect, prepared_frame->bitmap_id);
|
||||
auto* pending_present = &m_pending_async_presents.last();
|
||||
|
||||
auto event_loop_reference = Core::EventLoop::current_weak();
|
||||
auto& event_loop = Core::EventLoop::current();
|
||||
auto self = NonnullRefPtr { *this };
|
||||
m_display_list_player->flush_async(*prepared_frame->rendered_surface, [self = move(self), event_loop_reference = move(event_loop_reference), pending_present] {
|
||||
auto event_loop = event_loop_reference->take();
|
||||
if (!event_loop.is_alive())
|
||||
return;
|
||||
event_loop->deferred_invoke([self = move(self), pending_present] {
|
||||
m_display_list_player->flush_async(*prepared_frame->rendered_surface, [self = move(self), &event_loop, pending_present] {
|
||||
event_loop.deferred_invoke([self = move(self), pending_present] {
|
||||
self->did_finish_async_present(*pending_present);
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@ static CVReturn display_link_callback(CVDisplayLinkRef, CVTimeStamp const*, CVTi
|
|||
|
||||
class DisplayLinkState final : public AtomicRefCounted<DisplayLinkState> {
|
||||
public:
|
||||
static RefPtr<DisplayLinkState> create(u64 display_id, NonnullRefPtr<Core::WeakEventLoopReference> event_loop, Function<void()>&& tick_callback)
|
||||
static RefPtr<DisplayLinkState> create(u64 display_id, Core::EventLoop& event_loop, Function<void()>&& tick_callback)
|
||||
{
|
||||
CVDisplayLinkRef display_link = nullptr;
|
||||
|
||||
|
|
@ -88,7 +88,7 @@ public:
|
|||
if (result != kCVReturnSuccess || !display_link)
|
||||
return nullptr;
|
||||
|
||||
auto state = adopt_ref(*new DisplayLinkState(move(event_loop), display_link));
|
||||
auto state = adopt_ref(*new DisplayLinkState(event_loop, display_link));
|
||||
|
||||
# pragma clang diagnostic push
|
||||
# pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
||||
|
|
@ -114,7 +114,7 @@ public:
|
|||
bool consume_tick_request();
|
||||
bool is_valid() const;
|
||||
|
||||
NonnullRefPtr<Core::WeakEventLoopReference> event_loop;
|
||||
Core::EventLoop& event_loop;
|
||||
Function<void()> tick_callback;
|
||||
Atomic<bool> invalidated { false };
|
||||
Atomic<bool> tick_requested { false };
|
||||
|
|
@ -122,8 +122,8 @@ public:
|
|||
NonnullRefPtr<Core::Timer> idle_stop_timer;
|
||||
|
||||
private:
|
||||
DisplayLinkState(NonnullRefPtr<Core::WeakEventLoopReference> event_loop, CVDisplayLinkRef display_link)
|
||||
: event_loop(move(event_loop))
|
||||
DisplayLinkState(Core::EventLoop& event_loop, CVDisplayLinkRef display_link)
|
||||
: event_loop(event_loop)
|
||||
, display_link(display_link)
|
||||
, idle_stop_timer(Core::Timer::create_single_shot(display_link_idle_stop_delay_ms, [this] {
|
||||
stop_display_link_if_idle();
|
||||
|
|
@ -217,7 +217,7 @@ class CVDisplayLinkVSyncScheduler final : public VSyncScheduler {
|
|||
public:
|
||||
static OwnPtr<CVDisplayLinkVSyncScheduler> try_create(u64 display_id, Function<void()>&& tick_callback)
|
||||
{
|
||||
auto state = DisplayLinkState::create(display_id, Core::EventLoop::current_weak(), move(tick_callback));
|
||||
auto state = DisplayLinkState::create(display_id, Core::EventLoop::current(), move(tick_callback));
|
||||
if (!state)
|
||||
return nullptr;
|
||||
return adopt_own(*new CVDisplayLinkVSyncScheduler(state.release_nonnull()));
|
||||
|
|
@ -248,11 +248,7 @@ static CVReturn display_link_callback(CVDisplayLinkRef, CVTimeStamp const*, CVTi
|
|||
if (!state->consume_tick_request())
|
||||
return kCVReturnSuccess;
|
||||
|
||||
auto event_loop = state->event_loop->take();
|
||||
if (!event_loop.is_alive())
|
||||
return kCVReturnSuccess;
|
||||
|
||||
event_loop->deferred_invoke([state = move(state)] {
|
||||
state->event_loop.deferred_invoke([state = move(state)] {
|
||||
if (!state->is_valid())
|
||||
return;
|
||||
state->tick_callback();
|
||||
|
|
|
|||
|
|
@ -128,7 +128,7 @@ Session::Session(NonnullRefPtr<Client> client, JsonObject const& capabilities, S
|
|||
, m_options(capabilities)
|
||||
, m_session_id(move(session_id))
|
||||
, m_session_flags(flags)
|
||||
, m_event_loop(Core::EventLoop::current_weak())
|
||||
, m_event_loop(Core::EventLoop::current())
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -278,9 +278,7 @@ ErrorOr<void> Session::create_server(NonnullRefPtr<ServerPromise> promise)
|
|||
m_web_content_mach_port_server->on_bootstrap_request = [this, promise](auto request) {
|
||||
auto result = m_transport_bootstrap_server.handle_bootstrap_request(request.pid, move(request.reply_port));
|
||||
if (result.is_error()) {
|
||||
auto event_loop = m_event_loop->take();
|
||||
VERIFY(event_loop);
|
||||
event_loop->deferred_invoke([promise, error = result.release_error()]() mutable {
|
||||
m_event_loop.deferred_invoke([promise, error = result.release_error()]() mutable {
|
||||
promise->resolve(move(error));
|
||||
});
|
||||
return;
|
||||
|
|
@ -291,9 +289,7 @@ ErrorOr<void> Session::create_server(NonnullRefPtr<ServerPromise> promise)
|
|||
VERIFY_NOT_REACHED();
|
||||
},
|
||||
[this, promise](IPC::TransportBootstrapMachServer::OnDemandTransport& transport) {
|
||||
auto event_loop = m_event_loop->take();
|
||||
VERIFY(event_loop);
|
||||
event_loop->deferred_invoke([this, promise, transport = move(transport.ports)]() mutable {
|
||||
m_event_loop.deferred_invoke([this, promise, transport = move(transport.ports)]() mutable {
|
||||
if (auto result = accept_web_content_transport(make<IPC::Transport>(move(transport.receive_right), move(transport.send_right)), promise); result.is_error())
|
||||
promise->resolve(result.release_error());
|
||||
});
|
||||
|
|
|
|||
|
|
@ -112,7 +112,7 @@ private:
|
|||
|
||||
ByteString m_web_content_endpoint;
|
||||
Optional<Core::Process> m_browser_process;
|
||||
NonnullRefPtr<Core::WeakEventLoopReference> m_event_loop;
|
||||
Core::EventLoop& m_event_loop;
|
||||
|
||||
#if defined(AK_OS_MACOS)
|
||||
OwnPtr<IPC::MachBootstrapListener> m_web_content_mach_port_server;
|
||||
|
|
|
|||
Loading…
Reference in a new issue