| Index: third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp
|
| diff --git a/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp b/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp
|
| index ba8f1427a912edba0dc49c6a53572564871a47bf..35343b41a748d01cf95f976e26168e470322a0b7 100644
|
| --- a/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp
|
| +++ b/third_party/WebKit/Source/core/loader/WorkerThreadableLoader.cpp
|
| @@ -48,6 +48,7 @@
|
| #include "public/platform/Platform.h"
|
| #include "wtf/PtrUtil.h"
|
| #include "wtf/Vector.h"
|
| +#include "wtf/debug/Alias.h"
|
| #include <memory>
|
|
|
| namespace blink {
|
| @@ -136,12 +137,12 @@ void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadStart(std::unique_p
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::createLoaderInMainThread(const ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderOptions)
|
| {
|
| - m_loaderProxy->postTaskToLoader(createCrossThreadTask(&MainThreadBridgeBase::mainThreadCreateLoader, crossThreadUnretained(this), options, resourceLoaderOptions));
|
| + m_loaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(&MainThreadBridgeBase::mainThreadCreateLoader, crossThreadUnretained(this), options, resourceLoaderOptions));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::startInMainThread(const ResourceRequest& request, const WorkerGlobalScope& workerGlobalScope)
|
| {
|
| - loaderProxy()->postTaskToLoader(createCrossThreadTask(&MainThreadBridgeBase::mainThreadStart, crossThreadUnretained(this), request));
|
| + loaderProxy()->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(&MainThreadBridgeBase::mainThreadStart, crossThreadUnretained(this), request));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadDestroy(ExecutionContext* context)
|
| @@ -162,7 +163,7 @@ void WorkerThreadableLoader::MainThreadBridgeBase::destroy()
|
|
|
| // "delete this" and m_mainThreadLoader::deref() on the worker object's
|
| // thread.
|
| - m_loaderProxy->postTaskToLoader(createCrossThreadTask(&MainThreadBridgeBase::mainThreadDestroy, crossThreadUnretained(this)));
|
| + m_loaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(&MainThreadBridgeBase::mainThreadDestroy, crossThreadUnretained(this)));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadOverrideTimeout(unsigned long timeoutMilliseconds, ExecutionContext* context)
|
| @@ -177,7 +178,7 @@ void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadOverrideTimeout(uns
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::overrideTimeout(unsigned long timeoutMilliseconds)
|
| {
|
| - m_loaderProxy->postTaskToLoader(createCrossThreadTask(&MainThreadBridgeBase::mainThreadOverrideTimeout, crossThreadUnretained(this), timeoutMilliseconds));
|
| + m_loaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(&MainThreadBridgeBase::mainThreadOverrideTimeout, crossThreadUnretained(this), timeoutMilliseconds));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadCancel(ExecutionContext* context)
|
| @@ -193,7 +194,7 @@ void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadCancel(ExecutionCon
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::cancel()
|
| {
|
| - m_loaderProxy->postTaskToLoader(createCrossThreadTask(&MainThreadBridgeBase::mainThreadCancel, crossThreadUnretained(this)));
|
| + m_loaderProxy->postTaskToLoader(BLINK_FROM_HERE, createCrossThreadTask(&MainThreadBridgeBase::mainThreadCancel, crossThreadUnretained(this)));
|
| ThreadableLoaderClientWrapper* clientWrapper = m_workerClientWrapper;
|
| if (!clientWrapper->done()) {
|
| // If the client hasn't reached a termination state, then transition it
|
| @@ -214,52 +215,52 @@ void WorkerThreadableLoader::MainThreadBridgeBase::cancel()
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent)
|
| {
|
| - forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::didSendData, m_workerClientWrapper, bytesSent, totalBytesToBeSent));
|
| + forwardTaskToWorker(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didSendData, m_workerClientWrapper, bytesSent, totalBytesToBeSent));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveResponse(unsigned long identifier, const ResourceResponse& response, std::unique_ptr<WebDataConsumerHandle> handle)
|
| {
|
| - forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveResponse, m_workerClientWrapper, identifier, response, passed(std::move(handle))));
|
| + forwardTaskToWorker(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveResponse, m_workerClientWrapper, identifier, response, passed(std::move(handle))));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveData(const char* data, unsigned dataLength)
|
| {
|
| - forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveData, m_workerClientWrapper, passed(createVectorFromMemoryRegion(data, dataLength))));
|
| + forwardTaskToWorker(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveData, m_workerClientWrapper, passed(createVectorFromMemoryRegion(data, dataLength))));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didDownloadData(int dataLength)
|
| {
|
| - forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::didDownloadData, m_workerClientWrapper, dataLength));
|
| + forwardTaskToWorker(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didDownloadData, m_workerClientWrapper, dataLength));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveCachedMetadata(const char* data, int dataLength)
|
| {
|
| - forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveCachedMetadata, m_workerClientWrapper, passed(createVectorFromMemoryRegion(data, dataLength))));
|
| + forwardTaskToWorker(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveCachedMetadata, m_workerClientWrapper, passed(createVectorFromMemoryRegion(data, dataLength))));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didFinishLoading(unsigned long identifier, double finishTime)
|
| {
|
| - forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClientWrapper::didFinishLoading, m_workerClientWrapper, identifier, finishTime));
|
| + forwardTaskToWorkerOnLoaderDone(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didFinishLoading, m_workerClientWrapper, identifier, finishTime));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didFail(const ResourceError& error)
|
| {
|
| - forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClientWrapper::didFail, m_workerClientWrapper, error));
|
| + forwardTaskToWorkerOnLoaderDone(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didFail, m_workerClientWrapper, error));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didFailAccessControlCheck(const ResourceError& error)
|
| {
|
| - forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClientWrapper::didFailAccessControlCheck, m_workerClientWrapper, error));
|
| + forwardTaskToWorkerOnLoaderDone(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didFailAccessControlCheck, m_workerClientWrapper, error));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didFailRedirectCheck()
|
| {
|
| - forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClientWrapper::didFailRedirectCheck, m_workerClientWrapper));
|
| + forwardTaskToWorkerOnLoaderDone(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didFailRedirectCheck, m_workerClientWrapper));
|
| }
|
|
|
| void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveResourceTiming(const ResourceTimingInfo& info)
|
| {
|
| - forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveResourceTiming, m_workerClientWrapper, info));
|
| + forwardTaskToWorker(BLINK_FROM_HERE, createCrossThreadTask(&ThreadableLoaderClientWrapper::didReceiveResourceTiming, m_workerClientWrapper, info));
|
| }
|
|
|
| WorkerThreadableLoader::MainThreadAsyncBridge::MainThreadAsyncBridge(
|
| @@ -281,14 +282,14 @@ WorkerThreadableLoader::MainThreadAsyncBridge::~MainThreadAsyncBridge()
|
| {
|
| }
|
|
|
| -void WorkerThreadableLoader::MainThreadAsyncBridge::forwardTaskToWorker(std::unique_ptr<ExecutionContextTask> task)
|
| +void WorkerThreadableLoader::MainThreadAsyncBridge::forwardTaskToWorker(const WebTraceLocation& location, std::unique_ptr<ExecutionContextTask> task)
|
| {
|
| - loaderProxy()->postTaskToWorkerGlobalScope(std::move(task));
|
| + loaderProxy()->postTaskToWorkerGlobalScope(location, std::move(task));
|
| }
|
|
|
| -void WorkerThreadableLoader::MainThreadAsyncBridge::forwardTaskToWorkerOnLoaderDone(std::unique_ptr<ExecutionContextTask> task)
|
| +void WorkerThreadableLoader::MainThreadAsyncBridge::forwardTaskToWorkerOnLoaderDone(const WebTraceLocation& location, std::unique_ptr<ExecutionContextTask> task)
|
| {
|
| - loaderProxy()->postTaskToWorkerGlobalScope(std::move(task));
|
| + loaderProxy()->postTaskToWorkerGlobalScope(location, std::move(task));
|
| }
|
|
|
| WorkerThreadableLoader::MainThreadSyncBridge::MainThreadSyncBridge(
|
| @@ -328,42 +329,54 @@ void WorkerThreadableLoader::MainThreadSyncBridge::start(const ResourceRequest&
|
| // The following code must be run only after |m_loaderDoneEvent| is
|
| // signalled.
|
|
|
| - Vector<std::unique_ptr<ExecutionContextTask>> tasks;
|
| + Vector<ClientTask> tasks;
|
| {
|
| MutexLocker lock(m_lock);
|
| ASSERT(m_done);
|
| m_clientTasks.swap(tasks);
|
| }
|
| for (const auto& task : tasks) {
|
| + // Store the program counter where the task is posted from, and alias
|
| + // it to ensure it is stored in the crash dump.
|
| + const void* programCounter = task.m_location.program_counter();
|
| + WTF::debug::alias(&programCounter);
|
| +
|
| // m_clientTask contains only CallClosureTasks. So, it's ok to pass
|
| // the nullptr.
|
| - task->performTask(nullptr);
|
| + task.m_task->performTask(nullptr);
|
| }
|
| }
|
|
|
| +WorkerThreadableLoader::MainThreadSyncBridge::ClientTask::ClientTask(const WebTraceLocation& location, std::unique_ptr<ExecutionContextTask> task)
|
| + : m_location(location)
|
| + , m_task(std::move(task)) {}
|
| +
|
| +WorkerThreadableLoader::MainThreadSyncBridge::ClientTask::~ClientTask() = default;
|
| +WorkerThreadableLoader::MainThreadSyncBridge::ClientTask::ClientTask(ClientTask&&) = default;
|
| +
|
| WorkerThreadableLoader::MainThreadSyncBridge::~MainThreadSyncBridge()
|
| {
|
| ASSERT(isMainThread());
|
| }
|
|
|
| -void WorkerThreadableLoader::MainThreadSyncBridge::forwardTaskToWorker(std::unique_ptr<ExecutionContextTask> task)
|
| +void WorkerThreadableLoader::MainThreadSyncBridge::forwardTaskToWorker(const WebTraceLocation& location, std::unique_ptr<ExecutionContextTask> task)
|
| {
|
| ASSERT(isMainThread());
|
|
|
| MutexLocker lock(m_lock);
|
| RELEASE_ASSERT(!m_done);
|
|
|
| - m_clientTasks.append(std::move(task));
|
| + m_clientTasks.append(ClientTask(location, std::move(task)));
|
| }
|
|
|
| -void WorkerThreadableLoader::MainThreadSyncBridge::forwardTaskToWorkerOnLoaderDone(std::unique_ptr<ExecutionContextTask> task)
|
| +void WorkerThreadableLoader::MainThreadSyncBridge::forwardTaskToWorkerOnLoaderDone(const WebTraceLocation& location, std::unique_ptr<ExecutionContextTask> task)
|
| {
|
| ASSERT(isMainThread());
|
|
|
| MutexLocker lock(m_lock);
|
| RELEASE_ASSERT(!m_done);
|
|
|
| - m_clientTasks.append(std::move(task));
|
| + m_clientTasks.append(ClientTask(location, std::move(task)));
|
| m_done = true;
|
| m_loaderDoneEvent->signal();
|
| }
|
|
|