summaryrefslogtreecommitdiffstats
path: root/ipc/mojo/ipc_channel_mojo.h
diff options
context:
space:
mode:
authormorrita <morrita@chromium.org>2014-09-25 20:20:48 -0700
committerCommit bot <commit-bot@chromium.org>2014-09-26 03:20:58 +0000
commite9453ea69cbb3d52e67394e75c747b0b2d970621 (patch)
tree3178358ae6c053774fbf636668f1e34f11526f60 /ipc/mojo/ipc_channel_mojo.h
parentba4cf8bb6dc77ea033fe13989eb604d6069daa97 (diff)
downloadchromium_src-e9453ea69cbb3d52e67394e75c747b0b2d970621.zip
chromium_src-e9453ea69cbb3d52e67394e75c747b0b2d970621.tar.gz
chromium_src-e9453ea69cbb3d52e67394e75c747b0b2d970621.tar.bz2
ChannelMojo: Handle when ChannelMojo outlives ChannelMojoHost
In some case ChannelMojo outlives ChannelMojoHost because two objects are living in diffent thread. Instead of using lifecycle callbacks, this CL relies on WeakPtr. See comment on ipc_channel_mojo_host.h for more details. This CL also fixes a crash on --single-process mode. R=viettrungluu@chromium.org TBR=jam@chromium.org TEST=content_browsertests (with --enable-renderer-mojo-channel on) BUG=377980 Review URL: https://codereview.chromium.org/599333002 Cr-Commit-Position: refs/heads/master@{#296871}
Diffstat (limited to 'ipc/mojo/ipc_channel_mojo.h')
-rw-r--r--ipc/mojo/ipc_channel_mojo.h21
1 files changed, 14 insertions, 7 deletions
diff --git a/ipc/mojo/ipc_channel_mojo.h b/ipc/mojo/ipc_channel_mojo.h
index c356906..5867c08 100644
--- a/ipc/mojo/ipc_channel_mojo.h
+++ b/ipc/mojo/ipc_channel_mojo.h
@@ -32,8 +32,6 @@ class ClientControlReader;
class MessageReader;
}
-class ChannelMojoHost;
-
// Mojo-based IPC::Channel implementation over a platform handle.
//
// ChannelMojo builds Mojo MessagePipe using underlying pipe given by
@@ -61,9 +59,17 @@ class ChannelMojoHost;
class IPC_MOJO_EXPORT ChannelMojo : public Channel,
public MojoBootstrap::Delegate {
public:
+ class Delegate {
+ public:
+ virtual ~Delegate() {}
+ virtual base::WeakPtr<Delegate> ToWeakPtr() = 0;
+ virtual scoped_refptr<base::TaskRunner> GetIOTaskRunner() = 0;
+ virtual void OnChannelCreated(base::WeakPtr<ChannelMojo> channel) = 0;
+ };
+
// Create ChannelMojo. A bootstrap channel is created as well.
- // |host| must not be null.
- static scoped_ptr<ChannelMojo> Create(ChannelMojoHost* host,
+ // |host| must not be null for server channels.
+ static scoped_ptr<ChannelMojo> Create(Delegate* delegate,
const ChannelHandle& channel_handle,
Mode mode,
Listener* listener);
@@ -72,7 +78,7 @@ class IPC_MOJO_EXPORT ChannelMojo : public Channel,
// The factory is used to create Mojo-based ChannelProxy family.
// |host| must not be null.
static scoped_ptr<ChannelFactory> CreateServerFactory(
- ChannelMojoHost* host,
+ Delegate* delegate,
const ChannelHandle& channel_handle);
static scoped_ptr<ChannelFactory> CreateClientFactory(
@@ -117,7 +123,7 @@ class IPC_MOJO_EXPORT ChannelMojo : public Channel,
void set_peer_pid(base::ProcessId pid) { peer_pid_ = pid; }
protected:
- ChannelMojo(ChannelMojoHost* host,
+ ChannelMojo(Delegate* delegate,
const ChannelHandle& channel_handle,
Mode mode,
Listener* listener);
@@ -132,10 +138,11 @@ class IPC_MOJO_EXPORT ChannelMojo : public Channel,
// notifications invoked by them.
typedef internal::MessagePipeReader::DelayedDeleter ReaderDeleter;
+ void InitDelegate(ChannelMojo::Delegate* delegate);
void InitControlReader(mojo::embedder::ScopedPlatformHandle handle);
scoped_ptr<MojoBootstrap> bootstrap_;
- ChannelMojoHost* const host_;
+ base::WeakPtr<Delegate> delegate_;
Mode mode_;
Listener* listener_;
base::ProcessId peer_pid_;