|  | // 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_ |