// Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MOJO_EDK_SYSTEM_PORTS_EVENT_H_ #define MOJO_EDK_SYSTEM_PORTS_EVENT_H_ #include <stdint.h> #include "mojo/edk/system/ports/message.h" #include "mojo/edk/system/ports/name.h" namespace mojo { namespace edk { namespace ports { #pragma pack(push, 1) // TODO: Add static assertions of alignment. struct PortDescriptor { PortDescriptor(); NodeName peer_node_name; PortName peer_port_name; NodeName referring_node_name; PortName referring_port_name; uint64_t next_sequence_num_to_send; uint64_t next_sequence_num_to_receive; uint64_t last_sequence_num_to_receive; bool peer_closed; char padding[7]; }; enum struct EventType : uint32_t { kUser, kPortAccepted, kObserveProxy, kObserveProxyAck, kObserveClosure, kMergePort, }; struct EventHeader { EventType type; uint32_t padding; PortName port_name; }; struct UserEventData { uint64_t sequence_num; uint32_t num_ports; uint32_t padding; }; struct ObserveProxyEventData { NodeName proxy_node_name; PortName proxy_port_name; NodeName proxy_to_node_name; PortName proxy_to_port_name; }; struct ObserveProxyAckEventData { uint64_t last_sequence_num; }; struct ObserveClosureEventData { uint64_t last_sequence_num; }; struct MergePortEventData { PortName new_port_name; PortDescriptor new_port_descriptor; }; #pragma pack(pop) inline const EventHeader* GetEventHeader(const Message& message) { return static_cast<const EventHeader*>(message.header_bytes()); } inline EventHeader* GetMutableEventHeader(Message* message) { return static_cast<EventHeader*>(message->mutable_header_bytes()); } template <typename EventData> inline const EventData* GetEventData(const Message& message) { return reinterpret_cast<const EventData*>( reinterpret_cast<const char*>(GetEventHeader(message) + 1)); } template <typename EventData> inline EventData* GetMutableEventData(Message* message) { return reinterpret_cast<EventData*>( reinterpret_cast<char*>(GetMutableEventHeader(message) + 1)); } inline const PortDescriptor* GetPortDescriptors(const UserEventData* event) { return reinterpret_cast<const PortDescriptor*>( reinterpret_cast<const char*>(event + 1)); } inline PortDescriptor* GetMutablePortDescriptors(UserEventData* event) { return reinterpret_cast<PortDescriptor*>(reinterpret_cast<char*>(event + 1)); } } // namespace ports } // namespace edk } // namespace mojo #endif // MOJO_EDK_SYSTEM_PORTS_EVENT_H_