| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef MOJO_SYSTEM_MESSAGE_IN_TRANSIT_H_ | 5 #ifndef MOJO_SYSTEM_MESSAGE_IN_TRANSIT_H_ |
| 6 #define MOJO_SYSTEM_MESSAGE_IN_TRANSIT_H_ | 6 #define MOJO_SYSTEM_MESSAGE_IN_TRANSIT_H_ |
| 7 | 7 |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 #include <stdlib.h> // For |free()|. | 9 #include <stdlib.h> // For |free()|. |
| 10 | 10 |
| 11 #include "base/basictypes.h" | 11 #include "base/basictypes.h" |
| 12 #include "mojo/public/system/system_export.h" | 12 #include "mojo/public/system/system_export.h" |
| 13 | 13 |
| 14 namespace mojo { | 14 namespace mojo { |
| 15 namespace system { | 15 namespace system { |
| 16 | 16 |
| 17 // This class is used to represent data in transit. It is thread-unsafe. | 17 // This class is used to represent data in transit. It is thread-unsafe. |
| 18 // Note: This class is POD. | 18 // Note: This class is POD. |
| 19 class MOJO_SYSTEM_EXPORT MessageInTransit { | 19 class MOJO_SYSTEM_EXPORT MessageInTransit { |
| 20 public: | 20 public: |
| 21 // Creates a |MessageInTransit| with the data given by |bytes|/|num_bytes|. | 21 typedef uint16_t Type; |
| 22 static MessageInTransit* Create(const void* bytes, uint32_t num_bytes); | 22 // Messages that are forwarded to |MessagePipeEndpoint|s. |
| 23 static const Type kTypeMessagePipeEndpoint = 0; |
| 24 // Messages that are forwarded to |MessagePipe|s. |
| 25 static const Type kTypeMessagePipe = 1; |
| 26 // Messages that are consumed by the channel. |
| 27 static const Type TYPE_CHANNEL = 2; |
| 28 |
| 29 typedef uint16_t Subtype; |
| 30 // Subtypes for type |kTypeMessagePipeEndpoint|: |
| 31 static const Subtype kSubtypeMessagePipeEndpointData = 0; |
| 32 // Subtypes for type |kTypeMessagePipe|: |
| 33 static const Subtype kSubtypeMessagePipePeerClosed = 0; |
| 34 |
| 35 typedef uint32_t EndpointId; |
| 36 // Never a valid endpoint ID. |
| 37 static const EndpointId kInvalidEndpointId = 0; |
| 38 |
| 39 // Messages (the header and data) must always be aligned to a multiple of this |
| 40 // quantity (which must be a power of 2). |
| 41 static const size_t kMessageAlignment = 8; |
| 42 |
| 43 // Creates a |MessageInTransit| of the given |type| and |subtype|, with the |
| 44 // data given by |bytes|/|num_bytes|. |
| 45 static MessageInTransit* Create(Type type, Subtype subtype, |
| 46 const void* bytes, uint32_t num_bytes); |
| 23 | 47 |
| 24 // Destroys a |MessageInTransit| created using |Create()|. | 48 // Destroys a |MessageInTransit| created using |Create()|. |
| 25 inline void Destroy() { | 49 inline void Destroy() { |
| 26 // No need to call the destructor, since we're POD. | 50 // No need to call the destructor, since we're POD. |
| 27 free(this); | 51 free(this); |
| 28 } | 52 } |
| 29 | 53 |
| 30 // Gets the size of the data (in number of bytes). | 54 // Gets the size of the data (in number of bytes). |
| 31 uint32_t data_size() const { | 55 uint32_t data_size() const { |
| 32 return size_; | 56 return size_; |
| 33 } | 57 } |
| 34 | 58 |
| 35 // Gets the data (of size |size()| bytes). | 59 // Gets the data (of size |size()| bytes). |
| 36 const void* data() const { | 60 const void* data() const { |
| 37 return reinterpret_cast<const char*>(this) + sizeof(*this); | 61 return reinterpret_cast<const char*>(this) + sizeof(*this); |
| 38 } | 62 } |
| 39 | 63 |
| 40 size_t size_with_header_and_padding() const { | 64 size_t size_with_header_and_padding() const { |
| 41 return RoundUpMessageAlignment(sizeof(*this) + size_); | 65 return RoundUpMessageAlignment(sizeof(*this) + size_); |
| 42 } | 66 } |
| 43 | 67 |
| 68 Type type() const { return type_; } |
| 69 Subtype subtype() const { return subtype_; } |
| 70 EndpointId source_id() const { return source_id_; } |
| 71 EndpointId destination_id() const { return destination_id_; } |
| 72 |
| 73 void set_source_id(EndpointId source_id) { source_id_ = source_id; } |
| 74 void set_destination_id(EndpointId destination_id) { |
| 75 destination_id_ = destination_id; |
| 76 } |
| 77 |
| 44 // TODO(vtl): Add whatever's necessary to transport handles. | 78 // TODO(vtl): Add whatever's necessary to transport handles. |
| 45 | 79 |
| 46 // Messages (the header and data) must always be aligned to a multiple of this | |
| 47 // quantity (which must be a power of 2). | |
| 48 static const size_t kMessageAlignment = 8; | |
| 49 | |
| 50 // Rounds |n| up to a multiple of |kMessageAlignment|. | 80 // Rounds |n| up to a multiple of |kMessageAlignment|. |
| 51 static inline size_t RoundUpMessageAlignment(size_t n) { | 81 static inline size_t RoundUpMessageAlignment(size_t n) { |
| 52 return (n + kMessageAlignment - 1) & ~(kMessageAlignment - 1); | 82 return (n + kMessageAlignment - 1) & ~(kMessageAlignment - 1); |
| 53 } | 83 } |
| 54 | 84 |
| 55 private: | 85 private: |
| 56 explicit MessageInTransit(uint32_t size) | 86 explicit MessageInTransit(uint32_t size, Type type, Subtype subtype) |
| 57 : size_(size), reserved_(0), user_1_(0), user_2_(0) {} | 87 : size_(size), |
| 88 type_(type), |
| 89 subtype_(subtype), |
| 90 source_id_(kInvalidEndpointId), |
| 91 destination_id_(kInvalidEndpointId) {} |
| 58 | 92 |
| 59 // "Header" for the data. | 93 // "Header" for the data. |
| 60 uint32_t size_; | 94 uint32_t size_; |
| 61 uint32_t reserved_; | 95 Type type_; |
| 62 uint32_t user_1_; | 96 Subtype subtype_; |
| 63 uint32_t user_2_; | 97 EndpointId source_id_; |
| 98 EndpointId destination_id_; |
| 64 | 99 |
| 65 // Intentionally unimplemented (and private): Use |Destroy()| instead (which | 100 // Intentionally unimplemented (and private): Use |Destroy()| instead (which |
| 66 // simply frees the memory). | 101 // simply frees the memory). |
| 67 ~MessageInTransit(); | 102 ~MessageInTransit(); |
| 68 | 103 |
| 69 DISALLOW_COPY_AND_ASSIGN(MessageInTransit); | 104 DISALLOW_COPY_AND_ASSIGN(MessageInTransit); |
| 70 }; | 105 }; |
| 71 | 106 |
| 72 // The size of |MessageInTransit| must be appropriate to maintain alignment of | 107 // The size of |MessageInTransit| must be appropriate to maintain alignment of |
| 73 // the following data. | 108 // the following data. |
| 74 COMPILE_ASSERT(sizeof(MessageInTransit) == 16, MessageInTransit_has_wrong_size); | 109 COMPILE_ASSERT(sizeof(MessageInTransit) == 16, MessageInTransit_has_wrong_size); |
| 75 | 110 |
| 76 } // namespace system | 111 } // namespace system |
| 77 } // namespace mojo | 112 } // namespace mojo |
| 78 | 113 |
| 79 #endif // MOJO_SYSTEM_MESSAGE_IN_TRANSIT_H_ | 114 #endif // MOJO_SYSTEM_MESSAGE_IN_TRANSIT_H_ |
| OLD | NEW |