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 |