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 { ...@@ -9,4 +9,8 @@ namespace blink {
BlinkCloneableMessage::BlinkCloneableMessage() = default; BlinkCloneableMessage::BlinkCloneableMessage() = default;
BlinkCloneableMessage::~BlinkCloneableMessage() = default; BlinkCloneableMessage::~BlinkCloneableMessage() = default;
BlinkCloneableMessage::BlinkCloneableMessage(BlinkCloneableMessage&&) = default;
BlinkCloneableMessage& BlinkCloneableMessage::operator=(
BlinkCloneableMessage&&) = default;
} // namespace blink } // namespace blink
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#ifndef BlinkCloneableMessage_h #ifndef BlinkCloneableMessage_h
#define BlinkCloneableMessage_h #define BlinkCloneableMessage_h
#include "base/macros.h"
#include "bindings/core/v8/serialization/SerializedScriptValue.h" #include "bindings/core/v8/serialization/SerializedScriptValue.h"
#include "core/CoreExport.h" #include "core/CoreExport.h"
...@@ -18,7 +19,13 @@ struct CORE_EXPORT BlinkCloneableMessage { ...@@ -18,7 +19,13 @@ struct CORE_EXPORT BlinkCloneableMessage {
BlinkCloneableMessage(); BlinkCloneableMessage();
~BlinkCloneableMessage(); ~BlinkCloneableMessage();
BlinkCloneableMessage(BlinkCloneableMessage&&);
BlinkCloneableMessage& operator=(BlinkCloneableMessage&&);
scoped_refptr<blink::SerializedScriptValue> message; scoped_refptr<blink::SerializedScriptValue> message;
private:
DISALLOW_COPY_AND_ASSIGN(BlinkCloneableMessage);
}; };
} // namespace blink } // namespace blink
......
...@@ -9,4 +9,9 @@ namespace blink { ...@@ -9,4 +9,9 @@ namespace blink {
BlinkTransferableMessage::BlinkTransferableMessage() = default; BlinkTransferableMessage::BlinkTransferableMessage() = default;
BlinkTransferableMessage::~BlinkTransferableMessage() = default; BlinkTransferableMessage::~BlinkTransferableMessage() = default;
BlinkTransferableMessage::BlinkTransferableMessage(BlinkTransferableMessage&&) =
default;
BlinkTransferableMessage& BlinkTransferableMessage::operator=(
BlinkTransferableMessage&&) = default;
} // namespace blink } // namespace blink
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#ifndef BlinkTransferableMessage_h #ifndef BlinkTransferableMessage_h
#define BlinkTransferableMessage_h #define BlinkTransferableMessage_h
#include "base/macros.h"
#include "bindings/core/v8/serialization/SerializedScriptValue.h" #include "bindings/core/v8/serialization/SerializedScriptValue.h"
#include "core/CoreExport.h" #include "core/CoreExport.h"
#include "core/dom/BlinkCloneableMessage.h" #include "core/dom/BlinkCloneableMessage.h"
...@@ -20,7 +21,13 @@ struct CORE_EXPORT BlinkTransferableMessage : BlinkCloneableMessage { ...@@ -20,7 +21,13 @@ struct CORE_EXPORT BlinkTransferableMessage : BlinkCloneableMessage {
BlinkTransferableMessage(); BlinkTransferableMessage();
~BlinkTransferableMessage(); ~BlinkTransferableMessage();
BlinkTransferableMessage(BlinkTransferableMessage&&);
BlinkTransferableMessage& operator=(BlinkTransferableMessage&&);
Vector<MessagePortChannel> ports; Vector<MessagePortChannel> ports;
private:
DISALLOW_COPY_AND_ASSIGN(BlinkTransferableMessage);
}; };
} // namespace blink } // namespace blink
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <vector> #include <vector>
#include "base/containers/span.h" #include "base/containers/span.h"
#include "base/macros.h"
#include "mojo/public/cpp/bindings/struct_ptr.h" #include "mojo/public/cpp/bindings/struct_ptr.h"
#include "third_party/WebKit/common/common_export.h" #include "third_party/WebKit/common/common_export.h"
...@@ -38,6 +39,9 @@ struct BLINK_COMMON_EXPORT CloneableMessage { ...@@ -38,6 +39,9 @@ struct BLINK_COMMON_EXPORT CloneableMessage {
// Blob handles for any blobs being sent in this message. // Blob handles for any blobs being sent in this message.
std::vector<mojo::StructPtr<mojom::SerializedBlob>> blobs; std::vector<mojo::StructPtr<mojom::SerializedBlob>> blobs;
private:
DISALLOW_COPY_AND_ASSIGN(CloneableMessage);
}; };
} // namespace blink } // namespace blink
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <vector> #include <vector>
#include "base/containers/span.h" #include "base/containers/span.h"
#include "base/macros.h"
#include "third_party/WebKit/common/common_export.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/cloneable_message.h"
#include "third_party/WebKit/common/message_port/message_port_channel.h" #include "third_party/WebKit/common/message_port/message_port_channel.h"
...@@ -24,6 +25,9 @@ struct BLINK_COMMON_EXPORT TransferableMessage : public CloneableMessage { ...@@ -24,6 +25,9 @@ struct BLINK_COMMON_EXPORT TransferableMessage : public CloneableMessage {
// Any ports being transfered as part of this message. // Any ports being transfered as part of this message.
std::vector<MessagePortChannel> ports; std::vector<MessagePortChannel> ports;
private:
DISALLOW_COPY_AND_ASSIGN(TransferableMessage);
}; };
} // namespace blink } // 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