Index: ipc/mojo/ipc_channel_mojo.cc |
diff --git a/ipc/mojo/ipc_channel_mojo.cc b/ipc/mojo/ipc_channel_mojo.cc |
index 71c373e01cf07a63708871ae3077c121fc0f3e31..e61a90e6851bab3f2e983df7d17c37a6dada544f 100644 |
--- a/ipc/mojo/ipc_channel_mojo.cc |
+++ b/ipc/mojo/ipc_channel_mojo.cc |
@@ -8,7 +8,9 @@ |
#include "base/bind_helpers.h" |
#include "base/lazy_instance.h" |
#include "ipc/ipc_listener.h" |
+#include "ipc/mojo/ipc_channel_mojo_host.h" |
#include "ipc/mojo/ipc_channel_mojo_readers.h" |
+#include "ipc/mojo/ipc_mojo_bootstrap.h" |
#include "mojo/embedder/embedder.h" |
#if defined(OS_POSIX) && !defined(OS_NACL) |
@@ -19,70 +21,28 @@ namespace IPC { |
namespace { |
-// IPC::Listener for bootstrap channels. |
-// It should never receive any message. |
-class NullListener : public Listener { |
- public: |
- virtual bool OnMessageReceived(const Message&) OVERRIDE { |
- NOTREACHED(); |
- return false; |
- } |
- |
- virtual void OnChannelConnected(int32 peer_pid) OVERRIDE { |
- NOTREACHED(); |
- } |
- |
- virtual void OnChannelError() OVERRIDE { |
- NOTREACHED(); |
- } |
- |
- virtual void OnBadMessageReceived(const Message& message) OVERRIDE { |
- NOTREACHED(); |
- } |
-}; |
- |
-base::LazyInstance<NullListener> g_null_listener = LAZY_INSTANCE_INITIALIZER; |
- |
class MojoChannelFactory : public ChannelFactory { |
public: |
- MojoChannelFactory( |
- ChannelHandle channel_handle, |
- Channel::Mode mode, |
- scoped_refptr<base::TaskRunner> io_thread_task_runner) |
- : channel_handle_(channel_handle), |
- mode_(mode), |
- io_thread_task_runner_(io_thread_task_runner) { |
- } |
+ MojoChannelFactory(ChannelMojoHost* host, |
+ ChannelHandle channel_handle, |
+ Channel::Mode mode) |
+ : host_(host), channel_handle_(channel_handle), mode_(mode) {} |
virtual std::string GetName() const OVERRIDE { |
return channel_handle_.name; |
} |
virtual scoped_ptr<Channel> BuildChannel(Listener* listener) OVERRIDE { |
- return ChannelMojo::Create( |
- channel_handle_, |
- mode_, |
- listener, |
- io_thread_task_runner_).PassAs<Channel>(); |
+ return ChannelMojo::Create(host_, channel_handle_, mode_, listener) |
+ .PassAs<Channel>(); |
} |
private: |
+ ChannelMojoHost* host_; |
ChannelHandle channel_handle_; |
Channel::Mode mode_; |
- scoped_refptr<base::TaskRunner> io_thread_task_runner_; |
}; |
-mojo::embedder::PlatformHandle ToPlatformHandle( |
- const ChannelHandle& handle) { |
-#if defined(OS_POSIX) && !defined(OS_NACL) |
- return mojo::embedder::PlatformHandle(handle.socket.fd); |
-#elif defined(OS_WIN) |
- return mojo::embedder::PlatformHandle(handle.pipe.handle); |
-#else |
-#error "Unsupported Platform!" |
-#endif |
-} |
- |
} // namespace |
//------------------------------------------------------------------------------ |
@@ -95,53 +55,59 @@ void ChannelMojo::ChannelInfoDeleter::operator()( |
//------------------------------------------------------------------------------ |
// static |
-scoped_ptr<ChannelMojo> ChannelMojo::Create( |
- const ChannelHandle &channel_handle, Mode mode, Listener* listener, |
- scoped_refptr<base::TaskRunner> io_thread_task_runner) { |
+scoped_ptr<ChannelMojo> ChannelMojo::Create(ChannelMojoHost* host, |
+ const ChannelHandle& channel_handle, |
+ Mode mode, |
+ Listener* listener) { |
+ return make_scoped_ptr(new ChannelMojo(host, channel_handle, mode, listener)); |
+} |
+ |
+// static |
+scoped_ptr<ChannelFactory> ChannelMojo::CreateServerFactory( |
+ ChannelMojoHost* host, |
+ const ChannelHandle& channel_handle) { |
return make_scoped_ptr( |
- new ChannelMojo(channel_handle, mode, listener, io_thread_task_runner)); |
+ new MojoChannelFactory(host, channel_handle, Channel::MODE_SERVER)) |
+ .PassAs<ChannelFactory>(); |
} |
// static |
-scoped_ptr<ChannelFactory> ChannelMojo::CreateFactory( |
- const ChannelHandle &channel_handle, Mode mode, |
- scoped_refptr<base::TaskRunner> io_thread_task_runner) { |
+scoped_ptr<ChannelFactory> ChannelMojo::CreateClientFactory( |
+ const ChannelHandle& channel_handle) { |
return make_scoped_ptr( |
- new MojoChannelFactory( |
- channel_handle, mode, |
- io_thread_task_runner)).PassAs<ChannelFactory>(); |
+ new MojoChannelFactory(NULL, channel_handle, Channel::MODE_CLIENT)) |
+ .PassAs<ChannelFactory>(); |
} |
-ChannelMojo::ChannelMojo(const ChannelHandle& channel_handle, |
+ChannelMojo::ChannelMojo(ChannelMojoHost* host, |
+ const ChannelHandle& handle, |
Mode mode, |
- Listener* listener, |
- scoped_refptr<base::TaskRunner> io_thread_task_runner) |
- : bootstrap_( |
- Channel::Create(channel_handle, mode, g_null_listener.Pointer())), |
+ Listener* listener) |
+ : host_(host), |
mode_(mode), |
listener_(listener), |
peer_pid_(base::kNullProcessId), |
weak_factory_(this) { |
- if (base::MessageLoopProxy::current() == io_thread_task_runner.get()) { |
- InitOnIOThread(); |
- } else { |
- io_thread_task_runner->PostTask(FROM_HERE, |
- base::Bind(&ChannelMojo::InitOnIOThread, |
- weak_factory_.GetWeakPtr())); |
- } |
+ // Create MojoBootstrap after all members are set as it touches |
+ // ChannelMojo from a different thread. |
+ bootstrap_ = MojoBootstrap::Create(handle, mode, this); |
+ if (host_) |
+ host_->OnChannelCreated(this); |
} |
ChannelMojo::~ChannelMojo() { |
Close(); |
+ |
+ if (host_) |
+ host_->OnChannelDestroyed(); |
} |
-void ChannelMojo::InitOnIOThread() { |
+void ChannelMojo::InitControlReader( |
+ mojo::embedder::ScopedPlatformHandle handle) { |
+ DCHECK(base::MessageLoopForIO::IsCurrent()); |
mojo::embedder::ChannelInfo* channel_info; |
mojo::ScopedMessagePipeHandle control_pipe = |
- mojo::embedder::CreateChannelOnIOThread( |
- mojo::embedder::ScopedPlatformHandle( |
- ToPlatformHandle(bootstrap_->TakePipeHandle())), |
- &channel_info); |
+ mojo::embedder::CreateChannelOnIOThread(handle.Pass(), &channel_info); |
channel_info_.reset(channel_info); |
switch (mode_) { |
@@ -161,7 +127,8 @@ void ChannelMojo::InitOnIOThread() { |
bool ChannelMojo::Connect() { |
DCHECK(!message_reader_); |
- return control_reader_->Connect(); |
+ DCHECK(!control_reader_); |
+ return bootstrap_->Connect(); |
} |
void ChannelMojo::Close() { |
@@ -170,6 +137,15 @@ void ChannelMojo::Close() { |
channel_info_.reset(); |
} |
+void ChannelMojo::OnPipeAvailable(mojo::embedder::ScopedPlatformHandle handle) { |
+ InitControlReader(handle.Pass()); |
+ control_reader_->Connect(); |
+} |
+ |
+void ChannelMojo::OnBootstrapError() { |
+ listener_->OnChannelError(); |
+} |
+ |
void ChannelMojo::OnConnected(mojo::ScopedMessagePipeHandle pipe) { |
message_reader_ = |
make_scoped_ptr(new internal::MessageReader(pipe.Pass(), this)); |
@@ -212,11 +188,16 @@ base::ProcessId ChannelMojo::GetPeerPID() const { |
} |
base::ProcessId ChannelMojo::GetSelfPID() const { |
- return bootstrap_->GetSelfPID(); |
+ return base::GetCurrentProcId(); |
} |
ChannelHandle ChannelMojo::TakePipeHandle() { |
- return bootstrap_->TakePipeHandle(); |
+ NOTREACHED(); |
+ return ChannelHandle(); |
+} |
+ |
+void ChannelMojo::OnClientLaunched(base::ProcessHandle handle) { |
+ bootstrap_->OnClientLaunched(handle); |
} |
void ChannelMojo::OnMessageReceived(Message& message) { |