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

Unified Diff: components/arc/arc_session.cc

Issue 2583263002: arc: Switch to mojo::edk::CreateParentMessagePipe (Closed)
Patch Set: Might as well take advantage of iovec to avoid another call to sendmsg. Created 4 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/arc/arc_session.cc
diff --git a/components/arc/arc_session.cc b/components/arc/arc_session.cc
index c3dc19525e4e6baa690c5022a26dcb8650f05c89..92940393eee96fd97454ed176ea02dcef86c0bd8 100644
--- a/components/arc/arc_session.cc
+++ b/components/arc/arc_session.cc
@@ -9,6 +9,7 @@
#include <poll.h>
#include <unistd.h>
+#include <string>
#include <utility>
#include "base/files/file_path.h"
@@ -221,10 +222,10 @@ class ArcSessionImpl : public ArcSession,
// Synchronously accepts a connection on |socket_fd| and then processes the
// connected socket's file descriptor.
- static mojo::edk::ScopedPlatformHandle ConnectMojo(
+ static mojo::ScopedMessagePipeHandle ConnectMojo(
mojo::edk::ScopedPlatformHandle socket_fd,
base::ScopedFD cancel_fd);
- void OnMojoConnected(mojo::edk::ScopedPlatformHandle fd);
+ void OnMojoConnected(mojo::ScopedMessagePipeHandle server_pipe);
// Request to stop ARC instance via DBus.
void StopArcInstance();
@@ -422,44 +423,52 @@ void ArcSessionImpl::OnInstanceStarted(
}
// static
-mojo::edk::ScopedPlatformHandle ArcSessionImpl::ConnectMojo(
+mojo::ScopedMessagePipeHandle ArcSessionImpl::ConnectMojo(
mojo::edk::ScopedPlatformHandle socket_fd,
base::ScopedFD cancel_fd) {
if (!WaitForSocketReadable(socket_fd.get().handle, cancel_fd.get())) {
VLOG(1) << "Mojo connection was cancelled.";
- return mojo::edk::ScopedPlatformHandle();
+ return mojo::ScopedMessagePipeHandle();
}
mojo::edk::ScopedPlatformHandle scoped_fd;
if (!mojo::edk::ServerAcceptConnection(socket_fd.get(), &scoped_fd,
/* check_peer_user = */ false) ||
!scoped_fd.is_valid()) {
- return mojo::edk::ScopedPlatformHandle();
+ return mojo::ScopedMessagePipeHandle();
}
// Hardcode pid 0 since it is unused in mojo.
const base::ProcessHandle kUnusedChildProcessHandle = 0;
mojo::edk::PlatformChannelPair channel_pair;
+ std::string child_token = mojo::edk::GenerateRandomToken();
mojo::edk::ChildProcessLaunched(kUnusedChildProcessHandle,
- channel_pair.PassServerHandle(),
- mojo::edk::GenerateRandomToken());
+ channel_pair.PassServerHandle(), child_token);
mojo::edk::ScopedPlatformHandleVectorPtr handles(
new mojo::edk::PlatformHandleVector{
channel_pair.PassClientHandle().release()});
- struct iovec iov = {const_cast<char*>(""), 1};
+ std::string token = mojo::edk::GenerateRandomToken();
+ // We need to send the length of the message as a single byte, so make sure it
+ // fits.
+ DCHECK_LT(token.size(), 256u);
+ uint8_t message_length = static_cast<uint8_t>(token.size());
+ struct iovec iov[] = {{&message_length, sizeof(message_length)},
+ {const_cast<char*>(token.c_str()), token.size()}};
ssize_t result = mojo::edk::PlatformChannelSendmsgWithHandles(
- scoped_fd.get(), &iov, 1, handles->data(), handles->size());
+ scoped_fd.get(), iov, sizeof(iov) / sizeof(iov[0]), handles->data(),
+ handles->size());
if (result == -1) {
PLOG(ERROR) << "sendmsg";
- return mojo::edk::ScopedPlatformHandle();
+ return mojo::ScopedMessagePipeHandle();
}
- return scoped_fd;
+ return mojo::edk::CreateParentMessagePipe(token, child_token);
}
-void ArcSessionImpl::OnMojoConnected(mojo::edk::ScopedPlatformHandle fd) {
+void ArcSessionImpl::OnMojoConnected(
+ mojo::ScopedMessagePipeHandle server_pipe) {
DCHECK(thread_checker_.CalledOnValidThread());
if (state_ == State::STOPPED) {
@@ -477,14 +486,6 @@ void ArcSessionImpl::OnMojoConnected(mojo::edk::ScopedPlatformHandle fd) {
return;
}
- if (!fd.is_valid()) {
- LOG(ERROR) << "Invalid handle";
- StopArcInstance();
- return;
- }
-
- mojo::ScopedMessagePipeHandle server_pipe =
- mojo::edk::CreateMessagePipe(std::move(fd));
if (!server_pipe.is_valid()) {
LOG(ERROR) << "Invalid pipe";
StopArcInstance();
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698