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

Side by Side Diff: Source/modules/websockets/WorkerThreadableWebSocketChannel.cpp

Issue 267323004: Oilpan: Move ThreadableWebSocketChannelClientWrapper to Oilpan's heap (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 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) 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
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
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()))) {
haraken 2014/06/02 01:39:44 This line is the culprit of the crash. A problem h
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 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy, m_peer))); 623 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy, m_peer)));
618 // Peer::destroy() deletes m_peer and then m_syncHelper will be released. 624 // Peer::destroy() deletes m_peer and then m_syncHelper will be released.
619 // We must not touch m_syncHelper any more. 625 // We must not touch m_syncHelper any more.
620 m_syncHelper = 0; 626 m_syncHelper = 0;
621 627
622 // We won't use this any more. 628 // We won't use this any more.
623 m_workerGlobalScope = nullptr; 629 m_workerGlobalScope = nullptr;
624 } 630 }
625 631
626 } // namespace WebCore 632 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/modules/websockets/WorkerThreadableWebSocketChannel.h ('k') | Source/platform/CrossThreadCopier.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698