| Index: Source/core/html/parser/HTMLParserThread.cpp
|
| diff --git a/Source/core/html/parser/HTMLParserThread.cpp b/Source/core/html/parser/HTMLParserThread.cpp
|
| index fe033fbd8d9d02b0b47d254b75d5eca89c041310..8c5dfa2a94037a1f549bbaa30b24f72fbec59805 100644
|
| --- a/Source/core/html/parser/HTMLParserThread.cpp
|
| +++ b/Source/core/html/parser/HTMLParserThread.cpp
|
| @@ -32,6 +32,7 @@
|
| #include "core/html/parser/HTMLParserThread.h"
|
|
|
| #include "platform/Task.h"
|
| +#include "platform/TaskSynchronizer.h"
|
| #include "public/platform/Platform.h"
|
| #include "wtf/PassOwnPtr.h"
|
|
|
| @@ -53,13 +54,38 @@ void HTMLParserThread::init()
|
| s_sharedThread = new HTMLParserThread;
|
| }
|
|
|
| +void HTMLParserThread::setupHTMLParserThread()
|
| +{
|
| + m_pendingGCRunner = adoptPtr(new PendingGCRunner);
|
| + m_messageLoopInterruptor = adoptPtr(new MessageLoopInterruptor(&platformThread()));
|
| + platformThread().addTaskObserver(m_pendingGCRunner.get());
|
| + ThreadState::attach();
|
| + ThreadState::current()->addInterruptor(m_messageLoopInterruptor.get());
|
| +}
|
| +
|
| void HTMLParserThread::shutdown()
|
| {
|
| ASSERT(s_sharedThread);
|
| + // currentThread will always be non-null in production, but can be null in Chromium unit tests.
|
| + if (blink::Platform::current()->currentThread()) {
|
| + TaskSynchronizer taskSynchronizer;
|
| + s_sharedThread->postTask(WTF::bind(&HTMLParserThread::cleanupHTMLParserThread, s_sharedThread, &taskSynchronizer));
|
| + taskSynchronizer.waitForTaskCompletion();
|
| + }
|
| delete s_sharedThread;
|
| s_sharedThread = 0;
|
| }
|
|
|
| +void HTMLParserThread::cleanupHTMLParserThread(TaskSynchronizer* taskSynchronizer)
|
| +{
|
| + ThreadState::current()->removeInterruptor(m_messageLoopInterruptor.get());
|
| + ThreadState::detach();
|
| + platformThread().removeTaskObserver(m_pendingGCRunner.get());
|
| + m_pendingGCRunner = nullptr;
|
| + m_messageLoopInterruptor = nullptr;
|
| + taskSynchronizer->taskCompleted();
|
| +}
|
| +
|
| HTMLParserThread* HTMLParserThread::shared()
|
| {
|
| return s_sharedThread;
|
| @@ -67,8 +93,10 @@ HTMLParserThread* HTMLParserThread::shared()
|
|
|
| blink::WebThread& HTMLParserThread::platformThread()
|
| {
|
| - if (!m_thread)
|
| + if (!m_thread) {
|
| m_thread = adoptPtr(blink::Platform::current()->createThread("HTMLParserThread"));
|
| + postTask(WTF::bind(&HTMLParserThread::setupHTMLParserThread, this));
|
| + }
|
| return *m_thread;
|
| }
|
|
|
|
|