diff options
author | morrita <morrita@chromium.org> | 2014-09-24 13:11:45 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-09-24 20:11:59 +0000 |
commit | 96693856edc35a538f6ea8f0bd6ab55c75e3e823 (patch) | |
tree | 33bf28816211d8c3a5039db1d2f3a1ac74adf59e /ipc/mojo/ipc_channel_mojo.cc | |
parent | 33169d9f2497a79fdde3ae51c5aa7266032526c7 (diff) | |
download | chromium_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.cc | 19 |
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; |