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

Unified Diff: ipc/ipc_channel_proxy.cc

Issue 5598010: Convert over to channel handles (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Fixed up bad whitespace Created 10 years 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 side-by-side diff with in-line comments
Download patch
Index: ipc/ipc_channel_proxy.cc
diff --git a/ipc/ipc_channel_proxy.cc b/ipc/ipc_channel_proxy.cc
index 8450c28e874c907677fc6d3c27c6e45251fe7068..0eee9daa33f4ec4d57855db2f1313389016bf751 100644
--- a/ipc/ipc_channel_proxy.cc
+++ b/ipc/ipc_channel_proxy.cc
@@ -65,16 +65,15 @@ ChannelProxy::Context::Context(Channel::Listener* listener,
: listener_message_loop_(MessageLoop::current()),
listener_(listener),
ipc_message_loop_(ipc_message_loop),
- channel_(NULL),
peer_pid_(0),
channel_connected_called_(false) {
}
-void ChannelProxy::Context::CreateChannel(const std::string& id,
+void ChannelProxy::Context::CreateChannel(const IPC::ChannelHandle& handle,
const Channel::Mode& mode) {
- DCHECK(channel_ == NULL);
- channel_id_ = id;
- channel_ = new Channel(id, mode, this);
+ DCHECK(channel_.get() == NULL);
+ channel_id_ = handle.name;
+ channel_.reset(new Channel(handle, mode, this));
}
bool ChannelProxy::Context::TryFilters(const Message& message) {
@@ -154,14 +153,14 @@ void ChannelProxy::Context::OnChannelOpened() {
}
for (size_t i = 0; i < filters_.size(); ++i)
- filters_[i]->OnFilterAdded(channel_);
+ filters_[i]->OnFilterAdded(channel_.get());
}
// Called on the IPC::Channel thread
void ChannelProxy::Context::OnChannelClosed() {
// It's okay for IPC::ChannelProxy::Close to be called more than once, which
// would result in this branch being taken.
- if (!channel_)
+ if (!channel_.get())
return;
for (size_t i = 0; i < filters_.size(); ++i) {
@@ -172,8 +171,7 @@ void ChannelProxy::Context::OnChannelClosed() {
// We don't need the filters anymore.
filters_.clear();
- delete channel_;
- channel_ = NULL;
+ channel_.reset();
// Balance with the reference taken during startup. This may result in
// self-destruction.
@@ -182,7 +180,7 @@ void ChannelProxy::Context::OnChannelClosed() {
// Called on the IPC::Channel thread
void ChannelProxy::Context::OnSendMessage(Message* message) {
- if (!channel_) {
+ if (!channel_.get()) {
delete message;
OnChannelClosed();
return;
@@ -204,8 +202,8 @@ void ChannelProxy::Context::OnAddFilter() {
// If the channel has already been created, then we need to send this
// message so that the filter gets access to the Channel.
- if (channel_)
- filters[i]->OnFilterAdded(channel_);
+ if (channel_.get())
+ filters[i]->OnFilterAdded(channel_.get());
// Ditto for the peer process id.
if (peer_pid_)
filters[i]->OnChannelConnected(peer_pid_);
@@ -278,38 +276,49 @@ void ChannelProxy::Context::OnDispatchError() {
//-----------------------------------------------------------------------------
-ChannelProxy::ChannelProxy(const std::string& channel_id,
+ChannelProxy::ChannelProxy(const IPC::ChannelHandle& channel_handle,
Channel::Mode mode,
Channel::Listener* listener,
MessageLoop* ipc_thread)
: context_(new Context(listener, ipc_thread)) {
- Init(channel_id, mode, ipc_thread, true);
+ Init(channel_handle, mode, ipc_thread, true);
}
-ChannelProxy::ChannelProxy(const std::string& channel_id,
+ChannelProxy::ChannelProxy(const IPC::ChannelHandle& channel_handle,
Channel::Mode mode,
MessageLoop* ipc_thread,
Context* context,
bool create_pipe_now)
: context_(context) {
- Init(channel_id, mode, ipc_thread, create_pipe_now);
+ Init(channel_handle, mode, ipc_thread, create_pipe_now);
}
ChannelProxy::~ChannelProxy() {
Close();
}
-void ChannelProxy::Init(const std::string& channel_id, Channel::Mode mode,
- MessageLoop* ipc_thread_loop, bool create_pipe_now) {
+void ChannelProxy::Init(const IPC::ChannelHandle& channel_handle,
+ Channel::Mode mode, MessageLoop* ipc_thread_loop,
+ bool create_pipe_now) {
+#if defined(OS_POSIX)
+ // When we are creating a server on POSIX, we need it's file descriptor
agl 2010/12/08 15:38:57 s/it's/its/
+ // to be created immediately so that it can be accessed and passed
+ // to other processes. Forcing it to be made immediately avoids
agl 2010/12/08 15:38:57 s/made/created/
+ // race conditions that may otherwise arise.
+ if (mode == Channel::MODE_SERVER) {
+ create_pipe_now = true;
+ }
+#endif // defined(OS_POSIX)
+
if (create_pipe_now) {
// Create the channel immediately. This effectively sets up the
// low-level pipe so that the client can connect. Without creating
// the pipe immediately, it is possible for a listener to attempt
// to connect and get an error since the pipe doesn't exist yet.
- context_->CreateChannel(channel_id, mode);
+ context_->CreateChannel(channel_handle, mode);
} else {
context_->ipc_message_loop()->PostTask(FROM_HERE, NewRunnableMethod(
- context_.get(), &Context::CreateChannel, channel_id, mode));
+ context_.get(), &Context::CreateChannel, channel_handle, mode));
}
// complete initialization on the background thread
@@ -360,8 +369,9 @@ void ChannelProxy::ClearIPCMessageLoop() {
// ChannelProxy::Init().
// We assume that IPC::Channel::GetClientFileDescriptorMapping() is thread-safe.
int ChannelProxy::GetClientFileDescriptor() const {
- Channel *channel = context_.get()->channel_;
- DCHECK(channel); // Channel must have been created first.
+ Channel *channel = context_.get()->channel_.get();
+ // Channel must have been created first.
+ DCHECK(channel) << context_.get()->channel_id_;
return channel->GetClientFileDescriptor();
}
#endif
« ipc/ipc_channel_posix.h ('K') | « ipc/ipc_channel_proxy.h ('k') | ipc/ipc_channel_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698