Index: mojo/system/message_in_transit.cc |
diff --git a/mojo/system/message_in_transit.cc b/mojo/system/message_in_transit.cc |
index 944e12b19ae68b8613e30bb1020dc51f4915ff2e..5ac07547aac9c0c67336741dcb65b082a1808658 100644 |
--- a/mojo/system/message_in_transit.cc |
+++ b/mojo/system/message_in_transit.cc |
@@ -92,19 +92,7 @@ MessageInTransit::MessageInTransit(Type type, |
: main_buffer_size_(RoundUpMessageAlignment(sizeof(Header) + num_bytes)), |
main_buffer_(static_cast<char*>(base::AlignedAlloc(main_buffer_size_, |
kMessageAlignment))) { |
- DCHECK_LE(num_bytes, kMaxMessageNumBytes); |
- |
- // |total_size| is updated below, from the other values. |
- header()->type = type; |
- header()->subtype = subtype; |
- header()->source_id = kInvalidEndpointId; |
- header()->destination_id = kInvalidEndpointId; |
- header()->num_bytes = num_bytes; |
- header()->unused = 0; |
- // Note: If dispatchers are subsequently attached, then |total_size| will have |
- // to be adjusted. |
- UpdateTotalSize(); |
- |
+ ConstructorHelper(type, subtype, num_bytes); |
if (bytes) { |
memcpy(MessageInTransit::bytes(), bytes, num_bytes); |
memset(static_cast<char*>(MessageInTransit::bytes()) + num_bytes, 0, |
@@ -114,6 +102,17 @@ MessageInTransit::MessageInTransit(Type type, |
} |
} |
+MessageInTransit::MessageInTransit(Type type, |
+ Subtype subtype, |
+ uint32_t num_bytes, |
+ UserPointer<const void> bytes) |
+ : main_buffer_size_(RoundUpMessageAlignment(sizeof(Header) + num_bytes)), |
+ main_buffer_(static_cast<char*>(base::AlignedAlloc(main_buffer_size_, |
+ kMessageAlignment))) { |
+ ConstructorHelper(type, subtype, num_bytes); |
+ bytes.GetArray(MessageInTransit::bytes(), num_bytes); |
+} |
+ |
MessageInTransit::MessageInTransit(const View& message_view) |
: main_buffer_size_(message_view.main_buffer_size()), |
main_buffer_(static_cast<char*>(base::AlignedAlloc(main_buffer_size_, |
@@ -193,6 +192,23 @@ void MessageInTransit::SerializeAndCloseDispatchers(Channel* channel) { |
UpdateTotalSize(); |
} |
+void MessageInTransit::ConstructorHelper(Type type, |
+ Subtype subtype, |
+ uint32_t num_bytes) { |
+ DCHECK_LE(num_bytes, kMaxMessageNumBytes); |
+ |
+ // |total_size| is updated below, from the other values. |
+ header()->type = type; |
+ header()->subtype = subtype; |
+ header()->source_id = kInvalidEndpointId; |
+ header()->destination_id = kInvalidEndpointId; |
+ header()->num_bytes = num_bytes; |
+ header()->unused = 0; |
+ // Note: If dispatchers are subsequently attached, then |total_size| will have |
+ // to be adjusted. |
+ UpdateTotalSize(); |
+} |
+ |
void MessageInTransit::UpdateTotalSize() { |
DCHECK_EQ(main_buffer_size_ % kMessageAlignment, 0u); |
header()->total_size = static_cast<uint32_t>(main_buffer_size_); |