diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/core/html/parser/HTMLParserThread.cpp')
-rw-r--r-- | chromium/third_party/WebKit/Source/core/html/parser/HTMLParserThread.cpp | 63 |
1 files changed, 57 insertions, 6 deletions
diff --git a/chromium/third_party/WebKit/Source/core/html/parser/HTMLParserThread.cpp b/chromium/third_party/WebKit/Source/core/html/parser/HTMLParserThread.cpp index 5a0e30c3e67..5b5c6939714 100644 --- a/chromium/third_party/WebKit/Source/core/html/parser/HTMLParserThread.cpp +++ b/chromium/third_party/WebKit/Source/core/html/parser/HTMLParserThread.cpp @@ -32,13 +32,15 @@ #include "core/html/parser/HTMLParserThread.h" #include "platform/Task.h" +#include "platform/TaskSynchronizer.h" #include "public/platform/Platform.h" #include "wtf/PassOwnPtr.h" namespace WebCore { +static HTMLParserThread* s_sharedThread = 0; + HTMLParserThread::HTMLParserThread() - : m_thread(adoptPtr(blink::Platform::current()->createThread("HTMLParserThread"))) { } @@ -46,17 +48,66 @@ HTMLParserThread::~HTMLParserThread() { } +void HTMLParserThread::init() +{ + ASSERT(!s_sharedThread); + 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() && s_sharedThread->isRunning()) { + 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() { - static HTMLParserThread* thread; - if (!thread) - thread = new HTMLParserThread; - return thread; + return s_sharedThread; +} + +blink::WebThread& HTMLParserThread::platformThread() +{ + if (!isRunning()) { + m_thread = adoptPtr(blink::Platform::current()->createThread("HTMLParserThread")); + postTask(WTF::bind(&HTMLParserThread::setupHTMLParserThread, this)); + } + return *m_thread; +} + +bool HTMLParserThread::isRunning() +{ + return !!m_thread; } void HTMLParserThread::postTask(const Closure& closure) { - m_thread->postTask(new Task(closure)); + platformThread().postTask(new Task(closure)); } } // namespace WebCore |