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

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 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 } 374 }
369 375
370 void WorkerThreadableWebSocketChannel::Peer::resume() 376 void WorkerThreadableWebSocketChannel::Peer::resume()
371 { 377 {
372 ASSERT(isMainThread()); 378 ASSERT(isMainThread());
373 if (!m_mainWebSocketChannel) 379 if (!m_mainWebSocketChannel)
374 return; 380 return;
375 m_mainWebSocketChannel->resume(); 381 m_mainWebSocketChannel->resume();
376 } 382 }
377 383
378 static void workerGlobalScopeDidConnect(ExecutionContext* context, PassRefPtr<Th readableWebSocketChannelClientWrapper> workerClientWrapper, const String& subpro tocol, const String& extensions) 384 static void workerGlobalScopeDidConnect(ExecutionContext* context, PassRefPtrWil lBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, const St ring& subprotocol, const String& extensions)
379 { 385 {
380 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 386 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
381 workerClientWrapper->setSubprotocol(subprotocol); 387 workerClientWrapper->setSubprotocol(subprotocol);
382 workerClientWrapper->setExtensions(extensions); 388 workerClientWrapper->setExtensions(extensions);
383 workerClientWrapper->didConnect(); 389 workerClientWrapper->didConnect();
384 } 390 }
385 391
386 void WorkerThreadableWebSocketChannel::Peer::didConnect() 392 void WorkerThreadableWebSocketChannel::Peer::didConnect()
387 { 393 {
388 ASSERT(isMainThread()); 394 ASSERT(isMainThread());
389 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidConnect, m_workerClientWrapper, m_mainWebSocketChannel->subprotocol(), m_m ainWebSocketChannel->extensions())); 395 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidConnect, m_workerClientWrapper.get(), m_mainWebSocketChannel->subprotocol( ), m_mainWebSocketChannel->extensions()));
390 } 396 }
391 397
392 static void workerGlobalScopeDidReceiveMessage(ExecutionContext* context, PassRe fPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, const String& message) 398 static void workerGlobalScopeDidReceiveMessage(ExecutionContext* context, PassRe fPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, c onst String& message)
393 { 399 {
394 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 400 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
395 workerClientWrapper->didReceiveMessage(message); 401 workerClientWrapper->didReceiveMessage(message);
396 } 402 }
397 403
398 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessage(const String& mes sage) 404 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessage(const String& mes sage)
399 { 405 {
400 ASSERT(isMainThread()); 406 ASSERT(isMainThread());
401 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveMessage, m_workerClientWrapper, message)); 407 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveMessage, m_workerClientWrapper.get(), message));
402 } 408 }
403 409
404 static void workerGlobalScopeDidReceiveBinaryData(ExecutionContext* context, Pas sRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, PassOwnPtr <Vector<char> > binaryData) 410 static void workerGlobalScopeDidReceiveBinaryData(ExecutionContext* context, Pas sRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper , PassOwnPtr<Vector<char> > binaryData)
405 { 411 {
406 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 412 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
407 workerClientWrapper->didReceiveBinaryData(binaryData); 413 workerClientWrapper->didReceiveBinaryData(binaryData);
408 } 414 }
409 415
410 void WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData(PassOwnPtr<Vec tor<char> > binaryData) 416 void WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData(PassOwnPtr<Vec tor<char> > binaryData)
411 { 417 {
412 ASSERT(isMainThread()); 418 ASSERT(isMainThread());
413 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveBinaryData, m_workerClientWrapper, binaryData)); 419 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveBinaryData, m_workerClientWrapper.get(), binaryData));
414 } 420 }
415 421
416 static void workerGlobalScopeDidUpdateBufferedAmount(ExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigne d long bufferedAmount) 422 static void workerGlobalScopeDidUpdateBufferedAmount(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrap per, unsigned long bufferedAmount)
417 { 423 {
418 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 424 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
419 workerClientWrapper->didUpdateBufferedAmount(bufferedAmount); 425 workerClientWrapper->didUpdateBufferedAmount(bufferedAmount);
420 } 426 }
421 427
422 void WorkerThreadableWebSocketChannel::Peer::didUpdateBufferedAmount(unsigned lo ng bufferedAmount) 428 void WorkerThreadableWebSocketChannel::Peer::didUpdateBufferedAmount(unsigned lo ng bufferedAmount)
423 { 429 {
424 ASSERT(isMainThread()); 430 ASSERT(isMainThread());
425 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidUpdateBufferedAmount, m_workerClientWrapper, bufferedAmount)); 431 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidUpdateBufferedAmount, m_workerClientWrapper.get(), bufferedAmount));
426 } 432 }
427 433
428 static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper) 434 static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWra pper)
429 { 435 {
430 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 436 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
431 workerClientWrapper->didStartClosingHandshake(); 437 workerClientWrapper->didStartClosingHandshake();
432 } 438 }
433 439
434 void WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake() 440 void WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake()
435 { 441 {
436 ASSERT(isMainThread()); 442 ASSERT(isMainThread());
437 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidStartClosingHandshake, m_workerClientWrapper)); 443 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidStartClosingHandshake, m_workerClientWrapper.get()));
438 } 444 }
439 445
440 static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtr<Thre adableWebSocketChannelClientWrapper> workerClientWrapper, unsigned long unhandle dBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionStatus closin gHandshakeCompletion, unsigned short code, const String& reason) 446 static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtrWillB eRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigned l ong unhandledBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionS tatus closingHandshakeCompletion, unsigned short code, const String& reason)
441 { 447 {
442 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 448 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
443 workerClientWrapper->didClose(unhandledBufferedAmount, closingHandshakeCompl etion, code, reason); 449 workerClientWrapper->didClose(unhandledBufferedAmount, closingHandshakeCompl etion, code, reason);
444 } 450 }
445 451
446 void WorkerThreadableWebSocketChannel::Peer::didClose(unsigned long unhandledBuf feredAmount, ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsign ed short code, const String& reason) 452 void WorkerThreadableWebSocketChannel::Peer::didClose(unsigned long unhandledBuf feredAmount, ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsign ed short code, const String& reason)
447 { 453 {
448 ASSERT(isMainThread()); 454 ASSERT(isMainThread());
449 m_mainWebSocketChannel = nullptr; 455 m_mainWebSocketChannel = nullptr;
450 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidClose, m_workerClientWrapper, unhandledBufferedAmount, closingHandshakeCom pletion, code, reason)); 456 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidClose, m_workerClientWrapper.get(), unhandledBufferedAmount, closingHandsh akeCompletion, code, reason));
451 } 457 }
452 458
453 static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P assRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper) 459 static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P assRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapp er)
454 { 460 {
455 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 461 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
456 workerClientWrapper->didReceiveMessageError(); 462 workerClientWrapper->didReceiveMessageError();
457 } 463 }
458 464
459 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError() 465 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError()
460 { 466 {
461 ASSERT(isMainThread()); 467 ASSERT(isMainThread());
462 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveMessageError, m_workerClientWrapper)); 468 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveMessageError, m_workerClientWrapper.get()));
463 } 469 }
464 470
465 WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtr<ThreadableWebSocketC hannelClientWrapper> workerClientWrapper, WorkerGlobalScope& workerGlobalScope) 471 WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtrWillBeRawPtr<Threadab leWebSocketChannelClientWrapper> workerClientWrapper, WorkerGlobalScope& workerG lobalScope)
466 : m_workerClientWrapper(workerClientWrapper) 472 : m_workerClientWrapper(workerClientWrapper)
467 , m_workerGlobalScope(workerGlobalScope) 473 , m_workerGlobalScope(workerGlobalScope)
468 , m_loaderProxy(m_workerGlobalScope->thread()->workerLoaderProxy()) 474 , m_loaderProxy(m_workerGlobalScope->thread()->workerLoaderProxy())
469 , m_syncHelper(0) 475 , m_syncHelper(0)
470 { 476 {
471 ASSERT(m_workerClientWrapper.get()); 477 ASSERT(m_workerClientWrapper.get());
472 } 478 }
473 479
474 WorkerThreadableWebSocketChannel::Bridge::~Bridge() 480 WorkerThreadableWebSocketChannel::Bridge::~Bridge()
475 { 481 {
476 disconnect(); 482 disconnect();
477 } 483 }
478 484
479 void WorkerThreadableWebSocketChannel::Bridge::initialize(const String& sourceUR L, unsigned lineNumber) 485 void WorkerThreadableWebSocketChannel::Bridge::initialize(const String& sourceUR L, unsigned lineNumber)
480 { 486 {
481 RefPtr<WeakReference<Peer> > reference = WeakReference<Peer>::createUnbound( ); 487 RefPtr<WeakReference<Peer> > reference = WeakReference<Peer>::createUnbound( );
482 m_peer = WeakPtr<Peer>(reference); 488 m_peer = WeakPtr<Peer>(reference);
483 489
484 OwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper = ThreadableWebSocke tChannelSyncHelper::create(adoptPtr(blink::Platform::current()->createWaitableEv ent())); 490 OwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper = ThreadableWebSocke tChannelSyncHelper::create(adoptPtr(blink::Platform::current()->createWaitableEv ent()));
485 // This pointer is guaranteed to be valid until we call terminatePeer. 491 // This pointer is guaranteed to be valid until we call terminatePeer.
486 m_syncHelper = syncHelper.get(); 492 m_syncHelper = syncHelper.get();
487 493
488 RefPtr<Bridge> protect(this); 494 RefPtr<Bridge> protect(this);
489 if (!waitForMethodCompletion(createCallbackTask(&Peer::initialize, reference .release(), AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper, sourc eURL, lineNumber, syncHelper.release()))) { 495 if (!waitForMethodCompletion(createCallbackTask(&Peer::initialize, reference .release(), AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper.get(), sourceURL, lineNumber, syncHelper.release()))) {
490 // The worker thread has been signalled to shutdown before method comple tion. 496 // The worker thread has been signalled to shutdown before method comple tion.
491 terminatePeer(); 497 terminatePeer();
492 } 498 }
493 } 499 }
494 500
495 bool WorkerThreadableWebSocketChannel::Bridge::connect(const KURL& url, const St ring& protocol) 501 bool WorkerThreadableWebSocketChannel::Bridge::connect(const KURL& url, const St ring& protocol)
496 { 502 {
497 if (hasTerminatedPeer()) 503 if (hasTerminatedPeer())
498 return false; 504 return false;
499 505
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
624 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy, m_peer))); 630 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy, m_peer)));
625 // Peer::destroy() deletes m_peer and then m_syncHelper will be released. 631 // Peer::destroy() deletes m_peer and then m_syncHelper will be released.
626 // We must not touch m_syncHelper any more. 632 // We must not touch m_syncHelper any more.
627 m_syncHelper = 0; 633 m_syncHelper = 0;
628 634
629 // We won't use this any more. 635 // We won't use this any more.
630 m_workerGlobalScope = nullptr; 636 m_workerGlobalScope = nullptr;
631 } 637 }
632 638
633 } // namespace WebCore 639 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698