summaryrefslogtreecommitdiffstats
path: root/ipc/mojo/ipc_channel_mojo.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ipc/mojo/ipc_channel_mojo.cc')
-rw-r--r--ipc/mojo/ipc_channel_mojo.cc139
1 files changed, 60 insertions, 79 deletions
diff --git a/ipc/mojo/ipc_channel_mojo.cc b/ipc/mojo/ipc_channel_mojo.cc
index 71c373e..e61a90e 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) {