diff --git a/Source/WTF/wtf/WorkQueue.h b/Source/WTF/wtf/WorkQueue.h index 5ac32f8c69ebe..d9184b4827bf1 100644 --- a/Source/WTF/wtf/WorkQueue.h +++ b/Source/WTF/wtf/WorkQueue.h @@ -116,8 +116,6 @@ class WorkQueue final : public FunctionDispatcher { Lock m_initializeRunLoopConditionMutex; Condition m_initializeRunLoopCondition; RunLoop* m_runLoop; - Lock m_terminateRunLoopConditionMutex; - Condition m_terminateRunLoopCondition; #endif }; diff --git a/Source/WTF/wtf/generic/WorkQueueGeneric.cpp b/Source/WTF/wtf/generic/WorkQueueGeneric.cpp index 5c7b9b7656695..4eeb302092c3c 100644 --- a/Source/WTF/wtf/generic/WorkQueueGeneric.cpp +++ b/Source/WTF/wtf/generic/WorkQueueGeneric.cpp @@ -56,25 +56,14 @@ void WorkQueue::platformInitialize(const char* name, Type, QOS) m_initializeRunLoopCondition.notifyOne(); } m_runLoop->run(); - { - LockHolder locker(m_terminateRunLoopConditionMutex); - m_runLoop = nullptr; - m_terminateRunLoopCondition.notifyOne(); - } }); m_initializeRunLoopCondition.wait(m_initializeRunLoopConditionMutex); } void WorkQueue::platformInvalidate() { - { - LockHolder locker(m_terminateRunLoopConditionMutex); - if (m_runLoop) { - m_runLoop->stop(); - m_terminateRunLoopCondition.wait(m_terminateRunLoopConditionMutex); - } - } - + if (m_runLoop) + m_runLoop->stop(); if (m_workQueueThread) { detachThread(m_workQueueThread); m_workQueueThread = 0; diff --git a/Tools/TestWebKitAPI/Tests/WTF/WorkQueue.cpp b/Tools/TestWebKitAPI/Tests/WTF/WorkQueue.cpp index 74f5dc294483c..7e277e94c47ce 100644 --- a/Tools/TestWebKitAPI/Tests/WTF/WorkQueue.cpp +++ b/Tools/TestWebKitAPI/Tests/WTF/WorkQueue.cpp @@ -200,4 +200,37 @@ TEST(WTF_WorkQueue, DispatchAfter) EXPECT_STREQ(dispatchAfterLabel, m_functionCallOrder[1].c_str()); } +TEST(WTF_WorkQueue, DestroyOnSelf) +{ + Lock lock; + Condition dispatchAfterTestStarted; + Condition dispatchAfterTestCompleted; + bool started = false; + bool completed = false; + + { + LockHolder locker(lock); + { + auto queue = WorkQueue::create("com.apple.WebKit.Test.dispatchAfter"); + queue->dispatchAfter(std::chrono::milliseconds(500), [&](void) { + LockHolder locker(lock); + dispatchAfterTestStarted.wait(lock, [&] { + return started; + }); + completed = true; + dispatchAfterTestCompleted.notifyOne(); + }); + } + started = true; + dispatchAfterTestStarted.notifyOne(); + } + { + LockHolder locker(lock); + dispatchAfterTestCompleted.wait(lock, [&] { + return completed; + }); + WTF::sleep(0.1); + } +} + } // namespace TestWebKitAPI