Jelajahi Sumber

LibCore: Cancel jobs on event loop exit

This important feature was regressed with the recent architectural
change.
kleines Filmröllchen 2 tahun lalu
induk
melakukan
7704d89496

+ 1 - 0
Userland/Libraries/LibCore/EventLoop.cpp

@@ -48,6 +48,7 @@ EventLoop& EventLoop::current()
 
 
 void EventLoop::quit(int code)
 void EventLoop::quit(int code)
 {
 {
+    ThreadEventQueue::current().cancel_all_pending_jobs();
     m_impl->quit(code);
     m_impl->quit(code);
 }
 }
 
 

+ 10 - 0
Userland/Libraries/LibCore/ThreadEventQueue.cpp

@@ -11,6 +11,7 @@
 #include <LibCore/Promise.h>
 #include <LibCore/Promise.h>
 #include <LibCore/ThreadEventQueue.h>
 #include <LibCore/ThreadEventQueue.h>
 #include <LibThreading/Mutex.h>
 #include <LibThreading/Mutex.h>
+#include <errno.h>
 
 
 namespace Core {
 namespace Core {
 
 
@@ -76,6 +77,15 @@ void ThreadEventQueue::add_job(NonnullRefPtr<Promise<NonnullRefPtr<Object>>> pro
     m_private->pending_promises.append(move(promise));
     m_private->pending_promises.append(move(promise));
 }
 }
 
 
+void ThreadEventQueue::cancel_all_pending_jobs()
+{
+    Threading::MutexLocker lock(m_private->mutex);
+    for (auto const& promise : m_private->pending_promises)
+        promise->cancel(Error::from_errno(ECANCELED));
+
+    m_private->pending_promises.clear();
+}
+
 size_t ThreadEventQueue::process()
 size_t ThreadEventQueue::process()
 {
 {
     decltype(m_private->queued_events) events;
     decltype(m_private->queued_events) events;

+ 1 - 0
Userland/Libraries/LibCore/ThreadEventQueue.h

@@ -29,6 +29,7 @@ public:
 
 
     // Used by Threading::BackgroundAction.
     // Used by Threading::BackgroundAction.
     void add_job(NonnullRefPtr<Promise<NonnullRefPtr<Object>>>);
     void add_job(NonnullRefPtr<Promise<NonnullRefPtr<Object>>>);
+    void cancel_all_pending_jobs();
 
 
     // Returns true if there are events waiting to be flushed.
     // Returns true if there are events waiting to be flushed.
     bool has_pending_events() const;
     bool has_pending_events() const;