diff --git a/Libraries/LibCore/Event.h b/Libraries/LibCore/Event.h index f7f8033e18..142febfb1b 100644 --- a/Libraries/LibCore/Event.h +++ b/Libraries/LibCore/Event.h @@ -42,21 +42,6 @@ private: bool m_accepted { true }; }; -class DeferredInvocationEvent : public Event { - friend class EventLoop; - friend class ThreadEventQueue; - -public: - DeferredInvocationEvent(Function&& invokee) - : Event(Event::Type::DeferredInvoke) - , m_invokee(move(invokee)) - { - } - -private: - Function m_invokee; -}; - class TimerEvent final : public Event { public: explicit TimerEvent() diff --git a/Libraries/LibCore/EventLoop.cpp b/Libraries/LibCore/EventLoop.cpp index 7df33f3fdc..7afce6c28f 100644 --- a/Libraries/LibCore/EventLoop.cpp +++ b/Libraries/LibCore/EventLoop.cpp @@ -149,7 +149,7 @@ void EventLoop::wake() void EventLoop::deferred_invoke(Function invokee) { - m_impl->post_event(nullptr, make(move(invokee))); + m_impl->deferred_invoke(move(invokee)); } void deferred_invoke(Function invokee) diff --git a/Libraries/LibCore/EventLoopImplementation.cpp b/Libraries/LibCore/EventLoopImplementation.cpp index 322d9370e7..a42c7c9535 100644 --- a/Libraries/LibCore/EventLoopImplementation.cpp +++ b/Libraries/LibCore/EventLoopImplementation.cpp @@ -23,6 +23,11 @@ EventLoopImplementation::EventLoopImplementation() EventLoopImplementation::~EventLoopImplementation() = default; +void EventLoopImplementation::deferred_invoke(Function&& invokee) +{ + m_thread_event_queue.deferred_invoke(move(invokee)); +} + static EventLoopManager* s_event_loop_manager = nullptr; EventLoopManager& EventLoopManager::the() { diff --git a/Libraries/LibCore/EventLoopImplementation.h b/Libraries/LibCore/EventLoopImplementation.h index d644c26f05..8f13a01e58 100644 --- a/Libraries/LibCore/EventLoopImplementation.h +++ b/Libraries/LibCore/EventLoopImplementation.h @@ -56,6 +56,8 @@ public: virtual void post_event(EventReceiver*, NonnullOwnPtr&&) = 0; + virtual void deferred_invoke(Function&&); + protected: EventLoopImplementation(); ThreadEventQueue& m_thread_event_queue; diff --git a/Libraries/LibCore/ThreadEventQueue.cpp b/Libraries/LibCore/ThreadEventQueue.cpp index d16d136838..72cd3bc4d2 100644 --- a/Libraries/LibCore/ThreadEventQueue.cpp +++ b/Libraries/LibCore/ThreadEventQueue.cpp @@ -34,10 +34,17 @@ struct ThreadEventQueue::Private { { } + QueuedEvent(Function&& invokee) + : m_invokee(move(invokee)) + , event_type(Event::Type::DeferredInvoke) + { + } + ~QueuedEvent() = default; WeakPtr receiver; OwnPtr event; + Function m_invokee; u8 event_type { Event::Type::Invalid }; }; @@ -92,6 +99,15 @@ void ThreadEventQueue::post_event(Core::EventReceiver* receiver, Core::Event::Ty Core::EventLoopManager::the().did_post_event(); } +void ThreadEventQueue::deferred_invoke(Function&& invokee) +{ + { + Threading::MutexLocker lock(m_private->mutex); + m_private->queued_events.empend(move(invokee)); + } + Core::EventLoopManager::the().did_post_event(); +} + void ThreadEventQueue::add_job(NonnullRefPtr>> promise) { Threading::MutexLocker lock(m_private->mutex); @@ -136,7 +152,7 @@ size_t ThreadEventQueue::process() } } else { if (queued_event.event_type == Event::Type::DeferredInvoke) { - static_cast(*queued_event.event).m_invokee(); + queued_event.m_invokee(); } else { // Receiver gone, drop the event. } diff --git a/Libraries/LibCore/ThreadEventQueue.h b/Libraries/LibCore/ThreadEventQueue.h index ab8d6f52b9..5ef23e6491 100644 --- a/Libraries/LibCore/ThreadEventQueue.h +++ b/Libraries/LibCore/ThreadEventQueue.h @@ -29,6 +29,9 @@ public: void post_event(EventReceiver*, NonnullOwnPtr); void post_event(EventReceiver*, Core::Event::Type); + // Post a deferred invocation to the event queue. + void deferred_invoke(Function&&); + // Used by Threading::BackgroundAction. void add_job(NonnullRefPtr>>); void cancel_all_pending_jobs();