Chromium Code Reviews| 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 | 9 |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 48 uint32_t num_bytes, | 48 uint32_t num_bytes, |
| 49 uint32_t num_handles); | 49 uint32_t num_handles); |
| 50 | 50 |
| 51 // Destroys a |MessageInTransit| created using |Create()|. | 51 // Destroys a |MessageInTransit| created using |Create()|. |
| 52 void Destroy(); | 52 void Destroy(); |
| 53 | 53 |
| 54 // Gets the size of the data (in number of bytes). This is the full size of | 54 // Gets the size of the data (in number of bytes). This is the full size of |
| 55 // the data that follows the header, and may include data other than the | 55 // the data that follows the header, and may include data other than the |
| 56 // message data. (See also |num_bytes()|.) | 56 // message data. (See also |num_bytes()|.) |
| 57 uint32_t data_size() const { | 57 uint32_t data_size() const { |
| 58 return data_size_; | 58 return header()->data_size; |
| 59 } | 59 } |
| 60 | 60 |
| 61 // Gets the data (of size |data_size()| bytes). | 61 // Gets the data (of size |data_size()| bytes). |
| 62 const void* data() const { | 62 const void* data() const { |
| 63 return reinterpret_cast<const char*>(this) + sizeof(*this); | 63 return reinterpret_cast<const char*>(this) + sizeof(*this); |
| 64 } | 64 } |
| 65 | 65 |
| 66 // Gets the size of the message data. | 66 // Gets the size of the message data. |
| 67 uint32_t num_bytes() const { | 67 uint32_t num_bytes() const { |
| 68 return num_bytes_; | 68 return header()->num_bytes; |
| 69 } | 69 } |
| 70 | 70 |
| 71 // Gets the message data (of size |num_bytes()| bytes). | 71 // Gets the message data (of size |num_bytes()| bytes). |
| 72 const void* bytes() const { | 72 const void* bytes() const { |
| 73 return reinterpret_cast<const char*>(this) + sizeof(*this); | 73 return reinterpret_cast<const char*>(this) + sizeof(*this); |
| 74 } | 74 } |
| 75 | 75 |
| 76 uint32_t num_handles() const { | 76 uint32_t num_handles() const { |
| 77 return num_handles_; | 77 return header()->num_handles; |
| 78 } | 78 } |
| 79 | 79 |
| 80 size_t size_with_header_and_padding() const { | 80 size_t size_with_header_and_padding() const { |
| 81 return RoundUpMessageAlignment(sizeof(*this) + data_size_); | 81 return RoundUpMessageAlignment(sizeof(*this) + header()->data_size); |
| 82 } | 82 } |
| 83 | 83 |
| 84 Type type() const { return type_; } | 84 Type type() const { return header()->type; } |
| 85 Subtype subtype() const { return subtype_; } | 85 Subtype subtype() const { return header()->subtype; } |
| 86 EndpointId source_id() const { return source_id_; } | 86 EndpointId source_id() const { return header()->source_id; } |
| 87 EndpointId destination_id() const { return destination_id_; } | 87 EndpointId destination_id() const { return header()->destination_id; } |
| 88 | 88 |
| 89 void set_source_id(EndpointId source_id) { source_id_ = source_id; } | 89 void set_source_id(EndpointId source_id) { header()->source_id = source_id; } |
| 90 void set_destination_id(EndpointId destination_id) { | 90 void set_destination_id(EndpointId destination_id) { |
| 91 destination_id_ = destination_id; | 91 header()->destination_id = destination_id; |
| 92 } | 92 } |
| 93 | 93 |
| 94 // TODO(vtl): Add whatever's necessary to transport handles. | 94 // TODO(vtl): Add whatever's necessary to transport handles. |
| 95 | 95 |
| 96 // Rounds |n| up to a multiple of |kMessageAlignment|. | 96 // Rounds |n| up to a multiple of |kMessageAlignment|. |
| 97 static inline size_t RoundUpMessageAlignment(size_t n) { | 97 static inline size_t RoundUpMessageAlignment(size_t n) { |
| 98 return (n + kMessageAlignment - 1) & ~(kMessageAlignment - 1); | 98 return (n + kMessageAlignment - 1) & ~(kMessageAlignment - 1); |
| 99 } | 99 } |
| 100 | 100 |
| 101 private: | 101 private: |
| 102 // "Header" for the data. Must be a multiple of |kMessageAlignment| bytes in | |
| 103 // size. | |
| 104 struct Header { | |
| 105 Header(uint32_t data_size, Type type, Subtype subtype, EndpointId source_id, | |
|
yzshen1
2014/02/19 18:35:06
I think we need to do each parameter on a separate
| |
| 106 EndpointId destination_id, uint32_t num_bytes, uint32_t num_handles) | |
| 107 : data_size(data_size), type(type), subtype(subtype), | |
| 108 source_id(source_id), destination_id(destination_id), | |
| 109 num_bytes(num_bytes), num_handles(num_handles), reserved0(0), | |
| 110 reserved1(0) {} | |
| 111 | |
| 112 // Total size of data following the "header". | |
| 113 uint32_t data_size; | |
| 114 Type type; | |
| 115 Subtype subtype; | |
| 116 EndpointId source_id; | |
| 117 EndpointId destination_id; | |
| 118 // Size of actual message data. | |
| 119 uint32_t num_bytes; | |
| 120 // Number of handles "attached". | |
| 121 uint32_t num_handles; | |
| 122 // To be used soon. | |
| 123 uint32_t reserved0; | |
| 124 uint32_t reserved1; | |
| 125 }; | |
| 126 | |
| 102 MessageInTransit(uint32_t data_size, | 127 MessageInTransit(uint32_t data_size, |
| 103 Type type, | 128 Type type, |
| 104 Subtype subtype, | 129 Subtype subtype, |
| 105 uint32_t num_bytes, | 130 uint32_t num_bytes, |
| 106 uint32_t num_handles); | 131 uint32_t num_handles); |
| 107 | 132 |
| 108 // "Header" for the data. Must be a multiple of |kMessageAlignment| bytes in | 133 const Header* header() const { return &header_; } |
| 109 // size. | 134 Header* header() { return &header_; } |
| 110 // Total size of data following the "header". | 135 |
| 111 uint32_t data_size_; | 136 Header header_; |
| 112 Type type_; | |
| 113 Subtype subtype_; | |
| 114 EndpointId source_id_; | |
| 115 EndpointId destination_id_; | |
| 116 // Size of actual message data. | |
| 117 uint32_t num_bytes_; | |
| 118 // Number of handles "attached". | |
| 119 uint32_t num_handles_; | |
| 120 // To be used soon. | |
| 121 uint32_t reserved0_; | |
| 122 uint32_t reserved1_; | |
| 123 | 137 |
| 124 // Intentionally unimplemented (and private): Use |Destroy()| instead (which | 138 // Intentionally unimplemented (and private): Use |Destroy()| instead (which |
| 125 // simply frees the memory). | 139 // simply frees the memory). |
| 126 ~MessageInTransit(); | 140 ~MessageInTransit(); |
| 127 | 141 |
| 128 DISALLOW_COPY_AND_ASSIGN(MessageInTransit); | 142 DISALLOW_COPY_AND_ASSIGN(MessageInTransit); |
| 129 }; | 143 }; |
| 130 | 144 |
| 131 // The size of |MessageInTransit| must be appropriate to maintain alignment of | 145 // The size of |MessageInTransit| must be appropriate to maintain alignment of |
| 132 // the following data. | 146 // the following data. |
| 133 COMPILE_ASSERT(sizeof(MessageInTransit) % MessageInTransit::kMessageAlignment == | 147 COMPILE_ASSERT(sizeof(MessageInTransit) % MessageInTransit::kMessageAlignment == |
| 134 0, MessageInTransit_has_wrong_size); | 148 0, MessageInTransit_has_wrong_size); |
| 135 | 149 |
| 136 } // namespace system | 150 } // namespace system |
| 137 } // namespace mojo | 151 } // namespace mojo |
| 138 | 152 |
| 139 #endif // MOJO_SYSTEM_MESSAGE_IN_TRANSIT_H_ | 153 #endif // MOJO_SYSTEM_MESSAGE_IN_TRANSIT_H_ |
| OLD | NEW |