Index: runtime/vm/message_queue_test.cc |
=================================================================== |
--- runtime/vm/message_queue_test.cc (revision 3210) |
+++ runtime/vm/message_queue_test.cc (working copy) |
@@ -14,15 +14,17 @@ |
public: |
explicit MessageQueueTestPeer(MessageQueue* queue) : queue_(queue) {} |
- bool HasMessage() const { return queue_->head_ != NULL; } |
+ bool HasMessage() const { |
Anton Muhin
2012/01/12 12:58:16
that's a pure paranoia, but technically you're not
turnidge
2012/01/12 19:01:55
Added lock.
|
+ return (queue_->head_[Message::kNormalPriority] != NULL || |
+ queue_->head_[Message::kOOBPriority] != NULL); } |
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 +36,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 +63,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,7 +125,7 @@ |
} |
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()); |
@@ -93,7 +133,7 @@ |
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()); |
@@ -123,8 +163,8 @@ |
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)); |
+ Message* msg = new Message(i+10, i+100, reinterpret_cast<uint8_t*>(data), |
Anton Muhin
2012/01/12 12:58:16
nit: spaces around +'s
turnidge
2012/01/12 19:01:55
Done.
|
+ Message::kNormalPriority); |
shared_queue->Enqueue(msg); |
} |
@@ -140,8 +180,8 @@ |
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)); |
+ Message* msg = new Message(i+20, i+200, reinterpret_cast<uint8_t*>(data), |
+ Message::kNormalPriority); |
shared_queue->Enqueue(msg); |
} |
@@ -160,9 +200,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 +222,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 +234,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 +250,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 +278,4 @@ |
EXPECT(!queue_peer.HasMessage()); |
} |
- |
} // namespace dart |