OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009, 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2009, 2010 Google 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 are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 | 52 |
53 namespace blink { | 53 namespace blink { |
54 | 54 |
55 static PassOwnPtr<Vector<char>> createVectorFromMemoryRegion(const char* data, u
nsigned dataLength) | 55 static PassOwnPtr<Vector<char>> createVectorFromMemoryRegion(const char* data, u
nsigned dataLength) |
56 { | 56 { |
57 OwnPtr<Vector<char>> buffer = adoptPtr(new Vector<char>(dataLength)); | 57 OwnPtr<Vector<char>> buffer = adoptPtr(new Vector<char>(dataLength)); |
58 memcpy(buffer->data(), data, dataLength); | 58 memcpy(buffer->data(), data, dataLength); |
59 return buffer.release(); | 59 return buffer.release(); |
60 } | 60 } |
61 | 61 |
62 WorkerThreadableLoader::WorkerThreadableLoader(WorkerGlobalScope& workerGlobalSc
ope, ThreadableLoaderClient* client, const ResourceRequest& request, const Threa
dableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderOptions,
BlockingBehavior blockingBehavior) | 62 WorkerThreadableLoader::WorkerThreadableLoader(WorkerGlobalScope& workerGlobalSc
ope, ThreadableLoaderClient* client, const ThreadableLoaderOptions& options, con
st ResourceLoaderOptions& resourceLoaderOptions, BlockingBehavior blockingBehavi
or) |
63 : m_workerGlobalScope(&workerGlobalScope) | 63 : m_workerGlobalScope(&workerGlobalScope) |
64 , m_workerClientWrapper(ThreadableLoaderClientWrapper::create(client)) | 64 , m_workerClientWrapper(ThreadableLoaderClientWrapper::create(client)) |
65 { | 65 { |
66 m_workerClientWrapper->setResourceTimingClient(this); | 66 m_workerClientWrapper->setResourceTimingClient(this); |
67 if (blockingBehavior == LoadAsynchronously) { | 67 if (blockingBehavior == LoadAsynchronously) { |
68 m_bridge = new MainThreadAsyncBridge(workerGlobalScope, m_workerClientWr
apper, request, options, resourceLoaderOptions, workerGlobalScope.referrerPolicy
(), workerGlobalScope.url().strippedForUseAsReferrer()); | 68 m_bridge = new MainThreadAsyncBridge(workerGlobalScope, m_workerClientWr
apper, options, resourceLoaderOptions); |
69 } else { | 69 } else { |
70 m_bridge = new MainThreadSyncBridge(workerGlobalScope, m_workerClientWra
pper, request, options, resourceLoaderOptions, workerGlobalScope.referrerPolicy(
), workerGlobalScope.url().strippedForUseAsReferrer()); | 70 m_bridge = new MainThreadSyncBridge(workerGlobalScope, m_workerClientWra
pper, options, resourceLoaderOptions); |
71 } | 71 } |
72 } | 72 } |
73 | 73 |
74 void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope& worker
GlobalScope, const ResourceRequest& request, ThreadableLoaderClient& client, con
st ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoader
Options) | 74 void WorkerThreadableLoader::loadResourceSynchronously(WorkerGlobalScope& worker
GlobalScope, const ResourceRequest& request, ThreadableLoaderClient& client, con
st ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoader
Options) |
75 { | 75 { |
76 RefPtr<WorkerThreadableLoader> loader = adoptRef(new WorkerThreadableLoader(
workerGlobalScope, &client, request, options, resourceLoaderOptions, LoadSynchro
nously)); | 76 RefPtr<WorkerThreadableLoader> loader = adoptRef(new WorkerThreadableLoader(
workerGlobalScope, &client, options, resourceLoaderOptions, LoadSynchronously)); |
| 77 loader->start(request); |
77 } | 78 } |
78 | 79 |
79 WorkerThreadableLoader::~WorkerThreadableLoader() | 80 WorkerThreadableLoader::~WorkerThreadableLoader() |
80 { | 81 { |
81 m_workerClientWrapper->clearResourceTimingClient(); | 82 m_workerClientWrapper->clearResourceTimingClient(); |
82 m_bridge->destroy(); | 83 m_bridge->destroy(); |
83 m_bridge = nullptr; | 84 m_bridge = nullptr; |
84 } | 85 } |
85 | 86 |
| 87 void WorkerThreadableLoader::start(const ResourceRequest& request) |
| 88 { |
| 89 m_bridge->start(request, *m_workerGlobalScope); |
| 90 m_workerClientWrapper->setResourceTimingClient(this); |
| 91 } |
| 92 |
86 void WorkerThreadableLoader::overrideTimeout(unsigned long timeoutMilliseconds) | 93 void WorkerThreadableLoader::overrideTimeout(unsigned long timeoutMilliseconds) |
87 { | 94 { |
88 ASSERT(m_bridge); | 95 ASSERT(m_bridge); |
89 m_bridge->overrideTimeout(timeoutMilliseconds); | 96 m_bridge->overrideTimeout(timeoutMilliseconds); |
90 } | 97 } |
91 | 98 |
92 void WorkerThreadableLoader::cancel() | 99 void WorkerThreadableLoader::cancel() |
93 { | 100 { |
94 ASSERT(m_bridge); | 101 ASSERT(m_bridge); |
95 m_bridge->cancel(); | 102 m_bridge->cancel(); |
(...skipping 11 matching lines...) Expand all Loading... |
107 , m_loaderProxy(loaderProxy) | 114 , m_loaderProxy(loaderProxy) |
108 { | 115 { |
109 ASSERT(m_workerClientWrapper.get()); | 116 ASSERT(m_workerClientWrapper.get()); |
110 ASSERT(m_loaderProxy.get()); | 117 ASSERT(m_loaderProxy.get()); |
111 } | 118 } |
112 | 119 |
113 WorkerThreadableLoader::MainThreadBridgeBase::~MainThreadBridgeBase() | 120 WorkerThreadableLoader::MainThreadBridgeBase::~MainThreadBridgeBase() |
114 { | 121 { |
115 } | 122 } |
116 | 123 |
117 void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadCreateLoader(PassOw
nPtr<CrossThreadResourceRequestData> requestData, ThreadableLoaderOptions option
s, ResourceLoaderOptions resourceLoaderOptions, const ReferrerPolicy referrerPol
icy, const String& outgoingReferrer, ExecutionContext* context) | 124 void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadCreateLoader(Thread
ableLoaderOptions options, ResourceLoaderOptions resourceLoaderOptions, Executio
nContext* context) |
118 { | 125 { |
119 ASSERT(isMainThread()); | 126 ASSERT(isMainThread()); |
120 Document* document = toDocument(context); | 127 Document* document = toDocument(context); |
121 | 128 |
| 129 resourceLoaderOptions.requestInitiatorContext = WorkerContext; |
| 130 m_mainThreadLoader = DocumentThreadableLoader::create(*document, this, optio
ns, resourceLoaderOptions); |
| 131 ASSERT(m_mainThreadLoader); |
| 132 } |
| 133 |
| 134 void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadStart(PassOwnPtr<Cr
ossThreadResourceRequestData> requestData, const ReferrerPolicy referrerPolicy,
const String& outgoingReferrer) |
| 135 { |
| 136 ASSERT(isMainThread()); |
| 137 ASSERT(m_mainThreadLoader); |
| 138 |
122 ResourceRequest request(requestData.get()); | 139 ResourceRequest request(requestData.get()); |
123 if (!request.didSetHTTPReferrer()) | 140 if (!request.didSetHTTPReferrer()) |
124 request.setHTTPReferrer(SecurityPolicy::generateReferrer(referrerPolicy,
request.url(), outgoingReferrer)); | 141 request.setHTTPReferrer(SecurityPolicy::generateReferrer(referrerPolicy,
request.url(), outgoingReferrer)); |
125 resourceLoaderOptions.requestInitiatorContext = WorkerContext; | 142 m_mainThreadLoader->start(request); |
126 m_mainThreadLoader = DocumentThreadableLoader::create(*document, this, reque
st, options, resourceLoaderOptions); | |
127 if (!m_mainThreadLoader) { | |
128 // DocumentThreadableLoader::create may return 0 when the document loade
r has been already changed. | |
129 didFail(ResourceError(errorDomainBlinkInternal, 0, request.url().string(
), "The parent document page has been unloaded.")); | |
130 } | |
131 } | 143 } |
132 | 144 |
133 void WorkerThreadableLoader::MainThreadBridgeBase::createLoader(const ResourceRe
quest& request, const ThreadableLoaderOptions& options, const ResourceLoaderOpti
ons& resourceLoaderOptions, const ReferrerPolicy& referrerPolicy, const String&
outgoingReferrer) | 145 void WorkerThreadableLoader::MainThreadBridgeBase::createLoaderInMainThread(cons
t ThreadableLoaderOptions& options, const ResourceLoaderOptions& resourceLoaderO
ptions) |
134 { | 146 { |
135 m_loaderProxy->postTaskToLoader(createCrossThreadTask(&MainThreadBridgeBase:
:mainThreadCreateLoader, this, request, options, resourceLoaderOptions, referrer
Policy, outgoingReferrer)); | 147 m_loaderProxy->postTaskToLoader(createCrossThreadTask(&MainThreadBridgeBase:
:mainThreadCreateLoader, this, options, resourceLoaderOptions)); |
| 148 } |
| 149 |
| 150 void WorkerThreadableLoader::MainThreadBridgeBase::startInMainThread(const Resou
rceRequest& request, const WorkerGlobalScope& workerGlobalScope) |
| 151 { |
| 152 loaderProxy()->postTaskToLoader(createCrossThreadTask(&MainThreadBridgeBase:
:mainThreadStart, this, request, workerGlobalScope.referrerPolicy(), workerGloba
lScope.url().strippedForUseAsReferrer())); |
136 } | 153 } |
137 | 154 |
138 void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadDestroy(ExecutionCo
ntext* context) | 155 void WorkerThreadableLoader::MainThreadBridgeBase::mainThreadDestroy(ExecutionCo
ntext* context) |
139 { | 156 { |
140 ASSERT(isMainThread()); | 157 ASSERT(isMainThread()); |
141 ASSERT_UNUSED(context, context->isDocument()); | 158 ASSERT_UNUSED(context, context->isDocument()); |
142 delete this; | 159 delete this; |
143 } | 160 } |
144 | 161 |
145 void WorkerThreadableLoader::MainThreadBridgeBase::destroy() | 162 void WorkerThreadableLoader::MainThreadBridgeBase::destroy() |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 // |this| might be already destructed here because didFail() might | 208 // |this| might be already destructed here because didFail() might |
192 // clear a reference to ThreadableLoader, which might destruct | 209 // clear a reference to ThreadableLoader, which might destruct |
193 // WorkerThreadableLoader and then MainThreadBridge. | 210 // WorkerThreadableLoader and then MainThreadBridge. |
194 // Therefore we call clearClient() directly, rather than calling | 211 // Therefore we call clearClient() directly, rather than calling |
195 // this->m_workerClientWrapper->clearClient(). | 212 // this->m_workerClientWrapper->clearClient(). |
196 clientWrapper->clearClient(); | 213 clientWrapper->clearClient(); |
197 } | 214 } |
198 | 215 |
199 void WorkerThreadableLoader::MainThreadBridgeBase::didSendData(unsigned long lon
g bytesSent, unsigned long long totalBytesToBeSent) | 216 void WorkerThreadableLoader::MainThreadBridgeBase::didSendData(unsigned long lon
g bytesSent, unsigned long long totalBytesToBeSent) |
200 { | 217 { |
201 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dSendData, workerClientWrapper(), bytesSent, totalBytesToBeSent)); | 218 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dSendData, m_workerClientWrapper, bytesSent, totalBytesToBeSent)); |
202 } | 219 } |
203 | 220 |
204 void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveResponse(unsigned l
ong identifier, const ResourceResponse& response, PassOwnPtr<WebDataConsumerHand
le> handle) | 221 void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveResponse(unsigned l
ong identifier, const ResourceResponse& response, PassOwnPtr<WebDataConsumerHand
le> handle) |
205 { | 222 { |
206 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dReceiveResponse, workerClientWrapper(), identifier, response, handle)); | 223 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dReceiveResponse, m_workerClientWrapper, identifier, response, handle)); |
207 } | 224 } |
208 | 225 |
209 void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveData(const char* da
ta, unsigned dataLength) | 226 void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveData(const char* da
ta, unsigned dataLength) |
210 { | 227 { |
211 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dReceiveData, workerClientWrapper(), createVectorFromMemoryRegion(data, dataLeng
th))); | 228 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dReceiveData, m_workerClientWrapper, createVectorFromMemoryRegion(data, dataLeng
th))); |
212 } | 229 } |
213 | 230 |
214 void WorkerThreadableLoader::MainThreadBridgeBase::didDownloadData(int dataLengt
h) | 231 void WorkerThreadableLoader::MainThreadBridgeBase::didDownloadData(int dataLengt
h) |
215 { | 232 { |
216 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dDownloadData, workerClientWrapper(), dataLength)); | 233 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dDownloadData, m_workerClientWrapper, dataLength)); |
217 } | 234 } |
218 | 235 |
219 void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveCachedMetadata(cons
t char* data, int dataLength) | 236 void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveCachedMetadata(cons
t char* data, int dataLength) |
220 { | 237 { |
221 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dReceiveCachedMetadata, workerClientWrapper(), createVectorFromMemoryRegion(data
, dataLength))); | 238 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dReceiveCachedMetadata, m_workerClientWrapper, createVectorFromMemoryRegion(data
, dataLength))); |
222 } | 239 } |
223 | 240 |
224 void WorkerThreadableLoader::MainThreadBridgeBase::didFinishLoading(unsigned lon
g identifier, double finishTime) | 241 void WorkerThreadableLoader::MainThreadBridgeBase::didFinishLoading(unsigned lon
g identifier, double finishTime) |
225 { | 242 { |
226 forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClien
tWrapper::didFinishLoading, workerClientWrapper(), identifier, finishTime)); | 243 forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClien
tWrapper::didFinishLoading, m_workerClientWrapper, identifier, finishTime)); |
227 } | 244 } |
228 | 245 |
229 void WorkerThreadableLoader::MainThreadBridgeBase::didFail(const ResourceError&
error) | 246 void WorkerThreadableLoader::MainThreadBridgeBase::didFail(const ResourceError&
error) |
230 { | 247 { |
231 forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClien
tWrapper::didFail, workerClientWrapper(), error)); | 248 forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClien
tWrapper::didFail, m_workerClientWrapper, error)); |
232 } | 249 } |
233 | 250 |
234 void WorkerThreadableLoader::MainThreadBridgeBase::didFailAccessControlCheck(con
st ResourceError& error) | 251 void WorkerThreadableLoader::MainThreadBridgeBase::didFailAccessControlCheck(con
st ResourceError& error) |
235 { | 252 { |
236 forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClien
tWrapper::didFailAccessControlCheck, workerClientWrapper(), error)); | 253 forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClien
tWrapper::didFailAccessControlCheck, m_workerClientWrapper, error)); |
237 } | 254 } |
238 | 255 |
239 void WorkerThreadableLoader::MainThreadBridgeBase::didFailRedirectCheck() | 256 void WorkerThreadableLoader::MainThreadBridgeBase::didFailRedirectCheck() |
240 { | 257 { |
241 forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClien
tWrapper::didFailRedirectCheck, workerClientWrapper())); | 258 forwardTaskToWorkerOnLoaderDone(createCrossThreadTask(&ThreadableLoaderClien
tWrapper::didFailRedirectCheck, m_workerClientWrapper)); |
242 } | 259 } |
243 | 260 |
244 void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveResourceTiming(cons
t ResourceTimingInfo& info) | 261 void WorkerThreadableLoader::MainThreadBridgeBase::didReceiveResourceTiming(cons
t ResourceTimingInfo& info) |
245 { | 262 { |
246 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dReceiveResourceTiming, workerClientWrapper(), info)); | 263 forwardTaskToWorker(createCrossThreadTask(&ThreadableLoaderClientWrapper::di
dReceiveResourceTiming, m_workerClientWrapper, info)); |
247 } | 264 } |
248 | 265 |
249 WorkerThreadableLoader::MainThreadAsyncBridge::MainThreadAsyncBridge( | 266 WorkerThreadableLoader::MainThreadAsyncBridge::MainThreadAsyncBridge( |
250 WorkerGlobalScope& workerGlobalScope, | 267 WorkerGlobalScope& workerGlobalScope, |
251 PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, | 268 PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, |
252 const ResourceRequest& request, | |
253 const ThreadableLoaderOptions& options, | 269 const ThreadableLoaderOptions& options, |
254 const ResourceLoaderOptions& resourceLoaderOptions, | 270 const ResourceLoaderOptions& resourceLoaderOptions) |
255 const ReferrerPolicy referrerPolicy, | |
256 const String& outgoingReferrer) | |
257 : MainThreadBridgeBase(workerClientWrapper, workerGlobalScope.thread()->work
erLoaderProxy()) | 271 : MainThreadBridgeBase(workerClientWrapper, workerGlobalScope.thread()->work
erLoaderProxy()) |
258 { | 272 { |
259 createLoader(request, options, resourceLoaderOptions, referrerPolicy, outgoi
ngReferrer); | 273 createLoaderInMainThread(options, resourceLoaderOptions); |
| 274 } |
| 275 |
| 276 void WorkerThreadableLoader::MainThreadAsyncBridge::start(const ResourceRequest&
request, const WorkerGlobalScope& workerGlobalScope) |
| 277 { |
| 278 startInMainThread(request, workerGlobalScope); |
260 } | 279 } |
261 | 280 |
262 WorkerThreadableLoader::MainThreadAsyncBridge::~MainThreadAsyncBridge() | 281 WorkerThreadableLoader::MainThreadAsyncBridge::~MainThreadAsyncBridge() |
263 { | 282 { |
264 } | 283 } |
265 | 284 |
266 void WorkerThreadableLoader::MainThreadAsyncBridge::forwardTaskToWorker(PassOwnP
tr<ExecutionContextTask> task) | 285 void WorkerThreadableLoader::MainThreadAsyncBridge::forwardTaskToWorker(PassOwnP
tr<ExecutionContextTask> task) |
267 { | 286 { |
268 loaderProxy()->postTaskToWorkerGlobalScope(task); | 287 loaderProxy()->postTaskToWorkerGlobalScope(task); |
269 } | 288 } |
270 | 289 |
271 void WorkerThreadableLoader::MainThreadAsyncBridge::forwardTaskToWorkerOnLoaderD
one(PassOwnPtr<ExecutionContextTask> task) | 290 void WorkerThreadableLoader::MainThreadAsyncBridge::forwardTaskToWorkerOnLoaderD
one(PassOwnPtr<ExecutionContextTask> task) |
272 { | 291 { |
273 loaderProxy()->postTaskToWorkerGlobalScope(task); | 292 loaderProxy()->postTaskToWorkerGlobalScope(task); |
274 } | 293 } |
275 | 294 |
276 WorkerThreadableLoader::MainThreadSyncBridge::MainThreadSyncBridge( | 295 WorkerThreadableLoader::MainThreadSyncBridge::MainThreadSyncBridge( |
277 WorkerGlobalScope& workerGlobalScope, | 296 WorkerGlobalScope& workerGlobalScope, |
278 PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, | 297 PassRefPtr<ThreadableLoaderClientWrapper> workerClientWrapper, |
279 const ResourceRequest& request, | |
280 const ThreadableLoaderOptions& options, | 298 const ThreadableLoaderOptions& options, |
281 const ResourceLoaderOptions& resourceLoaderOptions, | 299 const ResourceLoaderOptions& resourceLoaderOptions) |
282 const ReferrerPolicy referrerPolicy, | |
283 const String& outgoingReferrer) | |
284 : MainThreadBridgeBase(workerClientWrapper, workerGlobalScope.thread()->work
erLoaderProxy()) | 300 : MainThreadBridgeBase(workerClientWrapper, workerGlobalScope.thread()->work
erLoaderProxy()) |
285 , m_done(false) | 301 , m_done(false) |
286 { | 302 { |
| 303 createLoaderInMainThread(options, resourceLoaderOptions); |
| 304 } |
| 305 |
| 306 void WorkerThreadableLoader::MainThreadSyncBridge::start(const ResourceRequest&
request, const WorkerGlobalScope& workerGlobalScope) |
| 307 { |
287 WaitableEvent* shutdownEvent = workerGlobalScope.thread()->shutdownEvent(); | 308 WaitableEvent* shutdownEvent = workerGlobalScope.thread()->shutdownEvent(); |
288 m_loaderDoneEvent = adoptPtr(new WaitableEvent()); | 309 m_loaderDoneEvent = adoptPtr(new WaitableEvent()); |
289 | 310 |
290 createLoader(request, options, resourceLoaderOptions, referrerPolicy, outgoi
ngReferrer); | 311 startInMainThread(request, workerGlobalScope); |
291 | 312 |
292 size_t signaledIndex; | 313 size_t signaledIndex; |
293 { | 314 { |
294 Vector<WaitableEvent*> events; | 315 Vector<WaitableEvent*> events; |
295 // Order is important; indicies are used later. | 316 // Order is important; indicies are used later. |
296 events.append(shutdownEvent); | 317 events.append(shutdownEvent); |
297 events.append(m_loaderDoneEvent.get()); | 318 events.append(m_loaderDoneEvent.get()); |
298 | 319 |
299 SafePointScope scope(BlinkGC::HeapPointersOnStack); | 320 SafePointScope scope(BlinkGC::HeapPointersOnStack); |
300 signaledIndex = WaitableEvent::waitMultiple(events); | 321 signaledIndex = WaitableEvent::waitMultiple(events); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 | 363 |
343 MutexLocker lock(m_lock); | 364 MutexLocker lock(m_lock); |
344 RELEASE_ASSERT(!m_done); | 365 RELEASE_ASSERT(!m_done); |
345 | 366 |
346 m_clientTasks.append(task); | 367 m_clientTasks.append(task); |
347 m_done = true; | 368 m_done = true; |
348 m_loaderDoneEvent->signal(); | 369 m_loaderDoneEvent->signal(); |
349 } | 370 } |
350 | 371 |
351 } // namespace blink | 372 } // namespace blink |
OLD | NEW |