Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(251)

Side by Side Diff: third_party/WebKit/Source/core/dom/TaskRunnerHelper.cpp

Issue 2716853002: (WIP) Worker: Merge ParentFrameTaskRunners into TaskRunnerHelper
Patch Set: WIP Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/dom/TaskRunnerHelper.h" 5 #include "core/dom/TaskRunnerHelper.h"
6 6
7 #include "core/dom/Document.h" 7 #include "core/dom/Document.h"
8 #include "core/dom/ExecutionContext.h"
8 #include "core/frame/LocalFrame.h" 9 #include "core/frame/LocalFrame.h"
10 #include "core/workers/WorkerOrWorkletGlobalScope.h"
11 #include "core/workers/WorkerThread.h"
9 #include "platform/WebFrameScheduler.h" 12 #include "platform/WebFrameScheduler.h"
10 #include "platform/WebTaskRunner.h" 13 #include "platform/WebTaskRunner.h"
11 #include "public/platform/Platform.h" 14 #include "public/platform/Platform.h"
12 #include "public/platform/WebThread.h" 15 #include "public/platform/WebThread.h"
13 16
14 namespace blink { 17 namespace blink {
15 18
16 RefPtr<WebTaskRunner> TaskRunnerHelper::get(TaskType type, LocalFrame* frame) { 19 using TaskRunnersByContext =
20 HeapHashMap<Member<ExecutionContext>,
21 CrossThreadPersistent<FrameTaskRunnersHolder>>;
22
23 namespace {
24
25 ThreadSpecific<TaskRunnersByContext>& getTaskRunnerMap() {
26 DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadSpecific<TaskRunnersByContext>,
27 taskRunners,
28 new ThreadSpecific<TaskRunnersByContext>);
29 return taskRunners;
30 }
31
32 RefPtr<WebTaskRunner> getInternal(TaskType type, LocalFrame* frame) {
17 // TODO(haraken): Optimize the mapping from TaskTypes to task runners. 33 // TODO(haraken): Optimize the mapping from TaskTypes to task runners.
18 switch (type) { 34 switch (type) {
19 case TaskType::Timer: 35 case TaskType::Timer:
20 return frame ? frame->frameScheduler()->timerTaskRunner() 36 return frame ? frame->frameScheduler()->timerTaskRunner()
21 : Platform::current()->currentThread()->getWebTaskRunner(); 37 : Platform::current()->currentThread()->getWebTaskRunner();
22 case TaskType::UnspecedLoading: 38 case TaskType::UnspecedLoading:
23 case TaskType::Networking: 39 case TaskType::Networking:
24 return frame ? frame->frameScheduler()->loadingTaskRunner() 40 return frame ? frame->frameScheduler()->loadingTaskRunner()
25 : Platform::current()->currentThread()->getWebTaskRunner(); 41 : Platform::current()->currentThread()->getWebTaskRunner();
26 // Throttling following tasks may break existing web pages, so tentatively 42 // Throttling following tasks may break existing web pages, so tentatively
(...skipping 16 matching lines...) Expand all
43 case TaskType::DatabaseAccess: 59 case TaskType::DatabaseAccess:
44 case TaskType::Presentation: 60 case TaskType::Presentation:
45 case TaskType::Sensor: 61 case TaskType::Sensor:
46 case TaskType::PerformanceTimeline: 62 case TaskType::PerformanceTimeline:
47 case TaskType::WebGL: 63 case TaskType::WebGL:
48 case TaskType::UnspecedTimer: 64 case TaskType::UnspecedTimer:
49 case TaskType::MiscPlatformAPI: 65 case TaskType::MiscPlatformAPI:
50 case TaskType::Unthrottled: 66 case TaskType::Unthrottled:
51 return frame ? frame->frameScheduler()->unthrottledTaskRunner() 67 return frame ? frame->frameScheduler()->unthrottledTaskRunner()
52 : Platform::current()->currentThread()->getWebTaskRunner(); 68 : Platform::current()->currentThread()->getWebTaskRunner();
69 case TaskType::NumberOfTaskTypes:
70 break;
53 } 71 }
54 NOTREACHED(); 72 NOTREACHED();
55 return nullptr; 73 return nullptr;
56 } 74 }
57 75
58 RefPtr<WebTaskRunner> TaskRunnerHelper::get(TaskType type, Document* document) { 76 } // namespace
77
78 FrameTaskRunnersHolder::FrameTaskRunnersHolder(LocalFrame* frame)
79 : ContextLifecycleObserver(frame ? frame->document() : nullptr) {
80 DCHECK(isMainThread());
81 if (frame && frame->document())
82 DCHECK(frame->document()->isContextThread());
83
84 for (unsigned i = 0; i != static_cast<unsigned>(TaskType::NumberOfTaskTypes);
85 ++i) {
86 TaskType type = static_cast<TaskType>(i);
87 m_taskRunners.insert(type, getInternal(type, frame));
88 }
89 }
90
91 RefPtr<WebTaskRunner> FrameTaskRunnersHolder::get(TaskType type) {
92 MutexLocker lock(m_taskRunnersMutex);
93 return m_taskRunners.at(type);
94 }
95
96 DEFINE_TRACE(FrameTaskRunnersHolder) {
97 ContextLifecycleObserver::trace(visitor);
98 }
99
100 void FrameTaskRunnersHolder::contextDestroyed(ExecutionContext*) {
101 MutexLocker lock(m_taskRunnersMutex);
102 for (auto& entry : m_taskRunners)
103 entry.value = Platform::current()->currentThread()->getWebTaskRunner();
104 }
105
106 // ----- FrameTaskRunnerHelper -----
107
108 void FrameTaskRunnerHelper::setTaskRunners(
109 ExecutionContext* executionContext,
110 FrameTaskRunnersHolder* taskRunners) {
111 getTaskRunnerMap()->insert(executionContext, taskRunners);
112 }
113
114 RefPtr<WebTaskRunner> FrameTaskRunnerHelper::get(TaskType type,
115 LocalFrame* frame) {
116 DCHECK(isMainThread());
117 return getInternal(type, frame);
118 }
119
120 RefPtr<WebTaskRunner> FrameTaskRunnerHelper::get(TaskType type,
121 Document* document) {
122 DCHECK(isMainThread());
59 return get(type, document ? document->frame() : nullptr); 123 return get(type, document ? document->frame() : nullptr);
60 } 124 }
61 125
62 RefPtr<WebTaskRunner> TaskRunnerHelper::get( 126 RefPtr<WebTaskRunner> FrameTaskRunnerHelper::get(
63 TaskType type, 127 TaskType type,
64 ExecutionContext* executionContext) { 128 ExecutionContext* executionContext) {
65 return get(type, executionContext && executionContext->isDocument() 129 if (!executionContext)
66 ? static_cast<Document*>(executionContext) 130 return get(type, static_cast<LocalFrame*>(nullptr));
67 : nullptr); 131 if (executionContext->isDocument()) {
132 DCHECK(executionContext->isContextThread());
133 return get(type, static_cast<Document*>(executionContext));
134 }
135 if (executionContext->isWorkerOrWorkletGlobalScope()) {
136 DCHECK(executionContext->isContextThread());
137 return get(type,
138 static_cast<WorkerOrWorkletGlobalScope*>(executionContext));
139 }
140 return get(type, static_cast<LocalFrame*>(nullptr));
68 } 141 }
69 142
70 RefPtr<WebTaskRunner> TaskRunnerHelper::get(TaskType type, 143 RefPtr<WebTaskRunner> FrameTaskRunnerHelper::get(TaskType type,
71 ScriptState* scriptState) { 144 ScriptState* scriptState) {
145 DCHECK(isMainThread());
72 return get(type, scriptState ? scriptState->getExecutionContext() : nullptr); 146 return get(type, scriptState ? scriptState->getExecutionContext() : nullptr);
73 } 147 }
74 148
149 RefPtr<WebTaskRunner> FrameTaskRunnerHelper::get(TaskType type,
150 WorkerThread* workerThread) {
151 return get(type, workerThread->globalScope());
152 }
153
154 RefPtr<WebTaskRunner> FrameTaskRunnerHelper::get(
155 TaskType type,
156 WorkerOrWorkletGlobalScope* globalScope) {
157 DCHECK(globalScope->isContextThread());
158 return getTaskRunnerMap()->at(globalScope)->get(type);
159 }
160
75 } // namespace blink 161 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698