summaryrefslogtreecommitdiffstats
path: root/ipc/mojo/ipc_channel_mojo.cc
diff options
context:
space:
mode:
authormorrita <morrita@chromium.org>2014-09-24 13:11:45 -0700
committerCommit bot <commit-bot@chromium.org>2014-09-24 20:11:59 +0000
commit96693856edc35a538f6ea8f0bd6ab55c75e3e823 (patch)
tree33bf28816211d8c3a5039db1d2f3a1ac74adf59e /ipc/mojo/ipc_channel_mojo.cc
parent33169d9f2497a79fdde3ae51c5aa7266032526c7 (diff)
downloadchromium_src-96693856edc35a538f6ea8f0bd6ab55c75e3e823.zip
chromium_src-96693856edc35a538f6ea8f0bd6ab55c75e3e823.tar.gz
chromium_src-96693856edc35a538f6ea8f0bd6ab55c75e3e823.tar.bz2
IPC: Get rid of FileDescriptor usage from FileDescriptorSet and Message
This is a step toward to killing FileDescriptor. This change lets FiileDescriptorSet have both Files (for owning fds) and PlatformFiles (for non-owning fds). Doing this, we no longer need FileDescriptor which provides |auto_close| flag. BUG=415294 TEST=ipc_tests, ipc_mojo_unittests R=agl@chromium.org, jam@hcromium.org, viettrungluu@chromium.org Review URL: https://codereview.chromium.org/583473002 Cr-Commit-Position: refs/heads/master@{#296498}
Diffstat (limited to 'ipc/mojo/ipc_channel_mojo.cc')
-rw-r--r--ipc/mojo/ipc_channel_mojo.cc19
1 files changed, 13 insertions, 6 deletions
diff --git a/ipc/mojo/ipc_channel_mojo.cc b/ipc/mojo/ipc_channel_mojo.cc
index e61a90e..72bc29b 100644
--- a/ipc/mojo/ipc_channel_mojo.cc
+++ b/ipc/mojo/ipc_channel_mojo.cc
@@ -229,7 +229,8 @@ MojoResult ChannelMojo::WriteToFileDescriptorSet(
return unwrap_result;
}
- bool ok = message->file_descriptor_set()->Add(platform_handle.release().fd);
+ bool ok = message->file_descriptor_set()->AddToOwn(
+ base::ScopedFD(platform_handle.release().fd));
DCHECK(ok);
}
@@ -238,17 +239,20 @@ MojoResult ChannelMojo::WriteToFileDescriptorSet(
// static
MojoResult ChannelMojo::ReadFromFileDescriptorSet(
- const Message& message,
+ Message* message,
std::vector<MojoHandle>* handles) {
// We dup() the handles in IPC::Message to transmit.
// IPC::FileDescriptorSet has intricate lifecycle semantics
// of FDs, so just to dup()-and-own them is the safest option.
- if (message.HasFileDescriptors()) {
- const FileDescriptorSet* fdset = message.file_descriptor_set();
- for (size_t i = 0; i < fdset->size(); ++i) {
- int fd_to_send = dup(fdset->GetDescriptorAt(i));
+ if (message->HasFileDescriptors()) {
+ FileDescriptorSet* fdset = message->file_descriptor_set();
+ std::vector<base::PlatformFile> fds_to_send(fdset->size());
+ fdset->PeekDescriptors(&fds_to_send[0]);
+ for (size_t i = 0; i < fds_to_send.size(); ++i) {
+ int fd_to_send = dup(fds_to_send[i]);
if (-1 == fd_to_send) {
DPLOG(WARNING) << "Failed to dup FD to transmit.";
+ fdset->CommitAll();
return MOJO_RESULT_UNKNOWN;
}
@@ -260,11 +264,14 @@ MojoResult ChannelMojo::ReadFromFileDescriptorSet(
if (MOJO_RESULT_OK != wrap_result) {
DLOG(WARNING) << "Pipe failed to wrap handles. Closing: "
<< wrap_result;
+ fdset->CommitAll();
return wrap_result;
}
handles->push_back(wrapped_handle);
}
+
+ fdset->CommitAll();
}
return MOJO_RESULT_OK;