event.h (13340B)
1 // Copyright 2016 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef MOJO_CORE_PORTS_EVENT_H_ 6 #define MOJO_CORE_PORTS_EVENT_H_ 7 8 #include <stdint.h> 9 10 #include <vector> 11 12 #include "mojo/core/ports/name.h" 13 #include "mojo/core/ports/user_message.h" 14 15 namespace mojo { 16 namespace core { 17 namespace ports { 18 19 class Event; 20 21 using ScopedEvent = mozilla::UniquePtr<Event>; 22 23 // A Event is the fundamental unit of operation and communication within and 24 // between Nodes. 25 class Event { 26 public: 27 enum Type : uint32_t { 28 // A user message event contains arbitrary user-specified payload data 29 // which may include any number of ports and/or system handles (e.g. FDs). 30 kUserMessage, 31 32 // When a Node receives a user message with one or more ports attached, it 33 // sends back an instance of this event for every attached port to indicate 34 // that the port has been accepted by its destination node. 35 kPortAccepted, 36 37 // This event begins circulation any time a port enters a proxying state. It 38 // may be re-circulated in certain edge cases, but the ultimate purpose of 39 // the event is to ensure that every port along a route is (if necessary) 40 // aware that the proxying port is indeed proxying (and to where) so that it 41 // can begin to be bypassed along the route. 42 kObserveProxy, 43 44 // An event used to acknowledge to a proxy that all concerned nodes and 45 // ports are aware of its proxying state and that no more user messages will 46 // be routed to it beyond a given final sequence number. 47 kObserveProxyAck, 48 49 // Indicates that a port has been closed. This event fully circulates a 50 // route to ensure that all ports are aware of closure. 51 kObserveClosure, 52 53 // Used to request the merging of two routes via two sacrificial receiving 54 // ports, one from each route. 55 kMergePort, 56 57 // Used to request that the conjugate port acknowledges read messages by 58 // sending back a UserMessageReadAck. 59 kUserMessageReadAckRequest, 60 61 // Used to acknowledge read messages to the conjugate. 62 kUserMessageReadAck, 63 64 // Used to update the previous node and port name of a port. 65 kUpdatePreviousPeer, 66 }; 67 68 #pragma pack(push, 1) 69 struct PortDescriptor { 70 PortDescriptor() = default; 71 72 NodeName peer_node_name = {}; 73 PortName peer_port_name = {}; 74 NodeName referring_node_name = {}; 75 PortName referring_port_name = {}; 76 uint64_t next_sequence_num_to_send = 0; 77 uint64_t next_sequence_num_to_receive = 0; 78 uint64_t last_sequence_num_to_receive = 0; 79 bool peer_closed = false; 80 char padding[7] = {0}; 81 }; 82 #pragma pack(pop) 83 virtual ~Event(); 84 85 static ScopedEvent Deserialize(const void* buffer, size_t num_bytes); 86 87 template <typename T> 88 static mozilla::UniquePtr<T> Cast(ScopedEvent* event) { 89 return mozilla::WrapUnique(static_cast<T*>(event->release())); 90 } 91 92 Type type() const { return type_; } 93 const PortName& port_name() const { return port_name_; } 94 void set_port_name(const PortName& port_name) { port_name_ = port_name; } 95 96 size_t GetSerializedSize() const; 97 void Serialize(void* buffer) const; 98 virtual ScopedEvent CloneForBroadcast() const; 99 100 const PortName& from_port() const { return from_port_; } 101 void set_from_port(const PortName& from_port) { from_port_ = from_port; } 102 103 uint64_t control_sequence_num() const { return control_sequence_num_; } 104 void set_control_sequence_num(uint64_t control_sequence_num) { 105 control_sequence_num_ = control_sequence_num; 106 } 107 108 protected: 109 Event(Type type, const PortName& port_name, const PortName& from_port, 110 uint64_t control_sequence_num); 111 112 virtual size_t GetSerializedDataSize() const = 0; 113 virtual void SerializeData(void* buffer) const = 0; 114 115 private: 116 const Type type_; 117 PortName port_name_; 118 PortName from_port_; 119 uint64_t control_sequence_num_; 120 121 DISALLOW_COPY_AND_ASSIGN(Event); 122 }; 123 124 class UserMessageEvent : public Event { 125 public: 126 explicit UserMessageEvent(size_t num_ports); 127 ~UserMessageEvent() override; 128 129 bool HasMessage() const { return !!message_; } 130 void AttachMessage(mozilla::UniquePtr<UserMessage> message); 131 132 template <typename T> 133 T* GetMessage() { 134 DCHECK(HasMessage()); 135 DCHECK_EQ(&T::kUserMessageTypeInfo, message_->type_info()); 136 return static_cast<T*>(message_.get()); 137 } 138 139 template <typename T> 140 const T* GetMessage() const { 141 DCHECK(HasMessage()); 142 DCHECK_EQ(&T::kUserMessageTypeInfo, message_->type_info()); 143 return static_cast<const T*>(message_.get()); 144 } 145 146 template <typename T> 147 mozilla::UniquePtr<T> TakeMessage() { 148 DCHECK(HasMessage()); 149 DCHECK_EQ(&T::kUserMessageTypeInfo, message_->type_info()); 150 return mozilla::UniquePtr<T>{static_cast<T*>(message_.release())}; 151 } 152 153 void ReservePorts(size_t num_ports); 154 bool NotifyWillBeRoutedExternally(); 155 156 uint64_t sequence_num() const { return sequence_num_; } 157 void set_sequence_num(uint64_t sequence_num) { sequence_num_ = sequence_num; } 158 159 size_t num_ports() const { return ports_.size(); } 160 PortDescriptor* port_descriptors() { return port_descriptors_.data(); } 161 PortName* ports() { return ports_.data(); } 162 163 static ScopedEvent Deserialize(const PortName& port_name, 164 const PortName& from_port, 165 uint64_t control_sequence_num, 166 const void* buffer, size_t num_bytes); 167 168 size_t GetSizeIfSerialized() const; 169 170 private: 171 UserMessageEvent(const PortName& port_name, const PortName& from_port, 172 uint64_t control_sequence_num, uint64_t sequence_num); 173 174 size_t GetSerializedDataSize() const override; 175 void SerializeData(void* buffer) const override; 176 177 uint64_t sequence_num_ = 0; 178 std::vector<PortDescriptor> port_descriptors_; 179 std::vector<PortName> ports_; 180 mozilla::UniquePtr<UserMessage> message_; 181 182 DISALLOW_COPY_AND_ASSIGN(UserMessageEvent); 183 }; 184 185 class PortAcceptedEvent : public Event { 186 public: 187 PortAcceptedEvent(const PortName& port_name, const PortName& from_port, 188 uint64_t control_sequence_num); 189 ~PortAcceptedEvent() override; 190 191 static ScopedEvent Deserialize(const PortName& port_name, 192 const PortName& from_port, 193 uint64_t control_sequence_num, 194 const void* buffer, size_t num_bytes); 195 196 private: 197 size_t GetSerializedDataSize() const override; 198 void SerializeData(void* buffer) const override; 199 200 DISALLOW_COPY_AND_ASSIGN(PortAcceptedEvent); 201 }; 202 203 class ObserveProxyEvent : public Event { 204 public: 205 ObserveProxyEvent(const PortName& port_name, const PortName& from_port, 206 uint64_t control_sequence_num, 207 const NodeName& proxy_node_name, 208 const PortName& proxy_port_name, 209 const NodeName& proxy_target_node_name, 210 const PortName& proxy_target_port_name); 211 ~ObserveProxyEvent() override; 212 213 const NodeName& proxy_node_name() const { return proxy_node_name_; } 214 const PortName& proxy_port_name() const { return proxy_port_name_; } 215 const NodeName& proxy_target_node_name() const { 216 return proxy_target_node_name_; 217 } 218 const PortName& proxy_target_port_name() const { 219 return proxy_target_port_name_; 220 } 221 222 static ScopedEvent Deserialize(const PortName& port_name, 223 const PortName& from_port, 224 uint64_t control_sequence_num, 225 const void* buffer, size_t num_bytes); 226 227 private: 228 size_t GetSerializedDataSize() const override; 229 void SerializeData(void* buffer) const override; 230 ScopedEvent CloneForBroadcast() const override; 231 232 const NodeName proxy_node_name_; 233 const PortName proxy_port_name_; 234 const NodeName proxy_target_node_name_; 235 const PortName proxy_target_port_name_; 236 237 DISALLOW_COPY_AND_ASSIGN(ObserveProxyEvent); 238 }; 239 240 class ObserveProxyAckEvent : public Event { 241 public: 242 ObserveProxyAckEvent(const PortName& port_name, const PortName& from_port, 243 uint64_t control_sequence_num, 244 uint64_t last_sequence_num); 245 ~ObserveProxyAckEvent() override; 246 247 uint64_t last_sequence_num() const { return last_sequence_num_; } 248 249 static ScopedEvent Deserialize(const PortName& port_name, 250 const PortName& from_port, 251 uint64_t control_sequence_num, 252 const void* buffer, size_t num_bytes); 253 254 private: 255 size_t GetSerializedDataSize() const override; 256 void SerializeData(void* buffer) const override; 257 258 const uint64_t last_sequence_num_; 259 260 DISALLOW_COPY_AND_ASSIGN(ObserveProxyAckEvent); 261 }; 262 263 class ObserveClosureEvent : public Event { 264 public: 265 ObserveClosureEvent(const PortName& port_name, const PortName& from_port, 266 uint64_t control_sequence_num, 267 uint64_t last_sequence_num); 268 ~ObserveClosureEvent() override; 269 270 uint64_t last_sequence_num() const { return last_sequence_num_; } 271 void set_last_sequence_num(uint64_t last_sequence_num) { 272 last_sequence_num_ = last_sequence_num; 273 } 274 275 static ScopedEvent Deserialize(const PortName& port_name, 276 const PortName& from_port, 277 uint64_t control_sequence_num, 278 const void* buffer, size_t num_bytes); 279 280 private: 281 size_t GetSerializedDataSize() const override; 282 void SerializeData(void* buffer) const override; 283 284 uint64_t last_sequence_num_; 285 286 DISALLOW_COPY_AND_ASSIGN(ObserveClosureEvent); 287 }; 288 289 class MergePortEvent : public Event { 290 public: 291 MergePortEvent(const PortName& port_name, const PortName& from_port, 292 uint64_t control_sequence_num, const PortName& new_port_name, 293 const PortDescriptor& new_port_descriptor); 294 ~MergePortEvent() override; 295 296 const PortName& new_port_name() const { return new_port_name_; } 297 const PortDescriptor& new_port_descriptor() const { 298 return new_port_descriptor_; 299 } 300 301 static ScopedEvent Deserialize(const PortName& port_name, 302 const PortName& from_port, 303 uint64_t control_sequence_num, 304 const void* buffer, size_t num_bytes); 305 306 private: 307 size_t GetSerializedDataSize() const override; 308 void SerializeData(void* buffer) const override; 309 310 const PortName new_port_name_; 311 const PortDescriptor new_port_descriptor_; 312 313 DISALLOW_COPY_AND_ASSIGN(MergePortEvent); 314 }; 315 316 class UserMessageReadAckRequestEvent : public Event { 317 public: 318 UserMessageReadAckRequestEvent(const PortName& port_name, 319 const PortName& from_port, 320 uint64_t control_sequence_num, 321 uint64_t sequence_num_to_acknowledge); 322 ~UserMessageReadAckRequestEvent() override; 323 324 uint64_t sequence_num_to_acknowledge() const { 325 return sequence_num_to_acknowledge_; 326 } 327 328 static ScopedEvent Deserialize(const PortName& port_name, 329 const PortName& from_port, 330 uint64_t control_sequence_num, 331 const void* buffer, size_t num_bytes); 332 333 private: 334 size_t GetSerializedDataSize() const override; 335 void SerializeData(void* buffer) const override; 336 337 uint64_t sequence_num_to_acknowledge_; 338 }; 339 340 class UserMessageReadAckEvent : public Event { 341 public: 342 UserMessageReadAckEvent(const PortName& port_name, const PortName& from_port, 343 uint64_t control_sequence_num, 344 uint64_t sequence_num_acknowledged); 345 ~UserMessageReadAckEvent() override; 346 347 uint64_t sequence_num_acknowledged() const { 348 return sequence_num_acknowledged_; 349 } 350 351 static ScopedEvent Deserialize(const PortName& port_name, 352 const PortName& from_port, 353 uint64_t control_sequence_num, 354 const void* buffer, size_t num_bytes); 355 356 private: 357 size_t GetSerializedDataSize() const override; 358 void SerializeData(void* buffer) const override; 359 360 uint64_t sequence_num_acknowledged_; 361 }; 362 363 class UpdatePreviousPeerEvent : public Event { 364 public: 365 UpdatePreviousPeerEvent(const PortName& port_name, const PortName& from_port, 366 uint64_t control_sequence_num, 367 const NodeName& new_node_name, 368 const PortName& new_port_name); 369 ~UpdatePreviousPeerEvent() override; 370 371 const NodeName& new_node_name() const { return new_node_name_; } 372 373 const PortName& new_port_name() const { return new_port_name_; } 374 375 static ScopedEvent Deserialize(const PortName& port_name, 376 const PortName& from_port, 377 uint64_t control_sequence_num, 378 const void* buffer, size_t num_bytes); 379 380 private: 381 size_t GetSerializedDataSize() const override; 382 void SerializeData(void* buffer) const override; 383 384 const NodeName new_node_name_; 385 const PortName new_port_name_; 386 }; 387 388 } // namespace ports 389 } // namespace core 390 } // namespace mojo 391 392 #endif // MOJO_CORE_PORTS_EVENT_H_