| // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file | 
 | // for details. All rights reserved. Use of this source code is governed by a | 
 | // BSD-style license that can be found in the LICENSE file. | 
 |  | 
 | #ifndef RUNTIME_VM_PORT_H_ | 
 | #define RUNTIME_VM_PORT_H_ | 
 |  | 
 | #include <memory> | 
 |  | 
 | #include "include/dart_api.h" | 
 | #include "vm/allocation.h" | 
 | #include "vm/globals.h" | 
 | #include "vm/json_stream.h" | 
 | #include "vm/port_set.h" | 
 | #include "vm/random.h" | 
 |  | 
 | namespace dart { | 
 |  | 
 | class Isolate; | 
 | class Message; | 
 | class MessageHandler; | 
 | class Mutex; | 
 | class PortMapTestPeer; | 
 |  | 
 | class PortMap : public AllStatic { | 
 |  public: | 
 |   enum PortState { | 
 |     kNewPort = 0,      // a newly allocated port | 
 |     kLivePort = 1,     // a regular port (has a ReceivePort) | 
 |     kControlPort = 2,  // a special control port (has a ReceivePort) | 
 |     kInactivePort = | 
 |         3,  // an inactive port (has a ReceivePort) not considered live. | 
 |   }; | 
 |  | 
 |   // Allocate a port for the provided handler and return its VM-global id. | 
 |   static Dart_Port CreatePort(MessageHandler* handler); | 
 |  | 
 |   // Indicates that a port has had a ReceivePort created for it at the | 
 |   // dart language level.  The port remains live until it is closed. | 
 |   static void SetPortState(Dart_Port id, PortState kind); | 
 |  | 
 |   // Close the port with id. All pending messages will be dropped. | 
 |   // | 
 |   // Returns true if the port is successfully closed. | 
 |   static bool ClosePort(Dart_Port id); | 
 |  | 
 |   // Close all the ports for the provided handler. | 
 |   static void ClosePorts(MessageHandler* handler); | 
 |  | 
 |   // Enqueues the message in the port with id. Returns false if the port is not | 
 |   // active any longer. | 
 |   // | 
 |   // Claims ownership of 'message'. | 
 |   static bool PostMessage(std::unique_ptr<Message> message, | 
 |                           bool before_events = false); | 
 |  | 
 |   // Returns whether a port is local to the current isolate. | 
 |   static bool IsLocalPort(Dart_Port id); | 
 |  | 
 |   // Returns whether a port is live (e.g., is not new or inactive). | 
 |   static bool IsLivePort(Dart_Port id); | 
 |  | 
 |   // Returns the owning Isolate for port 'id'. | 
 |   static Isolate* GetIsolate(Dart_Port id); | 
 |  | 
 |   // Whether the destination port's isolate is a member of [isolate_group]. | 
 |   static bool IsReceiverInThisIsolateGroup(Dart_Port receiver, | 
 |                                            IsolateGroup* group); | 
 |  | 
 |   static void Init(); | 
 |   static void Cleanup(); | 
 |  | 
 |   static void PrintPortsForMessageHandler(MessageHandler* handler, | 
 |                                           JSONStream* stream); | 
 |  | 
 |   static void DebugDumpForMessageHandler(MessageHandler* handler); | 
 |  | 
 |  private: | 
 |   friend class dart::PortMapTestPeer; | 
 |  | 
 |   struct Entry : public PortSet<Entry>::Entry { | 
 |     Entry() : handler(nullptr), state(kNewPort) {} | 
 |  | 
 |     MessageHandler* handler; | 
 |     PortState state; | 
 |   }; | 
 |  | 
 |   static const char* PortStateString(PortState state); | 
 |  | 
 |   // Allocate a new unique port. | 
 |   static Dart_Port AllocatePort(); | 
 |  | 
 |   // Lock protecting access to the port map. | 
 |   static Mutex* mutex_; | 
 |  | 
 |   static PortSet<Entry>* ports_; | 
 |   static MessageHandler* deleted_entry_; | 
 |  | 
 |   static Random* prng_; | 
 | }; | 
 |  | 
 | }  // namespace dart | 
 |  | 
 | #endif  // RUNTIME_VM_PORT_H_ |