summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrockot <rockot@chromium.org>2016-03-18 11:58:15 -0700
committerCommit bot <commit-bot@chromium.org>2016-03-18 18:59:44 +0000
commit9691a7bf20f969e72b523e5006823901e34cd825 (patch)
tree5ba43382c2b35806dd3f9426ecde7b06b6ee33d3
parentcd4e139b12f45f81a77d6293f1bb9339464f80f4 (diff)
downloadchromium_src-9691a7bf20f969e72b523e5006823901e34cd825.zip
chromium_src-9691a7bf20f969e72b523e5006823901e34cd825.tar.gz
chromium_src-9691a7bf20f969e72b523e5006823901e34cd825.tar.bz2
ChannelMojo: Remove intermediate Message struct
This passes the data and handles directly in the Receive message rather than using an intermediate Message struct. One less alloc per Send, which seems worthwhile even though the performance delta is marginal. R=sammc@chromium.org BUG= Review URL: https://codereview.chromium.org/1809323002 Cr-Commit-Position: refs/heads/master@{#382037}
-rw-r--r--ipc/mojo/ipc.mojom7
-rw-r--r--ipc/mojo/ipc_message_pipe_reader.cc26
-rw-r--r--ipc/mojo/ipc_message_pipe_reader.h3
3 files changed, 16 insertions, 20 deletions
diff --git a/ipc/mojo/ipc.mojom b/ipc/mojo/ipc.mojom
index 6b69ced..d15a23c 100644
--- a/ipc/mojo/ipc.mojom
+++ b/ipc/mojo/ipc.mojom
@@ -16,13 +16,8 @@ struct SerializedHandle {
Type type;
};
-struct Message {
- array<uint8> data;
- array<SerializedHandle>? handles;
-};
-
interface Channel {
- Receive(Message message);
+ Receive(array<uint8> data, array<SerializedHandle>? handles);
};
// An interface for connecting a pair of Channel interfaces representing a
diff --git a/ipc/mojo/ipc_message_pipe_reader.cc b/ipc/mojo/ipc_message_pipe_reader.cc
index 76e323b..495a3a5 100644
--- a/ipc/mojo/ipc_message_pipe_reader.cc
+++ b/ipc/mojo/ipc_message_pipe_reader.cc
@@ -58,33 +58,33 @@ bool MessagePipeReader::Send(scoped_ptr<Message> message) {
"MessagePipeReader::Send",
message->flags(),
TRACE_EVENT_FLAG_FLOW_OUT);
- mojom::MessagePtr ipc_message = mojom::Message::New();
+ mojo::Array<mojom::SerializedHandlePtr> handles(nullptr);
MojoResult result = MOJO_RESULT_OK;
- result = ChannelMojo::ReadFromMessageAttachmentSet(message.get(),
- &ipc_message->handles);
+ result = ChannelMojo::ReadFromMessageAttachmentSet(message.get(), &handles);
if (result != MOJO_RESULT_OK) {
CloseWithError(result);
return false;
}
- ipc_message->data.resize(message->size());
+ mojo::Array<uint8_t> data(message->size());
std::copy(reinterpret_cast<const uint8_t*>(message->data()),
reinterpret_cast<const uint8_t*>(message->data()) + message->size(),
- &ipc_message->data[0]);
- sender_->Receive(std::move(ipc_message));
+ &data[0]);
+ sender_->Receive(std::move(data), std::move(handles));
DVLOG(4) << "Send " << message->type() << ": " << message->size();
return true;
}
-void MessagePipeReader::Receive(mojom::MessagePtr ipc_message) {
- Message message(ipc_message->data.size() == 0
- ? ""
- : reinterpret_cast<const char*>(&ipc_message->data[0]),
- static_cast<uint32_t>(ipc_message->data.size()));
+void MessagePipeReader::Receive(
+ mojo::Array<uint8_t> data,
+ mojo::Array<mojom::SerializedHandlePtr> handles) {
+ Message message(
+ data.size() == 0 ? "" : reinterpret_cast<const char*>(&data[0]),
+ static_cast<uint32_t>(data.size()));
message.set_sender_pid(peer_pid_);
DVLOG(4) << "Receive " << message.type() << ": " << message.size();
- MojoResult write_result = ChannelMojo::WriteToMessageAttachmentSet(
- std::move(ipc_message->handles), &message);
+ MojoResult write_result =
+ ChannelMojo::WriteToMessageAttachmentSet(std::move(handles), &message);
if (write_result != MOJO_RESULT_OK) {
CloseWithError(write_result);
return;
diff --git a/ipc/mojo/ipc_message_pipe_reader.h b/ipc/mojo/ipc_message_pipe_reader.h
index 75fe7ad..3989c25 100644
--- a/ipc/mojo/ipc_message_pipe_reader.h
+++ b/ipc/mojo/ipc_message_pipe_reader.h
@@ -92,7 +92,8 @@ class MessagePipeReader : public mojom::Channel {
void OnPipeError(MojoResult error);
private:
- void Receive(mojom::MessagePtr message) override;
+ void Receive(mojo::Array<uint8_t> data,
+ mojo::Array<mojom::SerializedHandlePtr> handles) override;
// |delegate_| is null once the message pipe is closed.
Delegate* delegate_;