| Index: runtime/vm/message_queue_test.cc
 | 
| ===================================================================
 | 
| --- runtime/vm/message_queue_test.cc	(revision 3557)
 | 
| +++ runtime/vm/message_queue_test.cc	(working copy)
 | 
| @@ -14,15 +14,23 @@
 | 
|   public:
 | 
|    explicit MessageQueueTestPeer(MessageQueue* queue) : queue_(queue) {}
 | 
|  
 | 
| -  bool HasMessage() const { return queue_->head_ != NULL; }
 | 
| +  bool HasMessage() const {
 | 
| +    // We don't really need to grab the monitor during the unit test,
 | 
| +    // but it doesn't hurt.
 | 
| +    queue_->monitor_.Enter();
 | 
| +    bool result = (queue_->head_[Message::kNormalPriority] != NULL ||
 | 
| +                   queue_->head_[Message::kOOBPriority] != NULL);
 | 
| +    queue_->monitor_.Exit();
 | 
| +    return result;
 | 
| +  }
 | 
|  
 | 
|   private:
 | 
|    MessageQueue* queue_;
 | 
|  };
 | 
|  
 | 
|  
 | 
| -static Dart_Message AllocMsg(const char* str) {
 | 
| -  return reinterpret_cast<Dart_Message>(strdup(str));
 | 
| +static uint8_t* AllocMsg(const char* str) {
 | 
| +  return reinterpret_cast<uint8_t*>(strdup(str));
 | 
|  }
 | 
|  
 | 
|  
 | 
| @@ -34,16 +42,19 @@
 | 
|    Dart_Port port = 1;
 | 
|  
 | 
|    // Add two messages.
 | 
| -  PortMessage* msg1 = new PortMessage(port, 0, AllocMsg("msg1"));
 | 
| +  Message* msg1 =
 | 
| +      new Message(port, 0, AllocMsg("msg1"), Message::kNormalPriority);
 | 
|    queue.Enqueue(msg1);
 | 
|    EXPECT(queue_peer.HasMessage());
 | 
|  
 | 
| -  PortMessage* msg2 = new PortMessage(port, 0, AllocMsg("msg2"));
 | 
| +  Message* msg2 =
 | 
| +      new Message(port, 0, AllocMsg("msg2"), Message::kNormalPriority);
 | 
| +
 | 
|    queue.Enqueue(msg2);
 | 
|    EXPECT(queue_peer.HasMessage());
 | 
|  
 | 
|    // Remove two messages.
 | 
| -  PortMessage* msg = queue.Dequeue(0);
 | 
| +  Message* msg = queue.Dequeue(0);
 | 
|    EXPECT(msg != NULL);
 | 
|    EXPECT_STREQ("msg1", reinterpret_cast<char*>(msg->data()));
 | 
|    EXPECT(queue_peer.HasMessage());
 | 
| @@ -58,6 +69,41 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| +TEST_CASE(MessageQueue_Priorities) {
 | 
| +  MessageQueue queue;
 | 
| +  MessageQueueTestPeer queue_peer(&queue);
 | 
| +  EXPECT(!queue_peer.HasMessage());
 | 
| +
 | 
| +  Dart_Port port = 1;
 | 
| +
 | 
| +  // Add two messages.
 | 
| +  Message* msg1 =
 | 
| +      new Message(port, 0, AllocMsg("msg1"), Message::kNormalPriority);
 | 
| +  queue.Enqueue(msg1);
 | 
| +  EXPECT(queue_peer.HasMessage());
 | 
| +
 | 
| +  Message* msg2 =
 | 
| +      new Message(port, 0, AllocMsg("msg2"), Message::kOOBPriority);
 | 
| +
 | 
| +  queue.Enqueue(msg2);
 | 
| +  EXPECT(queue_peer.HasMessage());
 | 
| +
 | 
| +  // The higher priority message is delivered first.
 | 
| +  Message* msg = queue.Dequeue(0);
 | 
| +  EXPECT(msg != NULL);
 | 
| +  EXPECT_STREQ("msg2", reinterpret_cast<char*>(msg->data()));
 | 
| +  EXPECT(queue_peer.HasMessage());
 | 
| +
 | 
| +  msg = queue.Dequeue(0);
 | 
| +  EXPECT(msg != NULL);
 | 
| +  EXPECT_STREQ("msg1", reinterpret_cast<char*>(msg->data()));
 | 
| +  EXPECT(!queue_peer.HasMessage());
 | 
| +
 | 
| +  delete msg1;
 | 
| +  delete msg2;
 | 
| +}
 | 
| +
 | 
| +
 | 
|  // A thread which receives an expected sequence of messages.
 | 
|  static Monitor* sync = NULL;
 | 
|  static MessageQueue* shared_queue = NULL;
 | 
| @@ -85,19 +131,19 @@
 | 
|    }
 | 
|  
 | 
|    for (int i = 0; i < 3; i++) {
 | 
| -    PortMessage* msg = queue->Dequeue(0);
 | 
| +    Message* msg = queue->Dequeue(0);
 | 
|      EXPECT(msg != NULL);
 | 
| -    EXPECT_EQ(i+10, msg->dest_port());
 | 
| -    EXPECT_EQ(i+100, msg->reply_port());
 | 
| -    EXPECT_EQ(i+1000, *(reinterpret_cast<int*>(msg->data())));
 | 
| +    EXPECT_EQ(i + 10, msg->dest_port());
 | 
| +    EXPECT_EQ(i + 100, msg->reply_port());
 | 
| +    EXPECT_EQ(i + 1000, *(reinterpret_cast<int*>(msg->data())));
 | 
|      delete msg;
 | 
|    }
 | 
