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

Unified Diff: ipc/ipc_channel_nacl.cc

Issue 2504063002: Revert of Remove IPC::BrokerableAttachment. (Closed)
Patch Set: Created 4 years, 1 month 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 | « ipc/ipc_channel_nacl.h ('k') | ipc/ipc_channel_reader.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ipc/ipc_channel_nacl.cc
diff --git a/ipc/ipc_channel_nacl.cc b/ipc/ipc_channel_nacl.cc
index 0cea37315790f6fa767b88d63decdb51f7dff4ee..867eb97cb5ad5b65f373d5bb01fc94d10c56038c 100644
--- a/ipc/ipc_channel_nacl.cc
+++ b/ipc/ipc_channel_nacl.cc
@@ -23,7 +23,6 @@
#include "ipc/ipc_listener.h"
#include "ipc/ipc_logging.h"
#include "ipc/ipc_message_attachment_set.h"
-#include "ipc/ipc_platform_file_attachment_posix.h"
#include "native_client/src/public/imc_syscalls.h"
#include "native_client/src/public/imc_types.h"
@@ -226,11 +225,8 @@
data->swap(contents->data);
read_queue_.push_back(data);
- input_attachments_.reserve(contents->fds.size());
- for (int fd : contents->fds) {
- input_attachments_.push_back(
- new internal::PlatformFileAttachment(base::ScopedFD(fd)));
- }
+ input_fds_.insert(input_fds_.end(),
+ contents->fds.begin(), contents->fds.end());
contents->fds.clear();
// In POSIX, we would be told when there are bytes to read by implementing
@@ -278,22 +274,16 @@
linked_ptr<Message> msg = output_queue_.front();
output_queue_.pop_front();
- const size_t num_fds = msg->attachment_set()->size();
+ int fds[MessageAttachmentSet::kMaxDescriptorsPerMessage];
+ const size_t num_fds =
+ msg->attachment_set()->num_non_brokerable_attachments();
DCHECK(num_fds <= MessageAttachmentSet::kMaxDescriptorsPerMessage);
- std::vector<int> fds;
- fds.reserve(num_fds);
- for (size_t i = 0; i < num_fds; i++) {
- scoped_refptr<MessageAttachment> attachment =
- msg->attachment_set()->GetAttachmentAt(i);
- DCHECK_EQ(MessageAttachment::Type::PLATFORM_FILE, attachment->GetType());
- fds.push_back(static_cast<internal::PlatformFileAttachment&>(*attachment)
- .TakePlatformFile());
- }
+ msg->attachment_set()->PeekDescriptors(fds);
NaClAbiNaClImcMsgIoVec iov = {
const_cast<void*>(msg->data()), msg->size()
};
- NaClAbiNaClImcMsgHdr msgh = {&iov, 1, fds.data(), num_fds};
+ NaClAbiNaClImcMsgHdr msgh = { &iov, 1, fds, num_fds };
ssize_t bytes_written = imc_sendmsg(pipe_, &msgh, 0);
DCHECK(bytes_written); // The trusted side shouldn't return 0.
@@ -357,22 +347,23 @@
return true;
}
-bool ChannelNacl::GetAttachments(Message* msg) {
+bool ChannelNacl::GetNonBrokeredAttachments(Message* msg) {
uint16_t header_fds = msg->header()->num_fds;
- CHECK(header_fds == input_attachments_.size());
+ CHECK(header_fds == input_fds_.size());
if (header_fds == 0)
return true; // Nothing to do.
- for (auto& attachment : input_attachments_) {
- msg->attachment_set()->AddAttachment(std::move(attachment));
- }
- input_attachments_.clear();
+ // The shenaniganery below with &foo.front() requires input_fds_ to have
+ // contiguous underlying storage (such as a simple array or a std::vector).
+ // This is why the header warns not to make input_fds_ a deque<>.
+ msg->attachment_set()->AddDescriptorsToOwn(&input_fds_.front(), header_fds);
+ input_fds_.clear();
return true;
}
bool ChannelNacl::DidEmptyInputBuffers() {
- // When the input data buffer is empty, the attachments should be too.
- return input_attachments_.empty();
+ // When the input data buffer is empty, the fds should be too.
+ return input_fds_.empty();
}
void ChannelNacl::HandleInternalMessage(const Message& msg) {
« no previous file with comments | « ipc/ipc_channel_nacl.h ('k') | ipc/ipc_channel_reader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698