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

Side by Side Diff: Source/core/workers/WorkerScript.cpp

Issue 1115923002: workers: Rename WorkerThread to WorkerScript. Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: . Created 5 years, 7 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 | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution. 11 * documentation and/or other materials provided with the distribution.
12 * 12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 * 24 *
25 */ 25 */
26 26
27 #include "config.h" 27 #include "config.h"
28 28
29 #include "core/workers/WorkerThread.h" 29 #include "core/workers/WorkerScript.h"
30 30
31 #include "bindings/core/v8/ScriptSourceCode.h" 31 #include "bindings/core/v8/ScriptSourceCode.h"
32 #include "bindings/core/v8/V8GCController.h" 32 #include "bindings/core/v8/V8GCController.h"
33 #include "bindings/core/v8/V8Initializer.h" 33 #include "bindings/core/v8/V8Initializer.h"
34 #include "core/dom/Microtask.h" 34 #include "core/dom/Microtask.h"
35 #include "core/inspector/InspectorInstrumentation.h" 35 #include "core/inspector/InspectorInstrumentation.h"
36 #include "core/inspector/WorkerInspectorController.h" 36 #include "core/inspector/WorkerInspectorController.h"
37 #include "core/workers/DedicatedWorkerGlobalScope.h" 37 #include "core/workers/DedicatedWorkerGlobalScope.h"
38 #include "core/workers/WorkerClients.h" 38 #include "core/workers/WorkerClients.h"
39 #include "core/workers/WorkerReportingProxy.h" 39 #include "core/workers/WorkerReportingProxy.h"
40 #include "core/workers/WorkerThreadStartupData.h" 40 #include "core/workers/WorkerScriptStartupData.h"
41 #include "platform/PlatformThreadData.h" 41 #include "platform/PlatformThreadData.h"
42 #include "platform/Task.h" 42 #include "platform/Task.h"
43 #include "platform/ThreadSafeFunctional.h" 43 #include "platform/ThreadSafeFunctional.h"
44 #include "platform/ThreadTimers.h" 44 #include "platform/ThreadTimers.h"
45 #include "platform/heap/SafePoint.h" 45 #include "platform/heap/SafePoint.h"
46 #include "platform/heap/ThreadState.h" 46 #include "platform/heap/ThreadState.h"
47 #include "platform/weborigin/KURL.h" 47 #include "platform/weborigin/KURL.h"
48 #include "public/platform/Platform.h" 48 #include "public/platform/Platform.h"
49 #include "public/platform/WebThread.h" 49 #include "public/platform/WebThread.h"
50 #include "public/platform/WebWaitableEvent.h" 50 #include "public/platform/WebWaitableEvent.h"
51 #include "wtf/Noncopyable.h" 51 #include "wtf/Noncopyable.h"
52 #include "wtf/WeakPtr.h" 52 #include "wtf/WeakPtr.h"
53 #include "wtf/text/WTFString.h" 53 #include "wtf/text/WTFString.h"
54 54
55 namespace blink { 55 namespace blink {
56 56
57 namespace { 57 namespace {
58 const int64_t kShortIdleHandlerDelayMs = 1000; 58 const int64_t kShortIdleHandlerDelayMs = 1000;
59 const int64_t kLongIdleHandlerDelayMs = 10*1000; 59 const int64_t kLongIdleHandlerDelayMs = 10*1000;
60 60
61 class MicrotaskRunner : public WebThread::TaskObserver { 61 class MicrotaskRunner : public WebThread::TaskObserver {
62 public: 62 public:
63 explicit MicrotaskRunner(WorkerThread* workerThread) 63 explicit MicrotaskRunner(WorkerScript* workerScript)
64 : m_workerThread(workerThread) 64 : m_workerScript(workerScript)
65 { 65 {
66 } 66 }
67 67
68 virtual void willProcessTask() override { } 68 virtual void willProcessTask() override { }
69 virtual void didProcessTask() override 69 virtual void didProcessTask() override
70 { 70 {
71 Microtask::performCheckpoint(); 71 Microtask::performCheckpoint();
72 if (WorkerGlobalScope* globalScope = m_workerThread->workerGlobalScope() ) { 72 if (WorkerGlobalScope* globalScope = m_workerScript->workerGlobalScope() ) {
73 if (WorkerScriptController* scriptController = globalScope->script() ) 73 if (WorkerScriptController* scriptController = globalScope->scriptCo ntroller())
74 scriptController->rejectedPromises()->processQueue(); 74 scriptController->rejectedPromises()->processQueue();
75 } 75 }
76 } 76 }
77 77
78 private: 78 private:
79 // Thread owns the microtask runner; reference remains 79 // Thread owns the microtask runner; reference remains
80 // valid for the lifetime of this object. 80 // valid for the lifetime of this object.
81 WorkerThread* m_workerThread; 81 WorkerScript* m_workerScript;
82 }; 82 };
83 83
84 } // namespace 84 } // namespace
85 85
86 static Mutex& threadSetMutex() 86 static Mutex& threadSetMutex()
87 { 87 {
88 AtomicallyInitializedStaticReference(Mutex, mutex, new Mutex); 88 AtomicallyInitializedStaticReference(Mutex, mutex, new Mutex);
89 return mutex; 89 return mutex;
90 } 90 }
91 91
92 static HashSet<WorkerThread*>& workerThreads() 92 static HashSet<WorkerScript*>& workerScripts()
93 { 93 {
94 DEFINE_STATIC_LOCAL(HashSet<WorkerThread*>, threads, ()); 94 DEFINE_STATIC_LOCAL(HashSet<WorkerScript*>, threads, ());
95 return threads; 95 return threads;
96 } 96 }
97 97
98 unsigned WorkerThread::workerThreadCount() 98 unsigned WorkerScript::workerScriptCount()
99 { 99 {
100 MutexLocker lock(threadSetMutex()); 100 MutexLocker lock(threadSetMutex());
101 return workerThreads().size(); 101 return workerScripts().size();
102 } 102 }
103 103
104 class WorkerThreadCancelableTask final : public ExecutionContextTask { 104 class WorkerScriptCancelableTask final : public ExecutionContextTask {
105 WTF_MAKE_NONCOPYABLE(WorkerThreadCancelableTask); WTF_MAKE_FAST_ALLOCATED(Wo rkerThreadCancelableTask); 105 WTF_MAKE_NONCOPYABLE(WorkerScriptCancelableTask); WTF_MAKE_FAST_ALLOCATED(Wo rkerScriptCancelableTask);
106 public: 106 public:
107 static PassOwnPtr<WorkerThreadCancelableTask> create(PassOwnPtr<Closure> clo sure) 107 static PassOwnPtr<WorkerScriptCancelableTask> create(PassOwnPtr<Closure> clo sure)
108 { 108 {
109 return adoptPtr(new WorkerThreadCancelableTask(closure)); 109 return adoptPtr(new WorkerScriptCancelableTask(closure));
110 } 110 }
111 111
112 virtual ~WorkerThreadCancelableTask() { } 112 virtual ~WorkerScriptCancelableTask() { }
113 113
114 virtual void performTask(ExecutionContext*) override 114 virtual void performTask(ExecutionContext*) override
115 { 115 {
116 if (!m_taskCanceled) 116 if (!m_taskCanceled)
117 (*m_closure)(); 117 (*m_closure)();
118 } 118 }
119 119
120 WeakPtr<WorkerThreadCancelableTask> createWeakPtr() { return m_weakFactory.c reateWeakPtr(); } 120 WeakPtr<WorkerScriptCancelableTask> createWeakPtr() { return m_weakFactory.c reateWeakPtr(); }
121 void cancelTask() { m_taskCanceled = true; } 121 void cancelTask() { m_taskCanceled = true; }
122 122
123 private: 123 private:
124 explicit WorkerThreadCancelableTask(PassOwnPtr<Closure> closure) 124 explicit WorkerScriptCancelableTask(PassOwnPtr<Closure> closure)
125 : m_closure(closure) 125 : m_closure(closure)
126 , m_weakFactory(this) 126 , m_weakFactory(this)
127 , m_taskCanceled(false) 127 , m_taskCanceled(false)
128 { } 128 { }
129 129
130 OwnPtr<Closure> m_closure; 130 OwnPtr<Closure> m_closure;
131 WeakPtrFactory<WorkerThreadCancelableTask> m_weakFactory; 131 WeakPtrFactory<WorkerScriptCancelableTask> m_weakFactory;
132 bool m_taskCanceled; 132 bool m_taskCanceled;
133 }; 133 };
134 134
135 class WorkerSharedTimer : public SharedTimer { 135 class WorkerSharedTimer : public SharedTimer {
136 public: 136 public:
137 explicit WorkerSharedTimer(WorkerThread* workerThread) 137 explicit WorkerSharedTimer(WorkerScript* workerScript)
138 : m_workerThread(workerThread) 138 : m_workerScript(workerScript)
139 , m_running(false) 139 , m_running(false)
140 { } 140 { }
141 141
142 typedef void (*SharedTimerFunction)(); 142 typedef void (*SharedTimerFunction)();
143 virtual void setFiredFunction(SharedTimerFunction func) 143 virtual void setFiredFunction(SharedTimerFunction func)
144 { 144 {
145 m_sharedTimerFunction = func; 145 m_sharedTimerFunction = func;
146 } 146 }
147 147
148 virtual void setFireInterval(double interval) 148 virtual void setFireInterval(double interval)
149 { 149 {
150 ASSERT(m_sharedTimerFunction); 150 ASSERT(m_sharedTimerFunction);
151 151
152 // See BlinkPlatformImpl::setSharedTimerFireInterval for explanation of 152 // See BlinkPlatformImpl::setSharedTimerFireInterval for explanation of
153 // why ceil is used in the interval calculation. 153 // why ceil is used in the interval calculation.
154 int64_t delay = static_cast<int64_t>(ceil(interval * 1000)); 154 int64_t delay = static_cast<int64_t>(ceil(interval * 1000));
155 155
156 if (delay < 0) { 156 if (delay < 0) {
157 delay = 0; 157 delay = 0;
158 } 158 }
159 159
160 m_running = true; 160 m_running = true;
161 161
162 if (m_lastQueuedTask.get()) 162 if (m_lastQueuedTask.get())
163 m_lastQueuedTask->cancelTask(); 163 m_lastQueuedTask->cancelTask();
164 164
165 // Now queue the task as a cancellable one. 165 // Now queue the task as a cancellable one.
166 OwnPtr<WorkerThreadCancelableTask> task = WorkerThreadCancelableTask::cr eate(bind(&WorkerSharedTimer::OnTimeout, this)); 166 OwnPtr<WorkerScriptCancelableTask> task = WorkerScriptCancelableTask::cr eate(bind(&WorkerSharedTimer::OnTimeout, this));
167 m_lastQueuedTask = task->createWeakPtr(); 167 m_lastQueuedTask = task->createWeakPtr();
168 m_workerThread->postDelayedTask(FROM_HERE, task.release(), delay); 168 m_workerScript->postDelayedTask(FROM_HERE, task.release(), delay);
169 } 169 }
170 170
171 virtual void stop() 171 virtual void stop()
172 { 172 {
173 m_running = false; 173 m_running = false;
174 m_lastQueuedTask = nullptr; 174 m_lastQueuedTask = nullptr;
175 } 175 }
176 176
177 private: 177 private:
178 void OnTimeout() 178 void OnTimeout()
179 { 179 {
180 ASSERT(m_workerThread->workerGlobalScope()); 180 ASSERT(m_workerScript->workerGlobalScope());
181 181
182 m_lastQueuedTask = nullptr; 182 m_lastQueuedTask = nullptr;
183 183
184 if (m_sharedTimerFunction && m_running && !m_workerThread->workerGlobalS cope()->isClosing()) 184 if (m_sharedTimerFunction && m_running && !m_workerScript->workerGlobalS cope()->isClosing())
185 m_sharedTimerFunction(); 185 m_sharedTimerFunction();
186 } 186 }
187 187
188 WorkerThread* m_workerThread; 188 WorkerScript* m_workerScript;
189 SharedTimerFunction m_sharedTimerFunction; 189 SharedTimerFunction m_sharedTimerFunction;
190 bool m_running; 190 bool m_running;
191 191
192 // The task to run OnTimeout, if any. While OnTimeout resets 192 // The task to run OnTimeout, if any. While OnTimeout resets
193 // m_lastQueuedTask, this must be a weak pointer because the 193 // m_lastQueuedTask, this must be a weak pointer because the
194 // worker runloop may delete the task as it is shutting down. 194 // worker runloop may delete the task as it is shutting down.
195 WeakPtr<WorkerThreadCancelableTask> m_lastQueuedTask; 195 WeakPtr<WorkerScriptCancelableTask> m_lastQueuedTask;
196 }; 196 };
197 197
198 class WorkerThreadTask : public WebThread::Task { 198 class WorkerScriptTask : public WebThread::Task {
199 WTF_MAKE_NONCOPYABLE(WorkerThreadTask); WTF_MAKE_FAST_ALLOCATED(WorkerThread Task); 199 WTF_MAKE_NONCOPYABLE(WorkerScriptTask); WTF_MAKE_FAST_ALLOCATED(WorkerScript Task);
200 public: 200 public:
201 static PassOwnPtr<WorkerThreadTask> create(WorkerThread& workerThread, PassO wnPtr<ExecutionContextTask> task, bool isInstrumented) 201 static PassOwnPtr<WorkerScriptTask> create(WorkerScript& workerScript, PassO wnPtr<ExecutionContextTask> task, bool isInstrumented)
202 { 202 {
203 return adoptPtr(new WorkerThreadTask(workerThread, task, isInstrumented) ); 203 return adoptPtr(new WorkerScriptTask(workerScript, task, isInstrumented) );
204 } 204 }
205 205
206 virtual ~WorkerThreadTask() { } 206 virtual ~WorkerScriptTask() { }
207 207
208 virtual void run() override 208 virtual void run() override
209 { 209 {
210 WorkerGlobalScope* workerGlobalScope = m_workerThread.workerGlobalScope( ); 210 WorkerGlobalScope* workerGlobalScope = m_workerScript.workerGlobalScope( );
211 // Tasks could be put on the message loop after the cleanup task, 211 // Tasks could be put on the message loop after the cleanup task,
212 // ensure none of those are ran. 212 // ensure none of those are ran.
213 if (!workerGlobalScope) 213 if (!workerGlobalScope)
214 return; 214 return;
215 215
216 if (m_isInstrumented) 216 if (m_isInstrumented)
217 InspectorInstrumentation::willPerformExecutionContextTask(workerGlob alScope, m_task.get()); 217 InspectorInstrumentation::willPerformExecutionContextTask(workerGlob alScope, m_task.get());
218 if ((!workerGlobalScope->isClosing() && !m_workerThread.terminated()) || m_task->isCleanupTask()) 218 if ((!workerGlobalScope->isClosing() && !m_workerScript.terminated()) || m_task->isCleanupTask())
219 m_task->performTask(workerGlobalScope); 219 m_task->performTask(workerGlobalScope);
220 if (m_isInstrumented) 220 if (m_isInstrumented)
221 InspectorInstrumentation::didPerformExecutionContextTask(workerGloba lScope); 221 InspectorInstrumentation::didPerformExecutionContextTask(workerGloba lScope);
222 } 222 }
223 223
224 private: 224 private:
225 WorkerThreadTask(WorkerThread& workerThread, PassOwnPtr<ExecutionContextTask > task, bool isInstrumented) 225 WorkerScriptTask(WorkerScript& workerScript, PassOwnPtr<ExecutionContextTask > task, bool isInstrumented)
226 : m_workerThread(workerThread) 226 : m_workerScript(workerScript)
227 , m_task(task) 227 , m_task(task)
228 , m_isInstrumented(isInstrumented) 228 , m_isInstrumented(isInstrumented)
229 { 229 {
230 if (m_isInstrumented) 230 if (m_isInstrumented)
231 m_isInstrumented = !m_task->taskNameForInstrumentation().isEmpty(); 231 m_isInstrumented = !m_task->taskNameForInstrumentation().isEmpty();
232 if (m_isInstrumented) 232 if (m_isInstrumented)
233 InspectorInstrumentation::didPostExecutionContextTask(m_workerThread .workerGlobalScope(), m_task.get()); 233 InspectorInstrumentation::didPostExecutionContextTask(m_workerScript .workerGlobalScope(), m_task.get());
234 } 234 }
235 235
236 WorkerThread& m_workerThread; 236 WorkerScript& m_workerScript;
237 OwnPtr<ExecutionContextTask> m_task; 237 OwnPtr<ExecutionContextTask> m_task;
238 bool m_isInstrumented; 238 bool m_isInstrumented;
239 }; 239 };
240 240
241 class RunDebuggerQueueTask final : public ExecutionContextTask { 241 class RunDebuggerQueueTask final : public ExecutionContextTask {
242 public: 242 public:
243 static PassOwnPtr<RunDebuggerQueueTask> create(WorkerThread* thread) 243 static PassOwnPtr<RunDebuggerQueueTask> create(WorkerScript* thread)
244 { 244 {
245 return adoptPtr(new RunDebuggerQueueTask(thread)); 245 return adoptPtr(new RunDebuggerQueueTask(thread));
246 } 246 }
247 virtual void performTask(ExecutionContext* context) override 247 virtual void performTask(ExecutionContext* context) override
248 { 248 {
249 ASSERT(context->isWorkerGlobalScope()); 249 ASSERT(context->isWorkerGlobalScope());
250 m_thread->runDebuggerTask(WorkerThread::DontWaitForMessage); 250 m_thread->runDebuggerTask(WorkerScript::DontWaitForMessage);
251 } 251 }
252 252
253 private: 253 private:
254 explicit RunDebuggerQueueTask(WorkerThread* thread) : m_thread(thread) { } 254 explicit RunDebuggerQueueTask(WorkerScript* thread) : m_thread(thread) { }
255 255
256 WorkerThread* m_thread; 256 WorkerScript* m_thread;
257 }; 257 };
258 258
259 WorkerThread::WorkerThread(PassRefPtr<WorkerLoaderProxy> workerLoaderProxy, Work erReportingProxy& workerReportingProxy, PassOwnPtr<WorkerThreadStartupData> star tupData) 259 WorkerScript::WorkerScript(PassRefPtr<WorkerLoaderProxy> workerLoaderProxy, Work erReportingProxy& workerReportingProxy, PassOwnPtr<WorkerScriptStartupData> star tupData)
260 : m_started(false) 260 : m_started(false)
261 , m_terminated(false) 261 , m_terminated(false)
262 , m_workerLoaderProxy(workerLoaderProxy) 262 , m_workerLoaderProxy(workerLoaderProxy)
263 , m_workerReportingProxy(workerReportingProxy) 263 , m_workerReportingProxy(workerReportingProxy)
264 , m_startupData(startupData) 264 , m_startupData(startupData)
265 , m_isolate(nullptr) 265 , m_isolate(nullptr)
266 , m_shutdownEvent(adoptPtr(Platform::current()->createWaitableEvent())) 266 , m_shutdownEvent(adoptPtr(Platform::current()->createWaitableEvent()))
267 , m_terminationEvent(adoptPtr(Platform::current()->createWaitableEvent())) 267 , m_terminationEvent(adoptPtr(Platform::current()->createWaitableEvent()))
268 { 268 {
269 MutexLocker lock(threadSetMutex()); 269 MutexLocker lock(threadSetMutex());
270 workerThreads().add(this); 270 workerScripts().add(this);
271 } 271 }
272 272
273 WorkerThread::~WorkerThread() 273 WorkerScript::~WorkerScript()
274 { 274 {
275 MutexLocker lock(threadSetMutex()); 275 MutexLocker lock(threadSetMutex());
276 ASSERT(workerThreads().contains(this)); 276 ASSERT(workerScripts().contains(this));
277 workerThreads().remove(this); 277 workerScripts().remove(this);
278 } 278 }
279 279
280 void WorkerThread::start() 280 void WorkerScript::start()
281 { 281 {
282 if (m_started) 282 if (m_started)
283 return; 283 return;
284 284
285 m_started = true; 285 m_started = true;
286 backingThread().postTask(FROM_HERE, new Task(threadSafeBind(&WorkerThread::i nitialize, AllowCrossThreadAccess(this)))); 286 backingThread().postTask(FROM_HERE, new Task(threadSafeBind(&WorkerScript::i nitialize, AllowCrossThreadAccess(this))));
287 } 287 }
288 288
289 void WorkerThread::interruptAndDispatchInspectorCommands() 289 void WorkerScript::interruptAndDispatchInspectorCommands()
290 { 290 {
291 MutexLocker locker(m_workerInspectorControllerMutex); 291 MutexLocker locker(m_workerInspectorControllerMutex);
292 if (m_workerInspectorController) 292 if (m_workerInspectorController)
293 m_workerInspectorController->interruptAndDispatchInspectorCommands(); 293 m_workerInspectorController->interruptAndDispatchInspectorCommands();
294 } 294 }
295 295
296 PlatformThreadId WorkerThread::platformThreadId() 296 PlatformThreadId WorkerScript::platformThreadId()
297 { 297 {
298 if (!m_started) 298 if (!m_started)
299 return 0; 299 return 0;
300 return backingThread().platformThread().threadId(); 300 return backingThread().platformThread().threadId();
301 } 301 }
302 302
303 void WorkerThread::initialize() 303 void WorkerScript::initialize()
304 { 304 {
305 KURL scriptURL = m_startupData->m_scriptURL; 305 KURL scriptURL = m_startupData->m_scriptURL;
306 String sourceCode = m_startupData->m_sourceCode; 306 String sourceCode = m_startupData->m_sourceCode;
307 WorkerThreadStartMode startMode = m_startupData->m_startMode; 307 WorkerThreadStartMode startMode = m_startupData->m_startMode;
308 OwnPtr<Vector<char>> cachedMetaData = m_startupData->m_cachedMetaData.releas e(); 308 OwnPtr<Vector<char>> cachedMetaData = m_startupData->m_cachedMetaData.releas e();
309 V8CacheOptions v8CacheOptions = m_startupData->m_v8CacheOptions; 309 V8CacheOptions v8CacheOptions = m_startupData->m_v8CacheOptions;
310 310
311 { 311 {
312 MutexLocker lock(m_threadCreationMutex); 312 MutexLocker lock(m_threadCreationMutex);
313 313
314 // The worker was terminated before the thread had a chance to run. 314 // The worker was terminated before the thread had a chance to run.
315 if (m_terminated) { 315 if (m_terminated) {
316 // Notify the proxy that the WorkerGlobalScope has been disposed of. 316 // Notify the proxy that the WorkerGlobalScope has been disposed of.
317 // This can free this thread object, hence it must not be touched af terwards. 317 // This can free this thread object, hence it must not be touched af terwards.
318 m_workerReportingProxy.workerThreadTerminated(); 318 m_workerReportingProxy.workerScriptTerminated();
319 return; 319 return;
320 } 320 }
321 321
322 m_microtaskRunner = adoptPtr(new MicrotaskRunner(this)); 322 m_microtaskRunner = adoptPtr(new MicrotaskRunner(this));
323 backingThread().addTaskObserver(m_microtaskRunner.get()); 323 backingThread().addTaskObserver(m_microtaskRunner.get());
324 backingThread().attachGC(); 324 backingThread().attachGC();
325 325
326 m_isolate = initializeIsolate(); 326 m_isolate = initializeIsolate();
327 m_workerGlobalScope = createWorkerGlobalScope(m_startupData.release()); 327 m_workerGlobalScope = createWorkerGlobalScope(m_startupData.release());
328 m_workerGlobalScope->scriptLoaded(sourceCode.length(), cachedMetaData.ge t() ? cachedMetaData->size() : 0); 328 m_workerGlobalScope->scriptLoaded(sourceCode.length(), cachedMetaData.ge t() ? cachedMetaData->size() : 0);
329 329
330 PlatformThreadData::current().threadTimers().setSharedTimer(adoptPtr(new WorkerSharedTimer(this))); 330 PlatformThreadData::current().threadTimers().setSharedTimer(adoptPtr(new WorkerSharedTimer(this)));
331 } 331 }
332 332
333 // The corresponding call to stopRunLoop() is in ~WorkerScriptController(). 333 // The corresponding call to stopRunLoop() is in ~WorkerScriptController().
334 didStartRunLoop(); 334 didStartRunLoop();
335 335
336 // Notify proxy that a new WorkerGlobalScope has been created and started. 336 // Notify proxy that a new WorkerGlobalScope has been created and started.
337 m_workerReportingProxy.workerGlobalScopeStarted(m_workerGlobalScope.get()); 337 m_workerReportingProxy.workerGlobalScopeStarted(m_workerGlobalScope.get());
338 338
339 WorkerScriptController* script = m_workerGlobalScope->script(); 339 WorkerScriptController* script = m_workerGlobalScope->scriptController();
340 if (!script->isExecutionForbidden()) 340 if (!script->isExecutionForbidden())
341 script->initializeContextIfNeeded(); 341 script->initializeContextIfNeeded();
342 if (startMode == PauseWorkerGlobalScopeOnStart) 342 if (startMode == PauseWorkerGlobalScopeOnStart)
343 m_workerGlobalScope->workerInspectorController()->pauseOnStart(); 343 m_workerGlobalScope->workerInspectorController()->pauseOnStart();
344 344
345 OwnPtr<CachedMetadataHandler> handler(workerGlobalScope()->createWorkerScrip tCachedMetadataHandler(scriptURL, cachedMetaData.get())); 345 OwnPtr<CachedMetadataHandler> handler(workerGlobalScope()->createWorkerScrip tCachedMetadataHandler(scriptURL, cachedMetaData.get()));
346 bool success = script->evaluate(ScriptSourceCode(sourceCode, scriptURL), nul lptr, handler.get(), v8CacheOptions); 346 bool success = script->evaluate(ScriptSourceCode(sourceCode, scriptURL), nul lptr, handler.get(), v8CacheOptions);
347 m_workerGlobalScope->didEvaluateWorkerScript(); 347 m_workerGlobalScope->didEvaluateWorkerScript();
348 m_workerReportingProxy.didEvaluateWorkerScript(success); 348 m_workerReportingProxy.didEvaluateWorkerScript(success);
349 349
350 postInitialize(); 350 postInitialize();
351 351
352 postDelayedTask(FROM_HERE, createSameThreadTask(&WorkerThread::idleHandler, this), kShortIdleHandlerDelayMs); 352 postDelayedTask(FROM_HERE, createSameThreadTask(&WorkerScript::idleHandler, this), kShortIdleHandlerDelayMs);
353 } 353 }
354 354
355 void WorkerThread::cleanup() 355 void WorkerScript::cleanup()
356 { 356 {
357 // This should be called before we start the shutdown procedure. 357 // This should be called before we start the shutdown procedure.
358 workerReportingProxy().willDestroyWorkerGlobalScope(); 358 workerReportingProxy().willDestroyWorkerGlobalScope();
359 359
360 // The below assignment will destroy the context, which will in turn notify messaging proxy. 360 // The below assignment will destroy the context, which will in turn notify messaging proxy.
361 // We cannot let any objects survive past thread exit, because no other thre ad will run GC or otherwise destroy them. 361 // We cannot let any objects survive past thread exit, because no other thre ad will run GC or otherwise destroy them.
362 // If Oilpan is enabled, we detach of the context/global scope, with the fin al heap cleanup below sweeping it out. 362 // If Oilpan is enabled, we detach of the context/global scope, with the fin al heap cleanup below sweeping it out.
363 #if !ENABLE(OILPAN) 363 #if !ENABLE(OILPAN)
364 ASSERT(m_workerGlobalScope->hasOneRef()); 364 ASSERT(m_workerGlobalScope->hasOneRef());
365 #endif 365 #endif
366 m_workerGlobalScope->notifyContextDestroyed(); 366 m_workerGlobalScope->notifyContextDestroyed();
367 m_workerGlobalScope = nullptr; 367 m_workerGlobalScope = nullptr;
368 368
369 backingThread().detachGC(); 369 backingThread().detachGC();
370 destroyIsolate(); 370 destroyIsolate();
371 371
372 backingThread().removeTaskObserver(m_microtaskRunner.get()); 372 backingThread().removeTaskObserver(m_microtaskRunner.get());
373 m_microtaskRunner = nullptr; 373 m_microtaskRunner = nullptr;
374 374
375 // Notify the proxy that the WorkerGlobalScope has been disposed of. 375 // Notify the proxy that the WorkerGlobalScope has been disposed of.
376 // This can free this thread object, hence it must not be touched afterwards . 376 // This can free this thread object, hence it must not be touched afterwards .
377 workerReportingProxy().workerThreadTerminated(); 377 workerReportingProxy().workerScriptTerminated();
378 378
379 m_terminationEvent->signal(); 379 m_terminationEvent->signal();
380 380
381 // Clean up PlatformThreadData before WTF::WTFThreadData goes away! 381 // Clean up PlatformThreadData before WTF::WTFThreadData goes away!
382 PlatformThreadData::current().destroy(); 382 PlatformThreadData::current().destroy();
383 } 383 }
384 384
385 class WorkerThreadShutdownFinishTask : public ExecutionContextTask { 385 class WorkerScriptShutdownFinishTask : public ExecutionContextTask {
386 public: 386 public:
387 static PassOwnPtr<WorkerThreadShutdownFinishTask> create() 387 static PassOwnPtr<WorkerScriptShutdownFinishTask> create()
388 { 388 {
389 return adoptPtr(new WorkerThreadShutdownFinishTask()); 389 return adoptPtr(new WorkerScriptShutdownFinishTask());
390 } 390 }
391 391
392 virtual void performTask(ExecutionContext *context) 392 virtual void performTask(ExecutionContext *context)
393 { 393 {
394 WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context); 394 WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context);
395 workerGlobalScope->dispose(); 395 workerGlobalScope->dispose();
396 396
397 WorkerThread* workerThread = workerGlobalScope->thread(); 397 WorkerScript* workerScript = workerGlobalScope->script();
398 workerThread->willDestroyIsolate(); 398 workerScript->willDestroyIsolate();
399 workerThread->backingThread().postTask(FROM_HERE, new Task(WTF::bind(&Wo rkerThread::cleanup, workerThread))); 399 workerScript->backingThread().postTask(FROM_HERE, new Task(WTF::bind(&Wo rkerScript::cleanup, workerScript)));
400 } 400 }
401 401
402 virtual bool isCleanupTask() const { return true; } 402 virtual bool isCleanupTask() const { return true; }
403 }; 403 };
404 404
405 class WorkerThreadShutdownStartTask : public ExecutionContextTask { 405 class WorkerScriptShutdownStartTask : public ExecutionContextTask {
406 public: 406 public:
407 static PassOwnPtr<WorkerThreadShutdownStartTask> create() 407 static PassOwnPtr<WorkerScriptShutdownStartTask> create()
408 { 408 {
409 return adoptPtr(new WorkerThreadShutdownStartTask()); 409 return adoptPtr(new WorkerScriptShutdownStartTask());
410 } 410 }
411 411
412 virtual void performTask(ExecutionContext *context) 412 virtual void performTask(ExecutionContext *context)
413 { 413 {
414 WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context); 414 WorkerGlobalScope* workerGlobalScope = toWorkerGlobalScope(context);
415 workerGlobalScope->stopActiveDOMObjects(); 415 workerGlobalScope->stopActiveDOMObjects();
416 PlatformThreadData::current().threadTimers().setSharedTimer(nullptr); 416 PlatformThreadData::current().threadTimers().setSharedTimer(nullptr);
417 417
418 // Event listeners would keep DOMWrapperWorld objects alive for too long . Also, they have references to JS objects, 418 // Event listeners would keep DOMWrapperWorld objects alive for too long . Also, they have references to JS objects,
419 // which become dangling once Heap is destroyed. 419 // which become dangling once Heap is destroyed.
420 workerGlobalScope->removeAllEventListeners(); 420 workerGlobalScope->removeAllEventListeners();
421 421
422 // Stick a shutdown command at the end of the queue, so that we deal 422 // Stick a shutdown command at the end of the queue, so that we deal
423 // with all the cleanup tasks the databases post first. 423 // with all the cleanup tasks the databases post first.
424 workerGlobalScope->postTask(FROM_HERE, WorkerThreadShutdownFinishTask::c reate()); 424 workerGlobalScope->postTask(FROM_HERE, WorkerScriptShutdownFinishTask::c reate());
425 } 425 }
426 426
427 virtual bool isCleanupTask() const { return true; } 427 virtual bool isCleanupTask() const { return true; }
428 }; 428 };
429 429
430 void WorkerThread::stop() 430 void WorkerScript::stop()
431 { 431 {
432 // Prevent the deadlock between GC and an attempt to stop a thread. 432 // Prevent the deadlock between GC and an attempt to stop a thread.
433 SafePointScope safePointScope(ThreadState::HeapPointersOnStack); 433 SafePointScope safePointScope(ThreadState::HeapPointersOnStack);
434 stopInternal(); 434 stopInternal();
435 } 435 }
436 436
437 void WorkerThread::stopInShutdownSequence() 437 void WorkerScript::stopInShutdownSequence()
438 { 438 {
439 stopInternal(); 439 stopInternal();
440 } 440 }
441 441
442 void WorkerThread::terminateAndWait() 442 void WorkerScript::terminateAndWait()
443 { 443 {
444 stop(); 444 stop();
445 m_terminationEvent->wait(); 445 m_terminationEvent->wait();
446 } 446 }
447 447
448 bool WorkerThread::terminated() 448 bool WorkerScript::terminated()
449 { 449 {
450 MutexLocker lock(m_threadCreationMutex); 450 MutexLocker lock(m_threadCreationMutex);
451 return m_terminated; 451 return m_terminated;
452 } 452 }
453 453
454 void WorkerThread::stopInternal() 454 void WorkerScript::stopInternal()
455 { 455 {
456 // Protect against this method and initialize() racing each other. 456 // Protect against this method and initialize() racing each other.
457 MutexLocker lock(m_threadCreationMutex); 457 MutexLocker lock(m_threadCreationMutex);
458 458
459 // If stop has already been called, just return. 459 // If stop has already been called, just return.
460 if (m_terminated) 460 if (m_terminated)
461 return; 461 return;
462 m_terminated = true; 462 m_terminated = true;
463 463
464 // Signal the thread to notify that the thread's stopping. 464 // Signal the thread to notify that the thread's stopping.
465 if (m_shutdownEvent) 465 if (m_shutdownEvent)
466 m_shutdownEvent->signal(); 466 m_shutdownEvent->signal();
467 467
468 if (!m_workerGlobalScope) 468 if (!m_workerGlobalScope)
469 return; 469 return;
470 470
471 // Ensure that tasks are being handled by thread event loop. If script execu tion weren't forbidden, a while(1) loop in JS could keep the thread alive foreve r. 471 // Ensure that tasks are being handled by thread event loop. If script execu tion weren't forbidden, a while(1) loop in JS could keep the thread alive foreve r.
472 terminateV8Execution(); 472 terminateV8Execution();
473 473
474 InspectorInstrumentation::didKillAllExecutionContextTasks(m_workerGlobalScop e.get()); 474 InspectorInstrumentation::didKillAllExecutionContextTasks(m_workerGlobalScop e.get());
475 m_debuggerMessageQueue.kill(); 475 m_debuggerMessageQueue.kill();
476 postTask(FROM_HERE, WorkerThreadShutdownStartTask::create()); 476 postTask(FROM_HERE, WorkerScriptShutdownStartTask::create());
477 } 477 }
478 478
479 void WorkerThread::didStartRunLoop() 479 void WorkerScript::didStartRunLoop()
480 { 480 {
481 ASSERT(isCurrentThread()); 481 ASSERT(isCurrentThread());
482 Platform::current()->didStartWorkerRunLoop(); 482 Platform::current()->didStartWorkerRunLoop();
483 } 483 }
484 484
485 void WorkerThread::didStopRunLoop() 485 void WorkerScript::didStopRunLoop()
486 { 486 {
487 ASSERT(isCurrentThread()); 487 ASSERT(isCurrentThread());
488 Platform::current()->didStopWorkerRunLoop(); 488 Platform::current()->didStopWorkerRunLoop();
489 } 489 }
490 490
491 void WorkerThread::terminateAndWaitForAllWorkers() 491 void WorkerScript::terminateAndWaitForAllWorkers()
492 { 492 {
493 // Keep this lock to prevent WorkerThread instances from being destroyed. 493 // Keep this lock to prevent WorkerScript instances from being destroyed.
494 MutexLocker lock(threadSetMutex()); 494 MutexLocker lock(threadSetMutex());
495 HashSet<WorkerThread*> threads = workerThreads(); 495 HashSet<WorkerScript*> threads = workerScripts();
496 for (WorkerThread* thread : threads) 496 for (WorkerScript* thread : threads)
497 thread->stopInShutdownSequence(); 497 thread->stopInShutdownSequence();
498 498
499 for (WorkerThread* thread : threads) 499 for (WorkerScript* thread : threads)
500 thread->terminationEvent()->wait(); 500 thread->terminationEvent()->wait();
501 } 501 }
502 502
503 bool WorkerThread::isCurrentThread() 503 bool WorkerScript::isCurrentThread()
504 { 504 {
505 return m_started && backingThread().isCurrentThread(); 505 return m_started && backingThread().isCurrentThread();
506 } 506 }
507 507
508 void WorkerThread::idleHandler() 508 void WorkerScript::idleHandler()
509 { 509 {
510 ASSERT(m_workerGlobalScope.get()); 510 ASSERT(m_workerGlobalScope.get());
511 int64_t delay = kLongIdleHandlerDelayMs; 511 int64_t delay = kLongIdleHandlerDelayMs;
512 512
513 // Do a script engine idle notification if the next event is distant enough. 513 // Do a script engine idle notification if the next event is distant enough.
514 const double kMinIdleTimespan = 0.3; 514 const double kMinIdleTimespan = 0.3;
515 const double nextFireTime = PlatformThreadData::current().threadTimers().nex tFireTime(); 515 const double nextFireTime = PlatformThreadData::current().threadTimers().nex tFireTime();
516 if (nextFireTime == 0.0 || nextFireTime > currentTime() + kMinIdleTimespan) { 516 if (nextFireTime == 0.0 || nextFireTime > currentTime() + kMinIdleTimespan) {
517 bool hasMoreWork = !isolate()->IdleNotificationDeadline(Platform::curren t()->monotonicallyIncreasingTime() + 1.0); 517 bool hasMoreWork = !isolate()->IdleNotificationDeadline(Platform::curren t()->monotonicallyIncreasingTime() + 1.0);
518 if (hasMoreWork) 518 if (hasMoreWork)
519 delay = kShortIdleHandlerDelayMs; 519 delay = kShortIdleHandlerDelayMs;
520 } 520 }
521 521
522 postDelayedTask(FROM_HERE, createSameThreadTask(&WorkerThread::idleHandler, this), delay); 522 postDelayedTask(FROM_HERE, createSameThreadTask(&WorkerScript::idleHandler, this), delay);
523 } 523 }
524 524
525 void WorkerThread::postTask(const WebTraceLocation& location, PassOwnPtr<Executi onContextTask> task) 525 void WorkerScript::postTask(const WebTraceLocation& location, PassOwnPtr<Executi onContextTask> task)
526 { 526 {
527 backingThread().postTask(location, WorkerThreadTask::create(*this, task, tru e).leakPtr()); 527 backingThread().postTask(location, WorkerScriptTask::create(*this, task, tru e).leakPtr());
528 } 528 }
529 529
530 void WorkerThread::postDelayedTask(const WebTraceLocation& location, PassOwnPtr< ExecutionContextTask> task, long long delayMs) 530 void WorkerScript::postDelayedTask(const WebTraceLocation& location, PassOwnPtr< ExecutionContextTask> task, long long delayMs)
531 { 531 {
532 backingThread().postDelayedTask(location, WorkerThreadTask::create(*this, ta sk, true).leakPtr(), delayMs); 532 backingThread().postDelayedTask(location, WorkerScriptTask::create(*this, ta sk, true).leakPtr(), delayMs);
533 } 533 }
534 534
535 v8::Isolate* WorkerThread::initializeIsolate() 535 v8::Isolate* WorkerScript::initializeIsolate()
536 { 536 {
537 ASSERT(isCurrentThread()); 537 ASSERT(isCurrentThread());
538 ASSERT(!m_isolate); 538 ASSERT(!m_isolate);
539 v8::Isolate* isolate = V8PerIsolateData::initialize(); 539 v8::Isolate* isolate = V8PerIsolateData::initialize();
540 V8Initializer::initializeWorker(isolate); 540 V8Initializer::initializeWorker(isolate);
541 541
542 m_interruptor = adoptPtr(new V8IsolateInterruptor(isolate)); 542 m_interruptor = adoptPtr(new V8IsolateInterruptor(isolate));
543 ThreadState::current()->addInterruptor(m_interruptor.get()); 543 ThreadState::current()->addInterruptor(m_interruptor.get());
544 ThreadState::current()->registerTraceDOMWrappers(isolate, V8GCController::tr aceDOMWrappers); 544 ThreadState::current()->registerTraceDOMWrappers(isolate, V8GCController::tr aceDOMWrappers);
545 545
546 return isolate; 546 return isolate;
547 } 547 }
548 548
549 void WorkerThread::willDestroyIsolate() 549 void WorkerScript::willDestroyIsolate()
550 { 550 {
551 ASSERT(isCurrentThread()); 551 ASSERT(isCurrentThread());
552 ASSERT(m_isolate); 552 ASSERT(m_isolate);
553 V8PerIsolateData::willBeDestroyed(m_isolate); 553 V8PerIsolateData::willBeDestroyed(m_isolate);
554 ThreadState::current()->removeInterruptor(m_interruptor.get()); 554 ThreadState::current()->removeInterruptor(m_interruptor.get());
555 } 555 }
556 556
557 void WorkerThread::destroyIsolate() 557 void WorkerScript::destroyIsolate()
558 { 558 {
559 ASSERT(isCurrentThread()); 559 ASSERT(isCurrentThread());
560 V8PerIsolateData::destroy(m_isolate); 560 V8PerIsolateData::destroy(m_isolate);
561 m_isolate = nullptr; 561 m_isolate = nullptr;
562 } 562 }
563 563
564 void WorkerThread::terminateV8Execution() 564 void WorkerScript::terminateV8Execution()
565 { 565 {
566 ASSERT(isMainThread()); 566 ASSERT(isMainThread());
567 m_workerGlobalScope->script()->willScheduleExecutionTermination(); 567 m_workerGlobalScope->scriptController()->willScheduleExecutionTermination();
568 v8::V8::TerminateExecution(m_isolate); 568 v8::V8::TerminateExecution(m_isolate);
569 } 569 }
570 570
571 void WorkerThread::postDebuggerTask(const WebTraceLocation& location, PassOwnPtr <ExecutionContextTask> task) 571 void WorkerScript::postDebuggerTask(const WebTraceLocation& location, PassOwnPtr <ExecutionContextTask> task)
572 { 572 {
573 m_debuggerMessageQueue.append(WorkerThreadTask::create(*this, task, false)); 573 m_debuggerMessageQueue.append(WorkerScriptTask::create(*this, task, false));
574 postTask(location, RunDebuggerQueueTask::create(this)); 574 postTask(location, RunDebuggerQueueTask::create(this));
575 } 575 }
576 576
577 MessageQueueWaitResult WorkerThread::runDebuggerTask(WaitMode waitMode) 577 MessageQueueWaitResult WorkerScript::runDebuggerTask(WaitMode waitMode)
578 { 578 {
579 ASSERT(isCurrentThread()); 579 ASSERT(isCurrentThread());
580 MessageQueueWaitResult result; 580 MessageQueueWaitResult result;
581 double absoluteTime = MessageQueue<WebThread::Task>::infiniteTime(); 581 double absoluteTime = MessageQueue<WebThread::Task>::infiniteTime();
582 OwnPtr<WebThread::Task> task; 582 OwnPtr<WebThread::Task> task;
583 { 583 {
584 if (waitMode == DontWaitForMessage) 584 if (waitMode == DontWaitForMessage)
585 absoluteTime = 0.0; 585 absoluteTime = 0.0;
586 SafePointScope safePointScope(ThreadState::NoHeapPointersOnStack); 586 SafePointScope safePointScope(ThreadState::NoHeapPointersOnStack);
587 task = m_debuggerMessageQueue.waitForMessageWithTimeout(result, absolute Time); 587 task = m_debuggerMessageQueue.waitForMessageWithTimeout(result, absolute Time);
588 } 588 }
589 589
590 if (result == MessageQueueMessageReceived) { 590 if (result == MessageQueueMessageReceived) {
591 InspectorInstrumentation::willProcessTask(workerGlobalScope()); 591 InspectorInstrumentation::willProcessTask(workerGlobalScope());
592 task->run(); 592 task->run();
593 InspectorInstrumentation::didProcessTask(workerGlobalScope()); 593 InspectorInstrumentation::didProcessTask(workerGlobalScope());
594 } 594 }
595 595
596 return result; 596 return result;
597 } 597 }
598 598
599 void WorkerThread::willEnterNestedLoop() 599 void WorkerScript::willEnterNestedLoop()
600 { 600 {
601 InspectorInstrumentation::willEnterNestedRunLoop(m_workerGlobalScope.get()); 601 InspectorInstrumentation::willEnterNestedRunLoop(m_workerGlobalScope.get());
602 } 602 }
603 603
604 void WorkerThread::didLeaveNestedLoop() 604 void WorkerScript::didLeaveNestedLoop()
605 { 605 {
606 InspectorInstrumentation::didLeaveNestedRunLoop(m_workerGlobalScope.get()); 606 InspectorInstrumentation::didLeaveNestedRunLoop(m_workerGlobalScope.get());
607 } 607 }
608 608
609 void WorkerThread::setWorkerInspectorController(WorkerInspectorController* worke rInspectorController) 609 void WorkerScript::setWorkerInspectorController(WorkerInspectorController* worke rInspectorController)
610 { 610 {
611 MutexLocker locker(m_workerInspectorControllerMutex); 611 MutexLocker locker(m_workerInspectorControllerMutex);
612 m_workerInspectorController = workerInspectorController; 612 m_workerInspectorController = workerInspectorController;
613 } 613 }
614 614
615 } // namespace blink 615 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698