summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/core/html/parser/HTMLParserThread.cpp
diff options
context:
space:
mode:
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.cpp63
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