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

Side by Side Diff: ipc/ipc_channel_proxy.cc

Issue 2316963005: Reworks Channel pausing behavior (Closed)
Patch Set: Created 4 years, 3 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
« no previous file with comments | « ipc/ipc_channel_proxy.h ('k') | ipc/ipc_mojo_bootstrap.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ipc/ipc_channel_proxy.h" 5 #include "ipc/ipc_channel_proxy.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <utility> 10 #include <utility>
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 #ifdef IPC_MESSAGE_LOG_ENABLED 108 #ifdef IPC_MESSAGE_LOG_ENABLED
109 if (logger->Enabled()) 109 if (logger->Enabled())
110 logger->OnPostDispatchMessage(message, channel_id_); 110 logger->OnPostDispatchMessage(message, channel_id_);
111 #endif 111 #endif
112 return true; 112 return true;
113 } 113 }
114 return false; 114 return false;
115 } 115 }
116 116
117 // Called on the IPC::Channel thread 117 // Called on the IPC::Channel thread
118 void ChannelProxy::Context::PauseChannel() {
119 DCHECK(channel_);
120 channel_->Pause();
121 }
122
123 // Called on the IPC::Channel thread
118 void ChannelProxy::Context::UnpauseChannel(bool flush) { 124 void ChannelProxy::Context::UnpauseChannel(bool flush) {
119 DCHECK(channel_); 125 DCHECK(channel_);
120 channel_->Unpause(flush); 126 channel_->Unpause(flush);
121 } 127 }
122 128
123 // Called on the IPC::Channel thread 129 // Called on the IPC::Channel thread
124 void ChannelProxy::Context::FlushChannel() { 130 void ChannelProxy::Context::FlushChannel() {
125 DCHECK(channel_); 131 DCHECK(channel_);
126 channel_->Flush(); 132 channel_->Flush();
127 } 133 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 void ChannelProxy::Context::OnChannelError() { 170 void ChannelProxy::Context::OnChannelError() {
165 for (size_t i = 0; i < filters_.size(); ++i) 171 for (size_t i = 0; i < filters_.size(); ++i)
166 filters_[i]->OnChannelError(); 172 filters_[i]->OnChannelError();
167 173
168 // See above comment about using listener_task_runner_ here. 174 // See above comment about using listener_task_runner_ here.
169 listener_task_runner_->PostTask( 175 listener_task_runner_->PostTask(
170 FROM_HERE, base::Bind(&Context::OnDispatchError, this)); 176 FROM_HERE, base::Bind(&Context::OnDispatchError, this));
171 } 177 }
172 178
173 // Called on the IPC::Channel thread 179 // Called on the IPC::Channel thread
174 void ChannelProxy::Context::OnChannelOpened(bool pause) { 180 void ChannelProxy::Context::OnChannelOpened() {
175 DCHECK(channel_ != NULL); 181 DCHECK(channel_ != NULL);
176 182
177 // Assume a reference to ourselves on behalf of this thread. This reference 183 // Assume a reference to ourselves on behalf of this thread. This reference
178 // will be released when we are closed. 184 // will be released when we are closed.
179 AddRef(); 185 AddRef();
180 186
181 bool success = pause ? channel_->ConnectPaused() : channel_->Connect(); 187 if (!channel_->Connect()) {
182 if (!success) {
183 OnChannelError(); 188 OnChannelError();
184 return; 189 return;
185 } 190 }
186 191
187 for (size_t i = 0; i < filters_.size(); ++i) 192 for (size_t i = 0; i < filters_.size(); ++i)
188 filters_[i]->OnFilterAdded(channel_.get()); 193 filters_[i]->OnFilterAdded(channel_.get());
189 } 194 }
190 195
191 // Called on the IPC::Channel thread 196 // Called on the IPC::Channel thread
192 void ChannelProxy::Context::OnChannelClosed() { 197 void ChannelProxy::Context::OnChannelClosed() {
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 } 473 }
469 474
470 ChannelProxy::~ChannelProxy() { 475 ChannelProxy::~ChannelProxy() {
471 DCHECK(CalledOnValidThread()); 476 DCHECK(CalledOnValidThread());
472 477
473 Close(); 478 Close();
474 } 479 }
475 480
476 void ChannelProxy::Init(const IPC::ChannelHandle& channel_handle, 481 void ChannelProxy::Init(const IPC::ChannelHandle& channel_handle,
477 Channel::Mode mode, 482 Channel::Mode mode,
478 bool create_pipe_now, 483 bool create_pipe_now) {
479 bool create_paused) {
480 #if defined(OS_POSIX) 484 #if defined(OS_POSIX)
481 // When we are creating a server on POSIX, we need its file descriptor 485 // When we are creating a server on POSIX, we need its file descriptor
482 // to be created immediately so that it can be accessed and passed 486 // to be created immediately so that it can be accessed and passed
483 // to other processes. Forcing it to be created immediately avoids 487 // to other processes. Forcing it to be created immediately avoids
484 // race conditions that may otherwise arise. 488 // race conditions that may otherwise arise.
485 if (mode & Channel::MODE_SERVER_FLAG) { 489 if (mode & Channel::MODE_SERVER_FLAG) {
486 create_pipe_now = true; 490 create_pipe_now = true;
487 } 491 }
488 #endif // defined(OS_POSIX) 492 #endif // defined(OS_POSIX)
489 Init( 493 Init(
490 ChannelFactory::Create(channel_handle, mode, context_->ipc_task_runner()), 494 ChannelFactory::Create(channel_handle, mode, context_->ipc_task_runner()),
491 create_pipe_now, create_paused); 495 create_pipe_now);
492 } 496 }
493 497
494 void ChannelProxy::Init(std::unique_ptr<ChannelFactory> factory, 498 void ChannelProxy::Init(std::unique_ptr<ChannelFactory> factory,
495 bool create_pipe_now, 499 bool create_pipe_now) {
496 bool create_paused) {
497 DCHECK(CalledOnValidThread()); 500 DCHECK(CalledOnValidThread());
498 DCHECK(!did_init_); 501 DCHECK(!did_init_);
499 502
500 if (create_pipe_now) { 503 if (create_pipe_now) {
501 // Create the channel immediately. This effectively sets up the 504 // Create the channel immediately. This effectively sets up the
502 // low-level pipe so that the client can connect. Without creating 505 // low-level pipe so that the client can connect. Without creating
503 // the pipe immediately, it is possible for a listener to attempt 506 // the pipe immediately, it is possible for a listener to attempt
504 // to connect and get an error since the pipe doesn't exist yet. 507 // to connect and get an error since the pipe doesn't exist yet.
505 context_->CreateChannel(std::move(factory)); 508 context_->CreateChannel(std::move(factory));
506 } else { 509 } else {
507 context_->ipc_task_runner()->PostTask( 510 context_->ipc_task_runner()->PostTask(
508 FROM_HERE, base::Bind(&Context::CreateChannel, context_, 511 FROM_HERE, base::Bind(&Context::CreateChannel, context_,
509 base::Passed(&factory))); 512 base::Passed(&factory)));
510 } 513 }
511 514
512 // complete initialization on the background thread 515 // complete initialization on the background thread
513 context_->ipc_task_runner()->PostTask( 516 context_->ipc_task_runner()->PostTask(
514 FROM_HERE, 517 FROM_HERE,
515 base::Bind(&Context::OnChannelOpened, context_, create_paused)); 518 base::Bind(&Context::OnChannelOpened, context_));
516 519
517 did_init_ = true; 520 did_init_ = true;
518 OnChannelInit(); 521 OnChannelInit();
519 } 522 }
520 523
524 void ChannelProxy::Pause() {
525 context_->ipc_task_runner()->PostTask(
526 FROM_HERE, base::Bind(&Context::PauseChannel, context_));
527 }
528
521 void ChannelProxy::Unpause(bool flush) { 529 void ChannelProxy::Unpause(bool flush) {
522 context_->ipc_task_runner()->PostTask( 530 context_->ipc_task_runner()->PostTask(
523 FROM_HERE, base::Bind(&Context::UnpauseChannel, context_, flush)); 531 FROM_HERE, base::Bind(&Context::UnpauseChannel, context_, flush));
524 } 532 }
525 533
526 void ChannelProxy::Flush() { 534 void ChannelProxy::Flush() {
527 context_->ipc_task_runner()->PostTask( 535 context_->ipc_task_runner()->PostTask(
528 FROM_HERE, base::Bind(&Context::FlushChannel, context_)); 536 FROM_HERE, base::Bind(&Context::FlushChannel, context_));
529 } 537 }
530 538
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
640 return channel->TakeClientFileDescriptor(); 648 return channel->TakeClientFileDescriptor();
641 } 649 }
642 #endif 650 #endif
643 651
644 void ChannelProxy::OnChannelInit() { 652 void ChannelProxy::OnChannelInit() {
645 } 653 }
646 654
647 //----------------------------------------------------------------------------- 655 //-----------------------------------------------------------------------------
648 656
649 } // namespace IPC 657 } // namespace IPC
OLDNEW
« no previous file with comments | « ipc/ipc_channel_proxy.h ('k') | ipc/ipc_mojo_bootstrap.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698