| Index: third_party/WebKit/Source/modules/compositorworker/CompositorWorkerThread.cpp
|
| diff --git a/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerThread.cpp b/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerThread.cpp
|
| index 004e2e6db6cabb502b8a186a003a2d60d4c0c196..e68c9a31986aa39c1290c0153b420f675cce1856 100644
|
| --- a/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerThread.cpp
|
| +++ b/third_party/WebKit/Source/modules/compositorworker/CompositorWorkerThread.cpp
|
| @@ -6,6 +6,7 @@
|
|
|
| #include "bindings/core/v8/V8GCController.h"
|
| #include "bindings/core/v8/V8Initializer.h"
|
| +#include "core/workers/WorkerBackingThread.h"
|
| #include "core/workers/WorkerObjectProxy.h"
|
| #include "core/workers/WorkerThreadStartupData.h"
|
| #include "modules/compositorworker/CompositorWorkerGlobalScope.h"
|
| @@ -17,122 +18,26 @@ namespace blink {
|
|
|
| namespace {
|
|
|
| -void destroyThread(WebThreadSupportingGC* thread)
|
| -{
|
| - ASSERT(isMainThread());
|
| - // The destructor for |thread| will block until all tasks have completed.
|
| - // This guarantees that shutdown will finish before the thread is destroyed.
|
| - delete thread;
|
| -}
|
| -
|
| -class CompositorWorkerSharedState {
|
| +class BackingThreadHolder {
|
| public:
|
| - static CompositorWorkerSharedState& instance()
|
| - {
|
| - DEFINE_THREAD_SAFE_STATIC_LOCAL(CompositorWorkerSharedState, compositorWorkerSharedState, (new CompositorWorkerSharedState()));
|
| - return compositorWorkerSharedState;
|
| - }
|
| -
|
| - WebThreadSupportingGC* compositorWorkerThread()
|
| - {
|
| - MutexLocker lock(m_mutex);
|
| - if (!m_thread && isMainThread()) {
|
| - ASSERT(!m_workerCount);
|
| - WebThread* platformThread = Platform::current()->compositorThread();
|
| - m_thread = WebThreadSupportingGC::createForThread(platformThread);
|
| - }
|
| - return m_thread.get();
|
| - }
|
| -
|
| - void initializeBackingThread()
|
| - {
|
| - MutexLocker lock(m_mutex);
|
| - ASSERT(m_thread->isCurrentThread());
|
| - ++m_workerCount;
|
| - if (m_workerCount > 1)
|
| - return;
|
| -
|
| - m_thread->initialize();
|
| -
|
| - // Initialize the isolate at the same time.
|
| - ASSERT(!m_isolate);
|
| - m_isolate = V8PerIsolateData::initialize();
|
| - V8Initializer::initializeWorker(m_isolate);
|
| -
|
| - OwnPtr<V8IsolateInterruptor> interruptor = adoptPtr(new V8IsolateInterruptor(m_isolate));
|
| - ThreadState::current()->addInterruptor(interruptor.release());
|
| - ThreadState::current()->registerTraceDOMWrappers(m_isolate, V8GCController::traceDOMWrappers);
|
| - }
|
| -
|
| - void shutdownBackingThread()
|
| - {
|
| - MutexLocker lock(m_mutex);
|
| - ASSERT(m_thread->isCurrentThread());
|
| - ASSERT(m_workerCount > 0);
|
| - --m_workerCount;
|
| - if (m_workerCount == 0) {
|
| - m_thread->shutdown();
|
| - Platform::current()->mainThread()->getWebTaskRunner()->postTask(
|
| - BLINK_FROM_HERE, threadSafeBind(destroyThread, AllowCrossThreadAccess(m_thread.leakPtr())));
|
| - }
|
| - }
|
| -
|
| - v8::Isolate* initializeIsolate()
|
| - {
|
| - MutexLocker lock(m_mutex);
|
| - ASSERT(m_thread->isCurrentThread());
|
| - ASSERT(m_isolate);
|
| - // It is safe to use the existing isolate even if TerminateExecution() has been
|
| - // called on it, without calling CancelTerminateExecution().
|
| - return m_isolate;
|
| - }
|
| -
|
| - void willDestroyIsolate()
|
| - {
|
| - MutexLocker lock(m_mutex);
|
| - ASSERT(m_thread->isCurrentThread());
|
| - if (m_workerCount == 1)
|
| - V8PerIsolateData::willBeDestroyed(m_isolate);
|
| - }
|
| -
|
| - void destroyIsolate()
|
| - {
|
| - MutexLocker lock(m_mutex);
|
| - if (!m_thread) {
|
| - ASSERT(m_workerCount == 0);
|
| - V8PerIsolateData::destroy(m_isolate);
|
| - m_isolate = nullptr;
|
| - }
|
| - }
|
| -
|
| - void terminateV8Execution()
|
| + static BackingThreadHolder& instance()
|
| {
|
| - MutexLocker lock(m_mutex);
|
| - ASSERT(isMainThread() || m_thread->isCurrentThread());
|
| - if (m_workerCount > 1)
|
| - return;
|
| -
|
| - m_isolate->TerminateExecution();
|
| - }
|
| -
|
| - bool hasThreadForTest()
|
| - {
|
| - return m_thread;
|
| + DEFINE_THREAD_SAFE_STATIC_LOCAL(BackingThreadHolder, holder, new BackingThreadHolder);
|
| + return holder;
|
| }
|
|
|
| - bool hasIsolateForTest()
|
| + WorkerBackingThread* thread() { return m_thread.get(); }
|
| + void clear() { m_thread = nullptr; }
|
| + void resetForTest()
|
| {
|
| - return m_isolate;
|
| + ASSERT(!m_thread || (m_thread->workerScriptCount() == 0));
|
| + m_thread = WorkerBackingThread::createForTest(Platform::current()->compositorThread());
|
| }
|
|
|
| private:
|
| - CompositorWorkerSharedState() {}
|
| - ~CompositorWorkerSharedState() {}
|
| + BackingThreadHolder() : m_thread(WorkerBackingThread::create(Platform::current()->compositorThread())) {}
|
|
|
| - Mutex m_mutex;
|
| - OwnPtr<WebThreadSupportingGC> m_thread;
|
| - int m_workerCount = 0;
|
| - v8::Isolate* m_isolate = nullptr;
|
| + OwnPtr<WorkerBackingThread> m_thread;
|
| };
|
|
|
| } // namespace
|
| @@ -155,9 +60,9 @@ CompositorWorkerThread::~CompositorWorkerThread()
|
| {
|
| }
|
|
|
| -WebThreadSupportingGC* CompositorWorkerThread::sharedBackingThread()
|
| +WorkerBackingThread& CompositorWorkerThread::workerBackingThread()
|
| {
|
| - return CompositorWorkerSharedState::instance().compositorWorkerThread();
|
| + return *BackingThreadHolder::instance().thread();
|
| }
|
|
|
| WorkerGlobalScope*CompositorWorkerThread::createWorkerGlobalScope(PassOwnPtr<WorkerThreadStartupData> startupData)
|
| @@ -166,54 +71,14 @@ WorkerGlobalScope*CompositorWorkerThread::createWorkerGlobalScope(PassOwnPtr<Wor
|
| return CompositorWorkerGlobalScope::create(this, startupData, m_timeOrigin);
|
| }
|
|
|
| -WebThreadSupportingGC& CompositorWorkerThread::backingThread()
|
| -{
|
| - return *CompositorWorkerSharedState::instance().compositorWorkerThread();
|
| -}
|
| -
|
| -void CompositorWorkerThread::initializeBackingThread()
|
| -{
|
| - TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("compositor-worker"), "CompositorWorkerThread::initializeBackingThread");
|
| - CompositorWorkerSharedState::instance().initializeBackingThread();
|
| -}
|
| -
|
| -void CompositorWorkerThread::shutdownBackingThread()
|
| -{
|
| - TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("compositor-worker"), "CompositorWorkerThread::shutdownBackingThread");
|
| - CompositorWorkerSharedState::instance().shutdownBackingThread();
|
| -}
|
| -
|
| -v8::Isolate* CompositorWorkerThread::initializeIsolate()
|
| -{
|
| - return CompositorWorkerSharedState::instance().initializeIsolate();
|
| -}
|
| -
|
| -void CompositorWorkerThread::willDestroyIsolate()
|
| -{
|
| - TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("compositor-worker"), "CompositorWorkerThread::willDestroyIsolate");
|
| - CompositorWorkerSharedState::instance().willDestroyIsolate();
|
| -}
|
| -
|
| -void CompositorWorkerThread::destroyIsolate()
|
| -{
|
| - TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("compositor-worker"), "CompositorWorkerThread::destroyIsolate");
|
| - CompositorWorkerSharedState::instance().destroyIsolate();
|
| -}
|
| -
|
| -void CompositorWorkerThread::terminateV8Execution()
|
| -{
|
| - TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("compositor-worker"), "CompositorWorkerThread::terminateV8Execution");
|
| - CompositorWorkerSharedState::instance().terminateV8Execution();
|
| -}
|
| -
|
| -bool CompositorWorkerThread::hasThreadForTest()
|
| +void CompositorWorkerThread::clearSharedBackingThread()
|
| {
|
| - return CompositorWorkerSharedState::instance().hasThreadForTest();
|
| + BackingThreadHolder::instance().clear();
|
| }
|
|
|
| -bool CompositorWorkerThread::hasIsolateForTest()
|
| +void CompositorWorkerThread::resetSharedBackingThreadForTest()
|
| {
|
| - return CompositorWorkerSharedState::instance().hasIsolateForTest();
|
| + BackingThreadHolder::instance().resetForTest();
|
| }
|
|
|
| } // namespace blink
|
|
|