| // 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 PortMap : public AllStatic { | 
 |  public: | 
 |   // Allocate a port for the provided handler and return its VM-global id. | 
 |   static Dart_Port CreatePort(MessageHandler* handler); | 
 |  | 
 |   // 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, | 
 |                         MessageHandler** message_handler = nullptr); | 
 |  | 
 |   // 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 the owning Isolate for port 'id'. | 
 |   static Isolate* GetIsolate(Dart_Port id); | 
 |  | 
 |   // Returns the origin id for port 'id'. | 
 |   static Dart_Port GetOriginId(Dart_Port id); | 
 |  | 
 | #if defined(TESTING) | 
 |   static bool PortExists(Dart_Port id); | 
 |   static bool HasPorts(MessageHandler* handler); | 
 | #endif | 
 |  | 
 |   // Whether the destination port's isolate is a member of [isolate_group]. | 
 |   static bool IsReceiverInThisIsolateGroupOrClosed(Dart_Port receiver, | 
 |                                                    IsolateGroup* group); | 
 |  | 
 |   static void Init(); | 
 |   static void Cleanup(); | 
 |  | 
 |   static void PrintPortsForMessageHandler(MessageHandler* handler, | 
 |                                           JSONStream* stream); | 
 |  | 
 |   static void DebugDumpForMessageHandler(MessageHandler* handler); | 
 |  | 
 |  private: | 
 |   struct Entry : public PortSet<Entry>::Entry { | 
 |     Entry() : handler(nullptr) {} | 
 |  | 
 |     MessageHandler* handler; | 
 |   }; | 
 |  | 
 |   // Allocate a new unique port. | 
 |   static Dart_Port AllocatePort(); | 
 |  | 
 |   // Lock protecting access to the port map. | 
 |   static Mutex* mutex_; | 
 |  | 
 |   static PortSet<Entry>* ports_; | 
 |  | 
 |   static Random* prng_; | 
 | }; | 
 |  | 
 | }  // namespace dart | 
 |  | 
 | #endif  // RUNTIME_VM_PORT_H_ |