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

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, 6 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 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) 232 : m_workerClientWrapper(clientWrapper)
233 , m_loaderProxy(loaderProxy) 233 , m_loaderProxy(loaderProxy)
234 , m_mainWebSocketChannel(nullptr) 234 , m_mainWebSocketChannel(nullptr)
235 , m_syncHelper(syncHelper) 235 , m_syncHelper(syncHelper)
236 , m_weakFactory(reference, this) 236 , m_weakFactory(reference, this)
237 { 237 {
238 ASSERT(isMainThread()); 238 ASSERT(isMainThread());
239 ASSERT(m_workerClientWrapper.get()); 239 ASSERT(m_workerClientWrapper.get());
240 240
241 Document* document = toDocument(context); 241 Document* document = toDocument(context);
242 if (RuntimeEnabledFeatures::experimentalWebSocketEnabled()) { 242 if (RuntimeEnabledFeatures::experimentalWebSocketEnabled()) {
243 m_mainWebSocketChannel = NewWebSocketChannelImpl::create(document, this, sourceURL, lineNumber); 243 m_mainWebSocketChannel = NewWebSocketChannelImpl::create(document, this, sourceURL, lineNumber);
244 } else { 244 } else {
245 m_mainWebSocketChannel = MainThreadWebSocketChannel::create(document, th is, sourceURL, lineNumber); 245 m_mainWebSocketChannel = MainThreadWebSocketChannel::create(document, th is, sourceURL, lineNumber);
246 } 246 }
247 247
248 m_syncHelper->signalWorkerThread(); 248 m_syncHelper->signalWorkerThread();
249 } 249 }
250 250
251 WorkerThreadableWebSocketChannel::Peer::~Peer() 251 WorkerThreadableWebSocketChannel::Peer::~Peer()
252 { 252 {
253 ASSERT(isMainThread()); 253 ASSERT(isMainThread());
254 if (m_mainWebSocketChannel) 254 if (m_mainWebSocketChannel)
255 m_mainWebSocketChannel->disconnect(); 255 m_mainWebSocketChannel->disconnect();
256 } 256 }
257 257
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) 258 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 { 259 {
260 // The caller must call destroy() to free the peer. 260 // The caller must call destroy() to free the peer.
261 new Peer(reference, clientWrapper, *loaderProxy, context, sourceURLAtConnect ion, lineNumberAtConnection, syncHelper); 261 new Peer(reference, clientWrapper, *loaderProxy, context, sourceURLAtConnect ion, lineNumberAtConnection, syncHelper);
262 } 262 }
263 263
264 void WorkerThreadableWebSocketChannel::Peer::destroy() 264 void WorkerThreadableWebSocketChannel::Peer::destroy()
265 { 265 {
266 ASSERT(isMainThread()); 266 ASSERT(isMainThread());
267 delete this; 267 delete this;
268 } 268 }
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 } 361 }
362 362
363 void WorkerThreadableWebSocketChannel::Peer::resume() 363 void WorkerThreadableWebSocketChannel::Peer::resume()
364 { 364 {
365 ASSERT(isMainThread()); 365 ASSERT(isMainThread());
366 if (!m_mainWebSocketChannel) 366 if (!m_mainWebSocketChannel)
367 return; 367 return;
368 m_mainWebSocketChannel->resume(); 368 m_mainWebSocketChannel->resume();
369 } 369 }
370 370
371 static void workerGlobalScopeDidConnect(ExecutionContext* context, PassRefPtr<Th readableWebSocketChannelClientWrapper> workerClientWrapper, const String& subpro tocol, const String& extensions) 371 static void workerGlobalScopeDidConnect(ExecutionContext* context, PassRefPtrWil lBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, const St ring& subprotocol, const String& extensions)
372 { 372 {
373 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 373 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
374 workerClientWrapper->setSubprotocol(subprotocol); 374 workerClientWrapper->setSubprotocol(subprotocol);
375 workerClientWrapper->setExtensions(extensions); 375 workerClientWrapper->setExtensions(extensions);
376 workerClientWrapper->didConnect(); 376 workerClientWrapper->didConnect();
377 } 377 }
378 378
379 void WorkerThreadableWebSocketChannel::Peer::didConnect() 379 void WorkerThreadableWebSocketChannel::Peer::didConnect()
380 { 380 {
381 ASSERT(isMainThread()); 381 ASSERT(isMainThread());
382 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidConnect, m_workerClientWrapper, m_mainWebSocketChannel->subprotocol(), m_m ainWebSocketChannel->extensions())); 382 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidConnect, m_workerClientWrapper.get(), m_mainWebSocketChannel->subprotocol( ), m_mainWebSocketChannel->extensions()));
383 } 383 }
384 384
385 static void workerGlobalScopeDidReceiveMessage(ExecutionContext* context, PassRe fPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, const String& message) 385 static void workerGlobalScopeDidReceiveMessage(ExecutionContext* context, PassRe fPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, c onst String& message)
386 { 386 {
387 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 387 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
388 workerClientWrapper->didReceiveMessage(message); 388 workerClientWrapper->didReceiveMessage(message);
389 } 389 }
390 390
391 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessage(const String& mes sage) 391 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessage(const String& mes sage)
392 { 392 {
393 ASSERT(isMainThread()); 393 ASSERT(isMainThread());
394 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveMessage, m_workerClientWrapper, message)); 394 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveMessage, m_workerClientWrapper.get(), message));
395 } 395 }
396 396
397 static void workerGlobalScopeDidReceiveBinaryData(ExecutionContext* context, Pas sRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, PassOwnPtr <Vector<char> > binaryData) 397 static void workerGlobalScopeDidReceiveBinaryData(ExecutionContext* context, Pas sRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper , PassOwnPtr<Vector<char> > binaryData)
398 { 398 {
399 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 399 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
400 workerClientWrapper->didReceiveBinaryData(binaryData); 400 workerClientWrapper->didReceiveBinaryData(binaryData);
401 } 401 }
402 402
403 void WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData(PassOwnPtr<Vec tor<char> > binaryData) 403 void WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData(PassOwnPtr<Vec tor<char> > binaryData)
404 { 404 {
405 ASSERT(isMainThread()); 405 ASSERT(isMainThread());
406 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveBinaryData, m_workerClientWrapper, binaryData)); 406 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveBinaryData, m_workerClientWrapper.get(), binaryData));
407 } 407 }
408 408
409 static void workerGlobalScopeDidUpdateBufferedAmount(ExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigne d long bufferedAmount) 409 static void workerGlobalScopeDidUpdateBufferedAmount(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrap per, unsigned long bufferedAmount)
410 { 410 {
411 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 411 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
412 workerClientWrapper->didUpdateBufferedAmount(bufferedAmount); 412 workerClientWrapper->didUpdateBufferedAmount(bufferedAmount);
413 } 413 }
414 414
415 void WorkerThreadableWebSocketChannel::Peer::didUpdateBufferedAmount(unsigned lo ng bufferedAmount) 415 void WorkerThreadableWebSocketChannel::Peer::didUpdateBufferedAmount(unsigned lo ng bufferedAmount)
416 { 416 {
417 ASSERT(isMainThread()); 417 ASSERT(isMainThread());
418 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidUpdateBufferedAmount, m_workerClientWrapper, bufferedAmount)); 418 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidUpdateBufferedAmount, m_workerClientWrapper.get(), bufferedAmount));
419 } 419 }
420 420
421 static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper) 421 static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWra pper)
422 { 422 {
423 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 423 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
424 workerClientWrapper->didStartClosingHandshake(); 424 workerClientWrapper->didStartClosingHandshake();
425 } 425 }
426 426
427 void WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake() 427 void WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake()
428 { 428 {
429 ASSERT(isMainThread()); 429 ASSERT(isMainThread());
430 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidStartClosingHandshake, m_workerClientWrapper)); 430 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidStartClosingHandshake, m_workerClientWrapper.get()));
431 } 431 }
432 432
433 static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtr<Thre adableWebSocketChannelClientWrapper> workerClientWrapper, unsigned long unhandle dBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionStatus closin gHandshakeCompletion, unsigned short code, const String& reason) 433 static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtrWillB eRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigned l ong unhandledBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionS tatus closingHandshakeCompletion, unsigned short code, const String& reason)
434 { 434 {
435 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 435 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
436 workerClientWrapper->didClose(unhandledBufferedAmount, closingHandshakeCompl etion, code, reason); 436 workerClientWrapper->didClose(unhandledBufferedAmount, closingHandshakeCompl etion, code, reason);
437 } 437 }
438 438
439 void WorkerThreadableWebSocketChannel::Peer::didClose(unsigned long unhandledBuf feredAmount, ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsign ed short code, const String& reason) 439 void WorkerThreadableWebSocketChannel::Peer::didClose(unsigned long unhandledBuf feredAmount, ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsign ed short code, const String& reason)
440 { 440 {
441 ASSERT(isMainThread()); 441 ASSERT(isMainThread());
442 m_mainWebSocketChannel = nullptr; 442 m_mainWebSocketChannel = nullptr;
443 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidClose, m_workerClientWrapper, unhandledBufferedAmount, closingHandshakeCom pletion, code, reason)); 443 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidClose, m_workerClientWrapper.get(), unhandledBufferedAmount, closingHandsh akeCompletion, code, reason));
444 } 444 }
445 445
446 static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P assRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper) 446 static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P assRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapp er)
447 { 447 {
448 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); 448 ASSERT_UNUSED(context, context->isWorkerGlobalScope());
449 workerClientWrapper->didReceiveMessageError(); 449 workerClientWrapper->didReceiveMessageError();
450 } 450 }
451 451
452 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError() 452 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError()
453 { 453 {
454 ASSERT(isMainThread()); 454 ASSERT(isMainThread());
455 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveMessageError, m_workerClientWrapper)); 455 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveMessageError, m_workerClientWrapper.get()));
456 } 456 }
457 457
458 WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtr<ThreadableWebSocketC hannelClientWrapper> workerClientWrapper, WorkerGlobalScope& workerGlobalScope) 458 WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtrWillBeRawPtr<Threadab leWebSocketChannelClientWrapper> workerClientWrapper, WorkerGlobalScope& workerG lobalScope)
459 : m_workerClientWrapper(workerClientWrapper) 459 : m_workerClientWrapper(workerClientWrapper)
460 , m_workerGlobalScope(workerGlobalScope) 460 , m_workerGlobalScope(workerGlobalScope)
461 , m_loaderProxy(m_workerGlobalScope->thread()->workerLoaderProxy()) 461 , m_loaderProxy(m_workerGlobalScope->thread()->workerLoaderProxy())
462 , m_syncHelper(0) 462 , m_syncHelper(0)
463 { 463 {
464 ASSERT(m_workerClientWrapper.get()); 464 ASSERT(m_workerClientWrapper.get());
465 } 465 }
466 466
467 WorkerThreadableWebSocketChannel::Bridge::~Bridge() 467 WorkerThreadableWebSocketChannel::Bridge::~Bridge()
468 { 468 {
469 disconnect(); 469 disconnect();
470 } 470 }
471 471
472 void WorkerThreadableWebSocketChannel::Bridge::initialize(const String& sourceUR L, unsigned lineNumber) 472 void WorkerThreadableWebSocketChannel::Bridge::initialize(const String& sourceUR L, unsigned lineNumber)
473 { 473 {
474 RefPtr<WeakReference<Peer> > reference = WeakReference<Peer>::createUnbound( ); 474 RefPtr<WeakReference<Peer> > reference = WeakReference<Peer>::createUnbound( );
475 m_peer = WeakPtr<Peer>(reference); 475 m_peer = WeakPtr<Peer>(reference);
476 476
477 OwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper = ThreadableWebSocke tChannelSyncHelper::create(adoptPtr(blink::Platform::current()->createWaitableEv ent())); 477 OwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper = ThreadableWebSocke tChannelSyncHelper::create(adoptPtr(blink::Platform::current()->createWaitableEv ent()));
478 // This pointer is guaranteed to be valid until we call terminatePeer. 478 // This pointer is guaranteed to be valid until we call terminatePeer.
479 m_syncHelper = syncHelper.get(); 479 m_syncHelper = syncHelper.get();
480 480
481 RefPtr<Bridge> protect(this); 481 RefPtr<Bridge> protect(this);
482 if (!waitForMethodCompletion(createCallbackTask(&Peer::initialize, reference .release(), AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper, sourc eURL, lineNumber, syncHelper.release()))) { 482 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. 483 // The worker thread has been signalled to shutdown before method comple tion.
484 terminatePeer(); 484 terminatePeer();
485 } 485 }
486 } 486 }
487 487
488 bool WorkerThreadableWebSocketChannel::Bridge::connect(const KURL& url, const St ring& protocol) 488 bool WorkerThreadableWebSocketChannel::Bridge::connect(const KURL& url, const St ring& protocol)
489 { 489 {
490 if (hasTerminatedPeer()) 490 if (hasTerminatedPeer())
491 return false; 491 return false;
492 492
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy, m_peer))); 617 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy, m_peer)));
618 // Peer::destroy() deletes m_peer and then m_syncHelper will be released. 618 // Peer::destroy() deletes m_peer and then m_syncHelper will be released.
619 // We must not touch m_syncHelper any more. 619 // We must not touch m_syncHelper any more.
620 m_syncHelper = 0; 620 m_syncHelper = 0;
621 621
622 // We won't use this any more. 622 // We won't use this any more.
623 m_workerGlobalScope = nullptr; 623 m_workerGlobalScope = nullptr;
624 } 624 }
625 625
626 } // namespace WebCore 626 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698