Commit 8c14ad2e authored by Victor Costan's avatar Victor Costan Committed by Commit Bot

Make BlinkCloneableMessage and BlinkTransferableMessage move-only.

The mojo typemaps for BlinkCloneableMessage and BlinkTransferableMessage
specify that the structs are move-only, so the code in the mojo bindings
uses std::move. However, since the structs declare a custom constructor
(the constructor is defaulted in the .cpp, but the compiler can't see
this from the .h), no move constructor or move-assignment is generated,
and the structs are copied rather than being moved.

The mismatch causes extra reference increments / decrements. When the
underlying type uses thread-safe reference counter (like
SerializedScriptValue does), increments and decrements use atomic
operations, which are not cheap on ARM.

This CL adds move constructors and move-assignment operators to
BlinkCloneableMessage to allow moving, and adds DISALLOW_COPY_AND_ASSIGN
to prevent accidental copying.

This CL also adds DISALLOW_COPY_AND_ASSIGN to the browser-side
structures corresponding to Blink{Cloneable,Transferable}Message, to
make it obvious that they are move-only.

Bug: 794791
Change-Id: Iffe8f1e65bf9ccc2cd98082c341c2bdc3246fa33
Reviewed-on: https://chromium-review.googlesource.com/826260
Commit-Queue: Jeremy Roman <jbroman@chromium.org>
Reviewed-by: default avatarJeremy Roman <jbroman@chromium.org>
Reviewed-by: default avatarMarijn Kruisselbrink <mek@chromium.org>
Cr-Commit-Position: refs/heads/master@{#524085}
parent 8c324f67
......@@ -9,4 +9,8 @@ namespace blink {
BlinkCloneableMessage::BlinkCloneableMessage() = default;
BlinkCloneableMessage::~BlinkCloneableMessage() = default;
BlinkCloneableMessage::BlinkCloneableMessage(BlinkCloneableMessage&&) = default;
BlinkCloneableMessage& BlinkCloneableMessage::operator=(
BlinkCloneableMessage&&) = default;
} // namespace blink
......@@ -5,6 +5,7 @@
#ifndef BlinkCloneableMessage_h
#define BlinkCloneableMessage_h
#include "base/macros.h"
#include "bindings/core/v8/serialization/SerializedScriptValue.h"
#include "core/CoreExport.h"
......@@ -18,7 +19,13 @@ struct CORE_EXPORT BlinkCloneableMessage {
BlinkCloneableMessage();
~BlinkCloneableMessage();
BlinkCloneableMessage(BlinkCloneableMessage&&);
BlinkCloneableMessage& operator=(BlinkCloneableMessage&&);
scoped_refptr<blink::SerializedScriptValue> message;
private:
DISALLOW_COPY_AND_ASSIGN(BlinkCloneableMessage);
};
} // namespace blink
......
......@@ -9,4 +9,9 @@ namespace blink {
BlinkTransferableMessage::BlinkTransferableMessage() = default;
BlinkTransferableMessage::~BlinkTransferableMessage() = default;
BlinkTransferableMessage::BlinkTransferableMessage(BlinkTransferableMessage&&) =
default;
BlinkTransferableMessage& BlinkTransferableMessage::operator=(
BlinkTransferableMessage&&) = default;
} // namespace blink
......@@ -5,6 +5,7 @@
#ifndef BlinkTransferableMessage_h
#define BlinkTransferableMessage_h
#include "base/macros.h"
#include "bindings/core/v8/serialization/SerializedScriptValue.h"
#include "core/CoreExport.h"
#include "core/dom/BlinkCloneableMessage.h"
......@@ -20,7 +21,13 @@ struct CORE_EXPORT BlinkTransferableMessage : BlinkCloneableMessage {
BlinkTransferableMessage();
~BlinkTransferableMessage();
BlinkTransferableMessage(BlinkTransferableMessage&&);
BlinkTransferableMessage& operator=(BlinkTransferableMessage&&);
Vector<MessagePortChannel> ports;
private:
DISALLOW_COPY_AND_ASSIGN(BlinkTransferableMessage);
};
} // namespace blink
......
......@@ -8,6 +8,7 @@
#include <vector>
#include "base/containers/span.h"
#include "base/macros.h"
#include "mojo/public/cpp/bindings/struct_ptr.h"
#include "third_party/WebKit/common/common_export.h"
......@@ -38,6 +39,9 @@ struct BLINK_COMMON_EXPORT CloneableMessage {
// Blob handles for any blobs being sent in this message.
std::vector<mojo::StructPtr<mojom::SerializedBlob>> blobs;
private:
DISALLOW_COPY_AND_ASSIGN(CloneableMessage);
};
} // namespace blink
......
......@@ -8,6 +8,7 @@
#include <vector>
#include "base/containers/span.h"
#include "base/macros.h"
#include "third_party/WebKit/common/common_export.h"
#include "third_party/WebKit/common/message_port/cloneable_message.h"
#include "third_party/WebKit/common/message_port/message_port_channel.h"
......@@ -24,6 +25,9 @@ struct BLINK_COMMON_EXPORT TransferableMessage : public CloneableMessage {
// Any ports being transfered as part of this message.
std::vector<MessagePortChannel> ports;
private:
DISALLOW_COPY_AND_ASSIGN(TransferableMessage);
};
} // namespace blink
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment