| Index: runtime/vm/message_queue.h
|
| ===================================================================
|
| --- runtime/vm/message_queue.h (revision 3557)
|
| +++ runtime/vm/message_queue.h (working copy)
|
| @@ -10,60 +10,84 @@
|
|
|
| namespace dart {
|
|
|
| -class PortMessage {
|
| +class Message {
|
| public:
|
| + typedef enum {
|
| + kNormalPriority = 0, // Deliver message when idle.
|
| + kOOBPriority = 1, // Deliver message asap.
|
| +
|
| + // Iteration.
|
| + kFirstPriority = 0,
|
| + kNumPriorities = 2,
|
| + } Priority;
|
| +
|
| + // A port number which is never used.
|
| + static const int kIllegalPort = 0;
|
| +
|
| // A new message to be sent between two isolates. The data handed to this
|
| // message will be disposed by calling free() once the message object is
|
| // being destructed (after delivery or when the receiving port is closed).
|
| - PortMessage(Dart_Port dest_port, Dart_Port reply_port, Dart_Message data)
|
| + //
|
| + // If reply_port is kIllegalPort, then there is no reply port.
|
| + Message(Dart_Port dest_port, Dart_Port reply_port,
|
| + uint8_t* data, Priority priority)
|
| : next_(NULL),
|
| dest_port_(dest_port),
|
| reply_port_(reply_port),
|
| - data_(data) {}
|
| - ~PortMessage() {
|
| + data_(data),
|
| + priority_(priority) {}
|
| + ~Message() {
|
| free(data_);
|
| }
|
|
|
| Dart_Port dest_port() const { return dest_port_; }
|
| Dart_Port reply_port() const { return reply_port_; }
|
| - Dart_Message data() const { return data_; }
|
| + uint8_t* data() const { return data_; }
|
| + Priority priority() const { return priority_; }
|
|
|
| private:
|
| friend class MessageQueue;
|
|
|
| - PortMessage* next_;
|
| + Message* next_;
|
| Dart_Port dest_port_;
|
| Dart_Port reply_port_;
|
| - Dart_Message data_;
|
| + uint8_t* data_;
|
| + Priority priority_;
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(PortMessage);
|
| + DISALLOW_COPY_AND_ASSIGN(Message);
|
| };
|
|
|
|
|
| // There is a message queue per isolate.
|
| class MessageQueue {
|
| public:
|
| - MessageQueue() : head_(NULL), tail_(NULL) {}
|
| + MessageQueue();
|
| ~MessageQueue();
|
|
|
| - void Enqueue(PortMessage* msg);
|
| + void Enqueue(Message* msg);
|
|
|
| // Gets the next message from the message queue, possibly blocking
|
| // if no message is available. 'millis' is a timeout in
|
| // milliseconds. If 'millis' is 0, then this means to block
|
| // indefinitely. May block if no message is available. May return
|
| // NULL even if 'millis' is 0 due to spurious wakeups.
|
| - PortMessage* Dequeue(int64_t millis);
|
| + Message* Dequeue(int64_t millis);
|
|
|
| + // Gets the next message from the message queue if available. Will
|
| + // not block.
|
| + Message* DequeueNoWait();
|
| +
|
| void Flush(Dart_Port port);
|
| void FlushAll();
|
|
|
| private:
|
| friend class MessageQueueTestPeer;
|
|
|
| + Message* DequeueNoWaitHoldsLock();
|
| +
|
| Monitor monitor_;
|
| - PortMessage* head_;
|
| - PortMessage* tail_;
|
| + Message* head_[Message::kNumPriorities];
|
| + Message* tail_[Message::kNumPriorities];
|
|
|
| DISALLOW_COPY_AND_ASSIGN(MessageQueue);
|
| };
|
|
|