Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2011, 2012 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 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 221 m_bridge->suspend(); | 221 m_bridge->suspend(); |
| 222 } | 222 } |
| 223 | 223 |
| 224 void WorkerThreadableWebSocketChannel::resume() | 224 void WorkerThreadableWebSocketChannel::resume() |
| 225 { | 225 { |
| 226 m_workerClientWrapper->resume(); | 226 m_workerClientWrapper->resume(); |
| 227 if (m_bridge) | 227 if (m_bridge) |
| 228 m_bridge->resume(); | 228 m_bridge->resume(); |
| 229 } | 229 } |
| 230 | 230 |
| 231 WorkerThreadableWebSocketChannel::Peer::Peer(PassRefPtr<WeakReference<Peer> > re ference, PassRefPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper, Work erLoaderProxy& loaderProxy, ExecutionContext* context, const String& sourceURL, unsigned lineNumber, PassOwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper ) | 231 void WorkerThreadableWebSocketChannel::trace(Visitor* visitor) |
| 232 { | |
| 233 visitor->trace(m_workerClientWrapper); | |
| 234 WebSocketChannel::trace(visitor); | |
| 235 } | |
| 236 | |
| 237 WorkerThreadableWebSocketChannel::Peer::Peer(PassRefPtr<WeakReference<Peer> > re ference, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> clientW rapper, WorkerLoaderProxy& loaderProxy, ExecutionContext* context, const String& sourceURL, unsigned lineNumber, PassOwnPtr<ThreadableWebSocketChannelSyncHelper > syncHelper) | |
| 232 : m_workerClientWrapper(clientWrapper) | 238 : m_workerClientWrapper(clientWrapper) |
| 233 , m_loaderProxy(loaderProxy) | 239 , m_loaderProxy(loaderProxy) |
| 234 , m_mainWebSocketChannel(nullptr) | 240 , m_mainWebSocketChannel(nullptr) |
| 235 , m_syncHelper(syncHelper) | 241 , m_syncHelper(syncHelper) |
| 236 , m_weakFactory(reference, this) | 242 , m_weakFactory(reference, this) |
| 237 { | 243 { |
| 238 ASSERT(isMainThread()); | 244 ASSERT(isMainThread()); |
| 239 ASSERT(m_workerClientWrapper.get()); | 245 ASSERT(m_workerClientWrapper.get()); |
| 240 | 246 |
| 241 Document* document = toDocument(context); | 247 Document* document = toDocument(context); |
| 242 if (RuntimeEnabledFeatures::experimentalWebSocketEnabled()) { | 248 if (RuntimeEnabledFeatures::experimentalWebSocketEnabled()) { |
| 243 m_mainWebSocketChannel = NewWebSocketChannelImpl::create(document, this, sourceURL, lineNumber); | 249 m_mainWebSocketChannel = NewWebSocketChannelImpl::create(document, this, sourceURL, lineNumber); |
| 244 } else { | 250 } else { |
| 245 m_mainWebSocketChannel = MainThreadWebSocketChannel::create(document, th is, sourceURL, lineNumber); | 251 m_mainWebSocketChannel = MainThreadWebSocketChannel::create(document, th is, sourceURL, lineNumber); |
| 246 } | 252 } |
| 247 | 253 |
| 248 m_syncHelper->signalWorkerThread(); | 254 m_syncHelper->signalWorkerThread(); |
| 249 } | 255 } |
| 250 | 256 |
| 251 WorkerThreadableWebSocketChannel::Peer::~Peer() | 257 WorkerThreadableWebSocketChannel::Peer::~Peer() |
| 252 { | 258 { |
| 253 ASSERT(isMainThread()); | 259 ASSERT(isMainThread()); |
| 254 if (m_mainWebSocketChannel) | 260 if (m_mainWebSocketChannel) |
| 255 m_mainWebSocketChannel->disconnect(); | 261 m_mainWebSocketChannel->disconnect(); |
| 256 } | 262 } |
| 257 | 263 |
| 258 void WorkerThreadableWebSocketChannel::Peer::initialize(ExecutionContext* contex t, PassRefPtr<WeakReference<Peer> > reference, WorkerLoaderProxy* loaderProxy, P assRefPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper, const String& sourceURLAtConnection, unsigned lineNumberAtConnection, PassOwnPtr<ThreadableWeb SocketChannelSyncHelper> syncHelper) | 264 void WorkerThreadableWebSocketChannel::Peer::initialize(ExecutionContext* contex t, PassRefPtr<WeakReference<Peer> > reference, WorkerLoaderProxy* loaderProxy, P assRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper, co nst String& sourceURLAtConnection, unsigned lineNumberAtConnection, PassOwnPtr<T hreadableWebSocketChannelSyncHelper> syncHelper) |
| 259 { | 265 { |
| 260 // The caller must call destroy() to free the peer. | 266 // The caller must call destroy() to free the peer. |
| 261 new Peer(reference, clientWrapper, *loaderProxy, context, sourceURLAtConnect ion, lineNumberAtConnection, syncHelper); | 267 new Peer(reference, clientWrapper, *loaderProxy, context, sourceURLAtConnect ion, lineNumberAtConnection, syncHelper); |
| 262 } | 268 } |
| 263 | 269 |
| 264 void WorkerThreadableWebSocketChannel::Peer::destroy() | 270 void WorkerThreadableWebSocketChannel::Peer::destroy() |
| 265 { | 271 { |
| 266 ASSERT(isMainThread()); | 272 ASSERT(isMainThread()); |
| 267 delete this; | 273 delete this; |
| 268 } | 274 } |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 361 } | 367 } |
| 362 | 368 |
| 363 void WorkerThreadableWebSocketChannel::Peer::resume() | 369 void WorkerThreadableWebSocketChannel::Peer::resume() |
| 364 { | 370 { |
| 365 ASSERT(isMainThread()); | 371 ASSERT(isMainThread()); |
| 366 if (!m_mainWebSocketChannel) | 372 if (!m_mainWebSocketChannel) |
| 367 return; | 373 return; |
| 368 m_mainWebSocketChannel->resume(); | 374 m_mainWebSocketChannel->resume(); |
| 369 } | 375 } |
| 370 | 376 |
| 371 static void workerGlobalScopeDidConnect(ExecutionContext* context, PassRefPtr<Th readableWebSocketChannelClientWrapper> workerClientWrapper, const String& subpro tocol, const String& extensions) | 377 static void workerGlobalScopeDidConnect(ExecutionContext* context, PassRefPtrWil lBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, const St ring& subprotocol, const String& extensions) |
| 372 { | 378 { |
| 373 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 379 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 374 workerClientWrapper->setSubprotocol(subprotocol); | 380 workerClientWrapper->setSubprotocol(subprotocol); |
| 375 workerClientWrapper->setExtensions(extensions); | 381 workerClientWrapper->setExtensions(extensions); |
| 376 workerClientWrapper->didConnect(); | 382 workerClientWrapper->didConnect(); |
| 377 } | 383 } |
| 378 | 384 |
| 379 void WorkerThreadableWebSocketChannel::Peer::didConnect() | 385 void WorkerThreadableWebSocketChannel::Peer::didConnect() |
| 380 { | 386 { |
| 381 ASSERT(isMainThread()); | 387 ASSERT(isMainThread()); |
| 382 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidConnect, m_workerClientWrapper, m_mainWebSocketChannel->subprotocol(), m_m ainWebSocketChannel->extensions())); | 388 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidConnect, m_workerClientWrapper.get(), m_mainWebSocketChannel->subprotocol( ), m_mainWebSocketChannel->extensions())); |
| 383 } | 389 } |
| 384 | 390 |
| 385 static void workerGlobalScopeDidReceiveMessage(ExecutionContext* context, PassRe fPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, const String& message) | 391 static void workerGlobalScopeDidReceiveMessage(ExecutionContext* context, PassRe fPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, c onst String& message) |
| 386 { | 392 { |
| 387 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 393 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 388 workerClientWrapper->didReceiveMessage(message); | 394 workerClientWrapper->didReceiveMessage(message); |
| 389 } | 395 } |
| 390 | 396 |
| 391 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessage(const String& mes sage) | 397 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessage(const String& mes sage) |
| 392 { | 398 { |
| 393 ASSERT(isMainThread()); | 399 ASSERT(isMainThread()); |
| 394 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveMessage, m_workerClientWrapper, message)); | 400 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveMessage, m_workerClientWrapper.get(), message)); |
| 395 } | 401 } |
| 396 | 402 |
| 397 static void workerGlobalScopeDidReceiveBinaryData(ExecutionContext* context, Pas sRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, PassOwnPtr <Vector<char> > binaryData) | 403 static void workerGlobalScopeDidReceiveBinaryData(ExecutionContext* context, Pas sRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper , PassOwnPtr<Vector<char> > binaryData) |
| 398 { | 404 { |
| 399 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 405 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 400 workerClientWrapper->didReceiveBinaryData(binaryData); | 406 workerClientWrapper->didReceiveBinaryData(binaryData); |
| 401 } | 407 } |
| 402 | 408 |
| 403 void WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData(PassOwnPtr<Vec tor<char> > binaryData) | 409 void WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData(PassOwnPtr<Vec tor<char> > binaryData) |
| 404 { | 410 { |
| 405 ASSERT(isMainThread()); | 411 ASSERT(isMainThread()); |
| 406 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveBinaryData, m_workerClientWrapper, binaryData)); | 412 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveBinaryData, m_workerClientWrapper.get(), binaryData)); |
| 407 } | 413 } |
| 408 | 414 |
| 409 static void workerGlobalScopeDidUpdateBufferedAmount(ExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigne d long bufferedAmount) | 415 static void workerGlobalScopeDidUpdateBufferedAmount(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrap per, unsigned long bufferedAmount) |
| 410 { | 416 { |
| 411 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 417 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 412 workerClientWrapper->didUpdateBufferedAmount(bufferedAmount); | 418 workerClientWrapper->didUpdateBufferedAmount(bufferedAmount); |
| 413 } | 419 } |
| 414 | 420 |
| 415 void WorkerThreadableWebSocketChannel::Peer::didUpdateBufferedAmount(unsigned lo ng bufferedAmount) | 421 void WorkerThreadableWebSocketChannel::Peer::didUpdateBufferedAmount(unsigned lo ng bufferedAmount) |
| 416 { | 422 { |
| 417 ASSERT(isMainThread()); | 423 ASSERT(isMainThread()); |
| 418 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidUpdateBufferedAmount, m_workerClientWrapper, bufferedAmount)); | 424 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidUpdateBufferedAmount, m_workerClientWrapper.get(), bufferedAmount)); |
| 419 } | 425 } |
| 420 | 426 |
| 421 static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper) | 427 static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWra pper) |
| 422 { | 428 { |
| 423 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 429 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 424 workerClientWrapper->didStartClosingHandshake(); | 430 workerClientWrapper->didStartClosingHandshake(); |
| 425 } | 431 } |
| 426 | 432 |
| 427 void WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake() | 433 void WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake() |
| 428 { | 434 { |
| 429 ASSERT(isMainThread()); | 435 ASSERT(isMainThread()); |
| 430 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidStartClosingHandshake, m_workerClientWrapper)); | 436 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidStartClosingHandshake, m_workerClientWrapper.get())); |
| 431 } | 437 } |
| 432 | 438 |
| 433 static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtr<Thre adableWebSocketChannelClientWrapper> workerClientWrapper, unsigned long unhandle dBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionStatus closin gHandshakeCompletion, unsigned short code, const String& reason) | 439 static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtrWillB eRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigned l ong unhandledBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionS tatus closingHandshakeCompletion, unsigned short code, const String& reason) |
| 434 { | 440 { |
| 435 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 441 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 436 workerClientWrapper->didClose(unhandledBufferedAmount, closingHandshakeCompl etion, code, reason); | 442 workerClientWrapper->didClose(unhandledBufferedAmount, closingHandshakeCompl etion, code, reason); |
| 437 } | 443 } |
| 438 | 444 |
| 439 void WorkerThreadableWebSocketChannel::Peer::didClose(unsigned long unhandledBuf feredAmount, ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsign ed short code, const String& reason) | 445 void WorkerThreadableWebSocketChannel::Peer::didClose(unsigned long unhandledBuf feredAmount, ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsign ed short code, const String& reason) |
| 440 { | 446 { |
| 441 ASSERT(isMainThread()); | 447 ASSERT(isMainThread()); |
| 442 m_mainWebSocketChannel = nullptr; | 448 m_mainWebSocketChannel = nullptr; |
| 443 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidClose, m_workerClientWrapper, unhandledBufferedAmount, closingHandshakeCom pletion, code, reason)); | 449 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidClose, m_workerClientWrapper.get(), unhandledBufferedAmount, closingHandsh akeCompletion, code, reason)); |
| 444 } | 450 } |
| 445 | 451 |
| 446 static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P assRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper) | 452 static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P assRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapp er) |
| 447 { | 453 { |
| 448 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 454 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 449 workerClientWrapper->didReceiveMessageError(); | 455 workerClientWrapper->didReceiveMessageError(); |
| 450 } | 456 } |
| 451 | 457 |
| 452 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError() | 458 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError() |
| 453 { | 459 { |
| 454 ASSERT(isMainThread()); | 460 ASSERT(isMainThread()); |
| 455 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveMessageError, m_workerClientWrapper)); | 461 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveMessageError, m_workerClientWrapper.get())); |
| 456 } | 462 } |
| 457 | 463 |
| 458 WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtr<ThreadableWebSocketC hannelClientWrapper> workerClientWrapper, WorkerGlobalScope& workerGlobalScope) | 464 WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtrWillBeRawPtr<Threadab leWebSocketChannelClientWrapper> workerClientWrapper, WorkerGlobalScope& workerG lobalScope) |
| 459 : m_workerClientWrapper(workerClientWrapper) | 465 : m_workerClientWrapper(workerClientWrapper) |
| 460 , m_workerGlobalScope(workerGlobalScope) | 466 , m_workerGlobalScope(workerGlobalScope) |
| 461 , m_loaderProxy(m_workerGlobalScope->thread()->workerLoaderProxy()) | 467 , m_loaderProxy(m_workerGlobalScope->thread()->workerLoaderProxy()) |
| 462 , m_syncHelper(0) | 468 , m_syncHelper(0) |
| 463 { | 469 { |
| 464 ASSERT(m_workerClientWrapper.get()); | 470 ASSERT(m_workerClientWrapper.get()); |
| 465 } | 471 } |
| 466 | 472 |
| 467 WorkerThreadableWebSocketChannel::Bridge::~Bridge() | 473 WorkerThreadableWebSocketChannel::Bridge::~Bridge() |
| 468 { | 474 { |
| 469 disconnect(); | 475 disconnect(); |
| 470 } | 476 } |
| 471 | 477 |
| 472 void WorkerThreadableWebSocketChannel::Bridge::initialize(const String& sourceUR L, unsigned lineNumber) | 478 void WorkerThreadableWebSocketChannel::Bridge::initialize(const String& sourceUR L, unsigned lineNumber) |
| 473 { | 479 { |
| 474 RefPtr<WeakReference<Peer> > reference = WeakReference<Peer>::createUnbound( ); | 480 RefPtr<WeakReference<Peer> > reference = WeakReference<Peer>::createUnbound( ); |
| 475 m_peer = WeakPtr<Peer>(reference); | 481 m_peer = WeakPtr<Peer>(reference); |
| 476 | 482 |
| 477 OwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper = ThreadableWebSocke tChannelSyncHelper::create(adoptPtr(blink::Platform::current()->createWaitableEv ent())); | 483 OwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper = ThreadableWebSocke tChannelSyncHelper::create(adoptPtr(blink::Platform::current()->createWaitableEv ent())); |
| 478 // This pointer is guaranteed to be valid until we call terminatePeer. | 484 // This pointer is guaranteed to be valid until we call terminatePeer. |
| 479 m_syncHelper = syncHelper.get(); | 485 m_syncHelper = syncHelper.get(); |
| 480 | 486 |
| 481 RefPtr<Bridge> protect(this); | 487 RefPtr<Bridge> protect(this); |
| 482 if (!waitForMethodCompletion(createCallbackTask(&Peer::initialize, reference .release(), AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper, sourc eURL, lineNumber, syncHelper.release()))) { | 488 if (!waitForMethodCompletion(createCallbackTask(&Peer::initialize, reference .release(), AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper.get(), sourceURL, lineNumber, syncHelper.release()))) { |
| 483 // The worker thread has been signalled to shutdown before method comple tion. | 489 // The worker thread has been signalled to shutdown before method comple tion. |
| 484 terminatePeer(); | 490 terminatePeer(); |
| 485 } | 491 } |
| 486 } | 492 } |
| 487 | 493 |
| 488 bool WorkerThreadableWebSocketChannel::Bridge::connect(const KURL& url, const St ring& protocol) | 494 bool WorkerThreadableWebSocketChannel::Bridge::connect(const KURL& url, const St ring& protocol) |
| 489 { | 495 { |
| 490 if (hasTerminatedPeer()) | 496 if (hasTerminatedPeer()) |
| 491 return false; | 497 return false; |
| 492 | 498 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 596 // Caller of this function should hold a reference to the bridge, because this f unction may call WebSocket::didClose() in the end, | 602 // Caller of this function should hold a reference to the bridge, because this f unction may call WebSocket::didClose() in the end, |
| 597 // which causes the bridge to get disconnected from the WebSocket and deleted if there is no other reference. | 603 // which causes the bridge to get disconnected from the WebSocket and deleted if there is no other reference. |
| 598 bool WorkerThreadableWebSocketChannel::Bridge::waitForMethodCompletion(PassOwnPt r<ExecutionContextTask> task) | 604 bool WorkerThreadableWebSocketChannel::Bridge::waitForMethodCompletion(PassOwnPt r<ExecutionContextTask> task) |
| 599 { | 605 { |
| 600 ASSERT(m_workerGlobalScope); | 606 ASSERT(m_workerGlobalScope); |
| 601 ASSERT(m_syncHelper); | 607 ASSERT(m_syncHelper); |
| 602 | 608 |
| 603 m_loaderProxy.postTaskToLoader(task); | 609 m_loaderProxy.postTaskToLoader(task); |
| 604 | 610 |
| 605 blink::WebWaitableEvent* shutdownEvent = m_workerGlobalScope->thread()->shut downEvent(); | 611 blink::WebWaitableEvent* shutdownEvent = m_workerGlobalScope->thread()->shut downEvent(); |
| 612 { | |
| 613 Vector<blink::WebWaitableEvent*> events; | |
| 614 events.append(shutdownEvent); | |
| 615 events.append(m_syncHelper->event()); | |
| 616 ThreadState::SafePointScope scope(ThreadState::HeapPointersOnStack); | |
| 617 blink::WebWaitableEvent* signalled = blink::Platform::current()->waitMul tipleEvents(events); | |
| 618 if (signalled != shutdownEvent) | |
| 619 return true; | |
| 620 } | |
| 621 | |
| 606 Vector<blink::WebWaitableEvent*> events; | 622 Vector<blink::WebWaitableEvent*> events; |
| 607 events.append(shutdownEvent); | |
| 608 events.append(m_syncHelper->event()); | 623 events.append(m_syncHelper->event()); |
| 609 | |
| 610 ThreadState::SafePointScope scope(ThreadState::HeapPointersOnStack); | 624 ThreadState::SafePointScope scope(ThreadState::HeapPointersOnStack); |
| 611 blink::WebWaitableEvent* signalled = blink::Platform::current()->waitMultipl eEvents(events); | 625 blink::Platform::current()->waitMultipleEvents(events); |
| 612 return signalled != shutdownEvent; | 626 return false; |
|
haraken
2014/06/09 02:11:20
yhirano@: This should be false, because this branc
yhirano
2014/06/09 02:47:38
What you are doing here is waiting for the syncHel
haraken
2014/06/09 03:28:51
Done.
tyoshino (SeeGerritForStatus)
2014/06/09 04:33:39
Can we ASSERT here that the event signaled is not
yhirano
2014/06/09 04:39:11
Thanks. I have a question. If we don't ignore the
| |
| 613 } | 627 } |
| 614 | 628 |
| 615 void WorkerThreadableWebSocketChannel::Bridge::terminatePeer() | 629 void WorkerThreadableWebSocketChannel::Bridge::terminatePeer() |
| 616 { | 630 { |
| 617 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy, m_peer))); | 631 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy, m_peer))); |
| 618 // Peer::destroy() deletes m_peer and then m_syncHelper will be released. | 632 // Peer::destroy() deletes m_peer and then m_syncHelper will be released. |
| 619 // We must not touch m_syncHelper any more. | 633 // We must not touch m_syncHelper any more. |
| 620 m_syncHelper = 0; | 634 m_syncHelper = 0; |
| 621 | 635 |
| 622 // We won't use this any more. | 636 // We won't use this any more. |
| 623 m_workerGlobalScope = nullptr; | 637 m_workerGlobalScope = nullptr; |
| 624 } | 638 } |
| 625 | 639 |
| 626 } // namespace WebCore | 640 } // namespace WebCore |
| OLD | NEW |