Index: mojo/edk/system/channel.h |
diff --git a/mojo/edk/system/channel.h b/mojo/edk/system/channel.h |
index aa6d70c3a2cfa5920ff41f0bc0e71fd9b70d99a3..b8685077d994dc7038d0d1b943ee530520e31113 100644 |
--- a/mojo/edk/system/channel.h |
+++ b/mojo/edk/system/channel.h |
@@ -21,7 +21,8 @@ const size_t kChannelMessageAlignment = 8; |
// Channel provides a thread-safe interface to read and write arbitrary |
// delimited messages over an underlying I/O channel, optionally transferring |
// one or more platform handles in the process. |
-class Channel : public base::RefCountedThreadSafe<Channel> { |
+class MOJO_SYSTEM_IMPL_EXPORT Channel |
+ : public base::RefCountedThreadSafe<Channel> { |
public: |
struct Message; |
@@ -29,42 +30,53 @@ class Channel : public base::RefCountedThreadSafe<Channel> { |
// A message to be written to a channel. |
struct Message { |
Ken Rockot(use gerrit already)
2017/02/23 22:07:05
You also need an EXPORT macro on the nested types
Jay Civelli
2017/02/27 17:07:03
Yes, that's the only other one used in the test I
|
-#pragma pack(push, 1) |
- struct Header { |
- enum class MessageType : uint16_t { |
- // A normal message. |
- NORMAL = 0, |
+ enum class MessageType : uint16_t { |
+ // A normal message. |
Ken Rockot(use gerrit already)
2017/02/23 22:07:05
nit: update comment?
Jay Civelli
2017/02/27 17:07:03
Done.
|
+ NORMAL_LEGACY = 0, |
#if defined(OS_MACOSX) |
- // A control message containing handles to echo back. |
- HANDLES_SENT, |
- // A control message containing handles that can now be closed. |
- HANDLES_SENT_ACK, |
+ // A control message containing handles to echo back. |
+ HANDLES_SENT, |
+ // A control message containing handles that can now be closed. |
+ HANDLES_SENT_ACK, |
#endif |
- }; |
+ NORMAL_VERSIONED, |
Ken Rockot(use gerrit already)
2017/02/23 22:07:05
nit: NORMAL is probably fine if we call the old on
Jay Civelli
2017/02/27 17:07:03
Done.
|
+ }; |
+#pragma pack(push, 1) |
+ // Old message wire format for ChromeOS and Android, used by NORMAL_LEGACY |
+ // messages. |
+ // TODO: Remove once Arc++ uses versioned messages. |
+ struct LegacyHeader { |
// Message size in bytes, including the header. |
uint32_t num_bytes; |
-#if defined(MOJO_EDK_LEGACY_PROTOCOL) |
- // Old message wire format for ChromeOS and Android. |
// Number of attached handles. |
uint16_t num_handles; |
MessageType message_type; |
-#else |
+ }; |
+ |
+ // Header used by NORMAL_VERSIONED messages. |
+ // To preserve backward compatibility with LegacyHeader, the num_bytes and |
+ // message_type field should be at the same offset than in LegacyHeader. |
Ken Rockot(use gerrit already)
2017/02/23 22:07:05
nit: s/should be/must be/
Also please add a notic
Jay Civelli
2017/02/27 17:07:03
Done.
|
+ struct VersionedHeader { |
+ // Message size in bytes, including the header. |
+ uint32_t num_bytes; |
+ |
// Total size of header, including extra header data (i.e. HANDLEs on |
// windows). |
uint16_t num_header_bytes; |
+ MessageType message_type; |
+ |
+ uint16_t version_number; |
+ |
// Number of attached handles. May be less than the reserved handle |
// storage size in this message on platforms that serialise handles as |
// data (i.e. HANDLEs on Windows, Mach ports on OSX). |
uint16_t num_handles; |
- MessageType message_type; |
- |
- char padding[6]; |
-#endif // defined(MOJO_EDK_LEGACY_PROTOCOL) |
+ char padding[4]; |
}; |
#if defined(OS_MACOSX) && !defined(OS_IOS) |
@@ -106,7 +118,7 @@ class Channel : public base::RefCountedThreadSafe<Channel> { |
// |payload_size| bytes plus a header, plus |max_handles| platform handles. |
Message(size_t payload_size, |
size_t max_handles, |
- Header::MessageType message_type = Header::MessageType::NORMAL); |
+ MessageType message_type = MessageType::NORMAL_LEGACY); |
Ken Rockot(use gerrit already)
2017/02/23 22:07:05
nit: I'd prefer to use a delegating constructor ra
Jay Civelli
2017/02/27 17:07:03
Done.
|
~Message(); |
@@ -116,26 +128,16 @@ class Channel : public base::RefCountedThreadSafe<Channel> { |
const void* data() const { return data_; } |
size_t data_num_bytes() const { return size_; } |
-#if defined(MOJO_EDK_LEGACY_PROTOCOL) |
- void* mutable_payload() { return static_cast<void*>(header_ + 1); } |
- const void* payload() const { |
- return static_cast<const void*>(header_ + 1); |
- } |
- size_t payload_size() const; |
-#else |
- const void* extra_header() const { return data_ + sizeof(Header); } |
- void* mutable_extra_header() { return data_ + sizeof(Header); } |
- size_t extra_header_size() const { |
- return header_->num_header_bytes - sizeof(Header); |
- } |
- |
- void* mutable_payload() { return data_ + header_->num_header_bytes; } |
- const void* payload() const { return data_ + header_->num_header_bytes; } |
+ const void* extra_header() const; |
+ void* mutable_extra_header(); |
+ size_t extra_header_size() const; |
+ |
+ void* mutable_payload(); |
+ const void* payload() const; |
size_t payload_size() const; |
-#endif // defined(MOJO_EDK_LEGACY_PROTOCOL) |
- size_t num_handles() const { return header_->num_handles; } |
- bool has_handles() const { return header_->num_handles > 0; } |
+ size_t num_handles() const; |
+ bool has_handles() const; |
#if defined(OS_MACOSX) && !defined(OS_IOS) |
bool has_mach_ports() const; |
#endif |
@@ -161,11 +163,14 @@ class Channel : public base::RefCountedThreadSafe<Channel> { |
PlatformHandleVector* handles); |
#endif |
+ void SetVersionForTest(uint16_t version_number); |
+ |
private: |
size_t size_; |
size_t max_handles_; |
char* data_; |
- Header* header_; |
+ LegacyHeader* legacy_header_ = nullptr; |
Ken Rockot(use gerrit already)
2017/02/23 22:07:05
nit: use an anonymous union for legacy_header_ and
Jay Civelli
2017/02/27 17:07:03
I use the fact that versioned_header_ is not null
|
+ VersionedHeader* versioned_header_ = nullptr; |
ScopedPlatformHandleVectorPtr handle_vector_; |
@@ -270,7 +275,7 @@ class Channel : public base::RefCountedThreadSafe<Channel> { |
// Handles a received control message. Returns |true| if the message is |
// accepted, or |false| otherwise. |
- virtual bool OnControlMessage(Message::Header::MessageType message_type, |
+ virtual bool OnControlMessage(Message::MessageType message_type, |
const void* payload, |
size_t payload_size, |
ScopedPlatformHandleVectorPtr handles); |