Commit 760759bf authored by kinuko@chromium.org's avatar kinuko@chromium.org

Fix data race in blink::WorkerMessagingProxy::reportException

Also make it impossible to access WorkerThread::workerGlobalScope
on a wrong thread at least from outside the class

BUG=520012,460445

Review URL: https://codereview.chromium.org/1305453003

git-svn-id: svn://svn.chromium.org/blink/trunk@200821 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent eab2f94b
......@@ -56,6 +56,12 @@ namespace blink {
namespace {
void processExceptionOnWorkerGlobalScope(int exceptionId, bool isHandled, ExecutionContext* scriptContext)
{
WorkerGlobalScope* globalScope = toWorkerGlobalScope(scriptContext);
globalScope->exceptionHandled(exceptionId, isHandled);
}
void processMessageOnWorkerGlobalScope(PassRefPtr<SerializedScriptValue> message, PassOwnPtr<MessagePortChannelArray> channels, WorkerObjectProxy* workerObjectProxy, ExecutionContext* scriptContext)
{
WorkerGlobalScope* globalScope = toWorkerGlobalScope(scriptContext);
......@@ -166,8 +172,7 @@ void WorkerMessagingProxy::reportException(const String& errorMessage, int lineN
RefPtrWillBeRawPtr<ErrorEvent> event = ErrorEvent::create(errorMessage, sourceURL, lineNumber, columnNumber, nullptr);
bool errorHandled = !m_workerObject->dispatchEvent(event);
postTaskToWorkerGlobalScope(createCrossThreadTask(&WorkerGlobalScope::exceptionHandled, m_workerThread->workerGlobalScope(), exceptionId, errorHandled));
postTaskToWorkerGlobalScope(createCrossThreadTask(&processExceptionOnWorkerGlobalScope, exceptionId, errorHandled));
}
void WorkerMessagingProxy::reportConsoleMessage(MessageSource source, MessageLevel level, const String& message, int lineNumber, const String& sourceURL)
......
......@@ -321,6 +321,12 @@ void WorkerThread::terminateAndWait()
m_terminationEvent->wait();
}
WorkerGlobalScope* WorkerThread::workerGlobalScope()
{
ASSERT(isCurrentThread());
return m_workerGlobalScope.get();
}
bool WorkerThread::terminated()
{
MutexLocker lock(m_threadStateMutex);
......
......@@ -106,7 +106,8 @@ public:
void willEnterNestedLoop();
void didLeaveNestedLoop();
WorkerGlobalScope* workerGlobalScope() const { return m_workerGlobalScope.get(); }
// Can be called only on the worker thread, WorkerGlobalScope is not thread safe.
WorkerGlobalScope* workerGlobalScope();
// Returns true once one of the terminate* methods is called.
bool terminated();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment