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

Unified Diff: ipc/mojo/ipc_channel_mojo.cc

Issue 553283002: IPC::ChannelMojo: Introduce IPC::MojoBootstrap for Windows (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 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 side-by-side diff with in-line comments
Download patch
Index: ipc/mojo/ipc_channel_mojo.cc
diff --git a/ipc/mojo/ipc_channel_mojo.cc b/ipc/mojo/ipc_channel_mojo.cc
index 086b420cc52071ef90c7b53cf77249714efd67be..dd6da3891f6a8c4e5d93b1bef61c719bd93df7c7 100644
--- a/ipc/mojo/ipc_channel_mojo.cc
+++ b/ipc/mojo/ipc_channel_mojo.cc
@@ -9,6 +9,7 @@
#include "base/lazy_instance.h"
#include "ipc/ipc_listener.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)
@@ -41,8 +42,6 @@ class NullListener : public Listener {
}
};
-base::LazyInstance<NullListener> g_null_listener = LAZY_INSTANCE_INITIALIZER;
-
class MojoChannelFactory : public ChannelFactory {
public:
MojoChannelFactory(
@@ -72,16 +71,79 @@ class MojoChannelFactory : public ChannelFactory {
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
-}
+//------------------------------------------------------------------------------
+
+// TODO(morrita): This should be built using higher-level Mojo construct
+// for clarity and extensibility.
+class HelloMessage {
viettrungluu 2014/09/15 22:37:27 I don't think you need (or use) this anywhere?
Hajime Morrita 2014/09/15 23:51:33 Right. Removing.
+ public:
+ static Pickle CreateRequest(int32 pid) {
+ Pickle request;
+ request.WriteString(kHelloRequestMagic);
+ request.WriteInt(pid);
+ return request;
+ }
+
+ static bool ReadRequest(Pickle& pickle, int32* pid) {
+ PickleIterator iter(pickle);
+ std::string hello;
+ if (!iter.ReadString(&hello)) {
+ DLOG(WARNING) << "Failed to Read magic string.";
+ return false;
+ }
+
+ if (hello != kHelloRequestMagic) {
+ DLOG(WARNING) << "Magic mismatch:" << hello;
+ return false;
+ }
+
+ int read_pid;
+ if (!iter.ReadInt(&read_pid)) {
+ DLOG(WARNING) << "Failed to Read PID.";
+ return false;
+ }
+
+ *pid = read_pid;
+ return true;
+ }
+
+ static Pickle CreateResponse(int32 pid) {
+ Pickle request;
+ request.WriteString(kHelloResponseMagic);
+ request.WriteInt(pid);
+ return request;
+ }
+
+ static bool ReadResponse(Pickle& pickle, int32* pid) {
+ PickleIterator iter(pickle);
+ std::string hello;
+ if (!iter.ReadString(&hello)) {
+ DLOG(WARNING) << "Failed to read magic string.";
+ return false;
+ }
+
+ if (hello != kHelloResponseMagic) {
+ DLOG(WARNING) << "Magic mismatch:" << hello;
+ return false;
+ }
+
+ int read_pid;
+ if (!iter.ReadInt(&read_pid)) {
+ DLOG(WARNING) << "Failed to read PID.";
+ return false;
+ }
+
+ *pid = read_pid;
+ return true;
+ }
+
+ private:
+ static const char* kHelloRequestMagic;
+ static const char* kHelloResponseMagic;
+};
+
+const char* HelloMessage::kHelloRequestMagic = "MREQ";
+const char* HelloMessage::kHelloResponseMagic = "MRES";
} // namespace
@@ -112,22 +174,21 @@ scoped_ptr<ChannelFactory> ChannelMojo::CreateFactory(
io_thread_task_runner)).PassAs<ChannelFactory>();
}
-ChannelMojo::ChannelMojo(const ChannelHandle& channel_handle,
+ChannelMojo::ChannelMojo(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())),
- mode_(mode),
+ : mode_(mode),
listener_(listener),
peer_pid_(base::kNullProcessId),
weak_factory_(this) {
if (base::MessageLoopProxy::current() == io_thread_task_runner.get()) {
- InitOnIOThread();
+ InitBootstrap(handle);
} else {
- io_thread_task_runner->PostTask(FROM_HERE,
- base::Bind(&ChannelMojo::InitOnIOThread,
- weak_factory_.GetWeakPtr()));
+ io_thread_task_runner->PostTask(
+ FROM_HERE,
+ base::Bind(
+ &ChannelMojo::InitBootstrap, weak_factory_.GetWeakPtr(), handle));
}
}
@@ -135,13 +196,17 @@ ChannelMojo::~ChannelMojo() {
Close();
}
-void ChannelMojo::InitOnIOThread() {
+void ChannelMojo::InitBootstrap(ChannelHandle handle) {
+ DCHECK(base::MessageLoopForIO::IsCurrent());
+ bootstrap_ = MojoBootstrap::Create(handle, mode_, this);
+}
+
+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 +226,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 +236,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));
@@ -207,11 +282,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) {

Powered by Google App Engine
This is Rietveld 408576698