| 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_EDK_SYSTEM_MESSAGE_IN_TRANSIT_H_ | 5 #ifndef MOJO_EDK_SYSTEM_MESSAGE_IN_TRANSIT_H_ |
| 6 #define MOJO_EDK_SYSTEM_MESSAGE_IN_TRANSIT_H_ | 6 #define MOJO_EDK_SYSTEM_MESSAGE_IN_TRANSIT_H_ |
| 7 | 7 |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 | 10 |
| 11 #include <memory> | 11 #include <memory> |
| 12 #include <ostream> | 12 #include <ostream> |
| 13 #include <vector> | 13 #include <vector> |
| 14 | 14 |
| 15 #include "base/memory/aligned_memory.h" | 15 #include "base/memory/aligned_memory.h" |
| 16 #include "mojo/edk/system/channel_endpoint_id.h" | 16 #include "mojo/edk/system/channel_endpoint_id.h" |
| 17 #include "mojo/edk/system/dispatcher.h" | 17 #include "mojo/edk/system/dispatcher.h" |
| 18 #include "mojo/edk/system/memory.h" | 18 #include "mojo/edk/system/memory.h" |
| 19 #include "mojo/edk/system/system_impl_export.h" | |
| 20 #include "mojo/public/cpp/system/macros.h" | 19 #include "mojo/public/cpp/system/macros.h" |
| 21 | 20 |
| 22 namespace mojo { | 21 namespace mojo { |
| 23 namespace system { | 22 namespace system { |
| 24 | 23 |
| 25 class Channel; | 24 class Channel; |
| 26 class TransportData; | 25 class TransportData; |
| 27 | 26 |
| 28 // This class is used to represent data in transit. It is thread-unsafe. | 27 // This class is used to represent data in transit. It is thread-unsafe. |
| 29 // | 28 // |
| 30 // |MessageInTransit| buffers: | 29 // |MessageInTransit| buffers: |
| 31 // | 30 // |
| 32 // A |MessageInTransit| can be serialized by writing the main buffer and then, | 31 // A |MessageInTransit| can be serialized by writing the main buffer and then, |
| 33 // if it has one, the transport data buffer. Both buffers are | 32 // if it has one, the transport data buffer. Both buffers are |
| 34 // |kMessageAlignment|-byte aligned and a multiple of |kMessageAlignment| bytes | 33 // |kMessageAlignment|-byte aligned and a multiple of |kMessageAlignment| bytes |
| 35 // in size. | 34 // in size. |
| 36 // | 35 // |
| 37 // The main buffer consists of the header (of type |Header|, which is an | 36 // The main buffer consists of the header (of type |Header|, which is an |
| 38 // internal detail of this class) followed immediately by the message data | 37 // internal detail of this class) followed immediately by the message data |
| 39 // (accessed by |bytes()| and of size |num_bytes()|, and also | 38 // (accessed by |bytes()| and of size |num_bytes()|, and also |
| 40 // |kMessageAlignment|-byte aligned), and then any padding needed to make the | 39 // |kMessageAlignment|-byte aligned), and then any padding needed to make the |
| 41 // main buffer a multiple of |kMessageAlignment| bytes in size. | 40 // main buffer a multiple of |kMessageAlignment| bytes in size. |
| 42 // | 41 // |
| 43 // See |TransportData| for a description of the (serialized) transport data | 42 // See |TransportData| for a description of the (serialized) transport data |
| 44 // buffer. | 43 // buffer. |
| 45 class MOJO_SYSTEM_IMPL_EXPORT MessageInTransit { | 44 class MessageInTransit { |
| 46 public: | 45 public: |
| 47 enum class Type : uint16_t { | 46 enum class Type : uint16_t { |
| 48 // Messages that are forwarded to endpoint clients. | 47 // Messages that are forwarded to endpoint clients. |
| 49 ENDPOINT_CLIENT = 0, | 48 ENDPOINT_CLIENT = 0, |
| 50 // Messages that are consumed by the |ChannelEndpoint|. | 49 // Messages that are consumed by the |ChannelEndpoint|. |
| 51 ENDPOINT = 1, | 50 ENDPOINT = 1, |
| 52 // Messages that are consumed by the |Channel|. | 51 // Messages that are consumed by the |Channel|. |
| 53 CHANNEL = 2, | 52 CHANNEL = 2, |
| 54 // Messages that are consumed by the |RawChannel| (implementation). | 53 // Messages that are consumed by the |RawChannel| (implementation). |
| 55 RAW_CHANNEL = 3, | 54 RAW_CHANNEL = 3, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 // Messages (the header and data) must always be aligned to a multiple of this | 94 // Messages (the header and data) must always be aligned to a multiple of this |
| 96 // quantity (which must be a power of 2). | 95 // quantity (which must be a power of 2). |
| 97 static const size_t kMessageAlignment = 8; | 96 static const size_t kMessageAlignment = 8; |
| 98 | 97 |
| 99 // Forward-declare |Header| so that |View| can use it: | 98 // Forward-declare |Header| so that |View| can use it: |
| 100 private: | 99 private: |
| 101 struct Header; | 100 struct Header; |
| 102 | 101 |
| 103 public: | 102 public: |
| 104 // This represents a view of serialized message data in a raw buffer. | 103 // This represents a view of serialized message data in a raw buffer. |
| 105 class MOJO_SYSTEM_IMPL_EXPORT View { | 104 class View { |
| 106 public: | 105 public: |
| 107 // Constructs a view from the given buffer of the given size. (The size must | 106 // Constructs a view from the given buffer of the given size. (The size must |
| 108 // be as provided by |MessageInTransit::GetNextMessageSize()|.) The buffer | 107 // be as provided by |MessageInTransit::GetNextMessageSize()|.) The buffer |
| 109 // must remain alive/unmodified through the lifetime of this object. | 108 // must remain alive/unmodified through the lifetime of this object. |
| 110 // |buffer| should be |kMessageAlignment|-byte aligned. | 109 // |buffer| should be |kMessageAlignment|-byte aligned. |
| 111 View(size_t message_size, const void* buffer); | 110 View(size_t message_size, const void* buffer); |
| 112 | 111 |
| 113 // Checks that the given |View| appears to be for a valid message, within | 112 // Checks that the given |View| appears to be for a valid message, within |
| 114 // predetermined limits (e.g., |num_bytes()| and |main_buffer_size()|, that | 113 // predetermined limits (e.g., |num_bytes()| and |main_buffer_size()|, that |
| 115 // |transport_data_buffer()|/|transport_data_buffer_size()| is for valid | 114 // |transport_data_buffer()|/|transport_data_buffer_size()| is for valid |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 // Any dispatchers that may be attached to this message. These dispatchers | 283 // Any dispatchers that may be attached to this message. These dispatchers |
| 285 // should be "owned" by this message, i.e., have a ref count of exactly 1. (We | 284 // should be "owned" by this message, i.e., have a ref count of exactly 1. (We |
| 286 // allow a dispatcher entry to be null, in case it couldn't be duplicated for | 285 // allow a dispatcher entry to be null, in case it couldn't be duplicated for |
| 287 // some reason.) | 286 // some reason.) |
| 288 std::unique_ptr<DispatcherVector> dispatchers_; | 287 std::unique_ptr<DispatcherVector> dispatchers_; |
| 289 | 288 |
| 290 MOJO_DISALLOW_COPY_AND_ASSIGN(MessageInTransit); | 289 MOJO_DISALLOW_COPY_AND_ASSIGN(MessageInTransit); |
| 291 }; | 290 }; |
| 292 | 291 |
| 293 // So logging macros and |DCHECK_EQ()|, etc. work. | 292 // So logging macros and |DCHECK_EQ()|, etc. work. |
| 294 MOJO_SYSTEM_IMPL_EXPORT inline std::ostream& operator<<( | 293 inline std::ostream& operator<<(std::ostream& out, |
| 295 std::ostream& out, | 294 MessageInTransit::Type type) { |
| 296 MessageInTransit::Type type) { | |
| 297 return out << static_cast<uint16_t>(type); | 295 return out << static_cast<uint16_t>(type); |
| 298 } | 296 } |
| 299 | 297 |
| 300 // So logging macros and |DCHECK_EQ()|, etc. work. | 298 // So logging macros and |DCHECK_EQ()|, etc. work. |
| 301 MOJO_SYSTEM_IMPL_EXPORT inline std::ostream& operator<<( | 299 inline std::ostream& operator<<(std::ostream& out, |
| 302 std::ostream& out, | 300 MessageInTransit::Subtype subtype) { |
| 303 MessageInTransit::Subtype subtype) { | |
| 304 return out << static_cast<uint16_t>(subtype); | 301 return out << static_cast<uint16_t>(subtype); |
| 305 } | 302 } |
| 306 | 303 |
| 307 } // namespace system | 304 } // namespace system |
| 308 } // namespace mojo | 305 } // namespace mojo |
| 309 | 306 |
| 310 #endif // MOJO_EDK_SYSTEM_MESSAGE_IN_TRANSIT_H_ | 307 #endif // MOJO_EDK_SYSTEM_MESSAGE_IN_TRANSIT_H_ |
| OLD | NEW |