Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / mojo / system / message_in_transit.cc
index 0d3b92a..42b85ff 100644 (file)
@@ -4,14 +4,13 @@
 
 #include "mojo/system/message_in_transit.h"
 
-#include <stdlib.h>
 #include <string.h>
 
 #include <new>
 
-#include "base/basictypes.h"
 #include "base/compiler_specific.h"
 #include "base/logging.h"
+#include "base/memory/aligned_memory.h"
 #include "mojo/system/constants.h"
 
 namespace mojo {
@@ -23,16 +22,16 @@ COMPILE_ASSERT(static_cast<uint64_t>(sizeof(MessageInTransit)) +
                    kMaxMessageNumBytes <= 0x7fffffff,
                kMaxMessageNumBytes_too_big);
 
-COMPILE_ASSERT(sizeof(MessageInTransit) %
-                   MessageInTransit::kMessageAlignment == 0,
-               sizeof_MessageInTransit_not_a_multiple_of_alignment);
+COMPILE_ASSERT(
+    sizeof(MessageInTransit) % MessageInTransit::kMessageAlignment == 0,
+    sizeof_MessageInTransit_not_a_multiple_of_alignment);
 
 STATIC_CONST_MEMBER_DEFINITION const MessageInTransit::Type
     MessageInTransit::kTypeMessagePipeEndpoint;
 STATIC_CONST_MEMBER_DEFINITION const MessageInTransit::Type
     MessageInTransit::kTypeMessagePipe;
 STATIC_CONST_MEMBER_DEFINITION const MessageInTransit::Type
-    MessageInTransit::TYPE_CHANNEL;
+    MessageInTransit::kTypeChannel;
 STATIC_CONST_MEMBER_DEFINITION const MessageInTransit::Subtype
     MessageInTransit::kSubtypeMessagePipeEndpointData;
 STATIC_CONST_MEMBER_DEFINITION const MessageInTransit::Subtype
@@ -45,24 +44,49 @@ STATIC_CONST_MEMBER_DEFINITION const size_t MessageInTransit::kMessageAlignment;
 MessageInTransit* MessageInTransit::Create(Type type,
                                            Subtype subtype,
                                            const void* bytes,
-                                           uint32_t num_bytes) {
-  const size_t size_with_header = sizeof(MessageInTransit) + num_bytes;
+                                           uint32_t num_bytes,
+                                           uint32_t num_handles) {
+  DCHECK_LE(num_bytes, kMaxMessageNumBytes);
+  DCHECK_LE(num_handles, kMaxMessageNumHandles);
+
+  const size_t data_size = num_bytes;
+  const size_t size_with_header = sizeof(MessageInTransit) + data_size;
   const size_t size_with_header_and_padding =
       RoundUpMessageAlignment(size_with_header);
 
-  char* buffer = static_cast<char*>(malloc(size_with_header_and_padding));
-  DCHECK_EQ(reinterpret_cast<size_t>(buffer) %
-                MessageInTransit::kMessageAlignment, 0u);
-
+  char* buffer = static_cast<char*>(
+      base::AlignedAlloc(size_with_header_and_padding, kMessageAlignment));
   // The buffer consists of the header (a |MessageInTransit|, constructed using
   // a placement new), followed by the data, followed by padding (of zeros).
-  MessageInTransit* rv =
-      new (buffer) MessageInTransit(num_bytes, type, subtype);
+  MessageInTransit* rv = new (buffer) MessageInTransit(
+      static_cast<uint32_t>(data_size), type, subtype, num_bytes, num_handles);
   memcpy(buffer + sizeof(MessageInTransit), bytes, num_bytes);
   memset(buffer + size_with_header, 0,
          size_with_header_and_padding - size_with_header);
   return rv;
 }
 
+void MessageInTransit::Destroy() {
+  // No need to call the destructor, since we're POD.
+  base::AlignedFree(this);
+}
+
+MessageInTransit::MessageInTransit(uint32_t data_size,
+                                   Type type,
+                                   Subtype subtype,
+                                   uint32_t num_bytes,
+                                   uint32_t num_handles)
+    : data_size_(data_size),
+      type_(type),
+      subtype_(subtype),
+      source_id_(kInvalidEndpointId),
+      destination_id_(kInvalidEndpointId),
+      num_bytes_(num_bytes),
+      num_handles_(num_handles),
+      reserved0_(0),
+      reserved1_(0) {
+  DCHECK_GE(data_size_, num_bytes_);
+}
+
 }  // namespace system
 }  // namespace mojo