|    for (int i = 0; i < 3; i++) {
 | 
| -    PortMessage* msg = queue->Dequeue(0);
 | 
| +    Message* msg = queue->Dequeue(0);
 | 
|      EXPECT(msg != NULL);
 | 
| -    EXPECT_EQ(i+20, msg->dest_port());
 | 
| -    EXPECT_EQ(i+200, msg->reply_port());
 | 
| -    EXPECT_EQ(i+2000, *(reinterpret_cast<int*>(msg->data())));
 | 
| +    EXPECT_EQ(i + 20, msg->dest_port());
 | 
| +    EXPECT_EQ(i + 200, msg->reply_port());
 | 
| +    EXPECT_EQ(i + 2000, *(reinterpret_cast<int*>(msg->data())));
 | 
|      delete msg;
 | 
|    }
 | 
|    shared_queue = NULL;
 | 
| @@ -122,9 +168,10 @@
 | 
|    // Pile up three messages before the other thread runs.
 | 
|    for (int i = 0; i < 3; i++) {
 | 
|      int* data = reinterpret_cast<int*>(malloc(sizeof(*data)));
 | 
| -    *data = i+1000;
 | 
| -    PortMessage* msg =
 | 
| -        new PortMessage(i+10, i+100, reinterpret_cast<Dart_Message>(data));
 | 
| +    *data = i + 1000;
 | 
| +    Message* msg =
 | 
| +        new Message(i + 10, i + 100, reinterpret_cast<uint8_t*>(data),
 | 
| +                    Message::kNormalPriority);
 | 
|      shared_queue->Enqueue(msg);
 | 
|    }
 | 
|  
 | 
| @@ -139,9 +186,10 @@
 | 
|    OS::Sleep(5);
 | 
|    for (int i = 0; i < 3; i++) {
 | 
|      int* data = reinterpret_cast<int*>(malloc(sizeof(*data)));
 | 
| -    *data = i+2000;
 | 
| -    PortMessage* msg =
 | 
| -        new PortMessage(i+20, i+200, reinterpret_cast<Dart_Message>(data));
 | 
| +    *data = i + 2000;
 | 
| +    Message* msg =
 | 
| +        new Message(i + 20, i + 200, reinterpret_cast<uint8_t*>(data),
 | 
| +                    Message::kNormalPriority);
 | 
|      shared_queue->Enqueue(msg);
 | 
|    }
 | 
|  
 | 
| @@ -160,9 +208,11 @@
 | 
|    Dart_Port port2 = 2;
 | 
|  
 | 
|    // Add two messages.
 | 
| -  PortMessage* msg1 = new PortMessage(port1, 0, AllocMsg("msg1"));
 | 
| +  Message* msg1 =
 | 
| +      new Message(port1, 0, AllocMsg("msg1"), Message::kNormalPriority);
 | 
|    queue.Enqueue(msg1);
 | 
| -  PortMessage* msg2 = new PortMessage(port2, 0, AllocMsg("msg2"));
 | 
| +  Message* msg2 =
 | 
| +      new Message(port2, 0, AllocMsg("msg2"), Message::kNormalPriority);
 | 
|    queue.Enqueue(msg2);
 | 
|  
 | 
|    EXPECT(queue_peer.HasMessage());
 | 
| @@ -180,9 +230,11 @@
 | 
|    Dart_Port port2 = 2;
 | 
|  
 | 
|    // Add two messages on different ports.
 | 
| -  PortMessage* msg1 = new PortMessage(port1, 0, AllocMsg("msg1"));
 | 
| +  Message* msg1 =
 | 
| +      new Message(port1, 0, AllocMsg("msg1"), Message::kNormalPriority);
 | 
|    queue.Enqueue(msg1);
 | 
| -  PortMessage* msg2 = new PortMessage(port2, 0, AllocMsg("msg2"));
 | 
| +  Message* msg2 =
 | 
| +      new Message(port2, 0, AllocMsg("msg2"), Message::kNormalPriority);
 | 
|    queue.Enqueue(msg2);
 | 
|    EXPECT(queue_peer.HasMessage());
 | 
|  
 | 
| @@ -190,7 +242,7 @@
 | 
|  
 | 
|    // One message is left in the queue.
 | 
|    EXPECT(queue_peer.HasMessage());
 | 
| -  PortMessage* msg = queue.Dequeue(0);
 | 
| +  Message* msg = queue.Dequeue(0);
 | 
|    EXPECT(msg != NULL);
 | 
|    EXPECT_STREQ("msg2", reinterpret_cast<char*>(msg->data()));
 | 
|  
 | 
| @@ -206,9 +258,11 @@
 | 
|    MessageQueueTestPeer queue_peer(&queue);
 | 
|    Dart_Port port1 = 1;
 | 
|  
 | 
| -  PortMessage* msg1 = new PortMessage(port1, 0, AllocMsg("msg1"));
 | 
| +  Message* msg1 =
 | 
| +      new Message(port1, 0, AllocMsg("msg1"), Message::kNormalPriority);
 | 
|    queue.Enqueue(msg1);
 | 
| -  PortMessage* msg2 = new PortMessage(port1, 0, AllocMsg("msg2"));
 | 
| +  Message* msg2 =
 | 
| +      new Message(port1, 0, AllocMsg("msg2"), Message::kNormalPriority);
 | 
|    queue.Enqueue(msg2);
 | 
|    EXPECT(queue_peer.HasMessage());
 | 
|  
 | 
| @@ -232,5 +286,4 @@
 | 
|    EXPECT(!queue_peer.HasMessage());
 | 
|  }
 | 
|  
 | 
| -
 | 
|  }  // namespace dart
 | 
| 
 |