OLD | NEW |
| (Empty) |
1 // Copyright 2010 the V8 project authors. All rights reserved. | |
2 // | |
3 // Tests of circular queues. | |
4 | |
5 #include "v8.h" | |
6 #include "circular-queue-inl.h" | |
7 #include "cctest.h" | |
8 | |
9 namespace i = v8::internal; | |
10 | |
11 using i::CircularQueue; | |
12 using i::SamplingCircularQueue; | |
13 | |
14 | |
15 TEST(SingleRecordCircularQueue) { | |
16 typedef int Record; | |
17 CircularQueue<Record> cq(sizeof(Record) * 2); | |
18 CHECK(cq.IsEmpty()); | |
19 cq.Enqueue(1); | |
20 CHECK(!cq.IsEmpty()); | |
21 Record rec = 0; | |
22 cq.Dequeue(&rec); | |
23 CHECK_EQ(1, rec); | |
24 CHECK(cq.IsEmpty()); | |
25 } | |
26 | |
27 | |
28 TEST(MultipleRecordsCircularQueue) { | |
29 typedef int Record; | |
30 const int kQueueSize = 10; | |
31 CircularQueue<Record> cq(sizeof(Record) * (kQueueSize + 1)); | |
32 CHECK(cq.IsEmpty()); | |
33 cq.Enqueue(1); | |
34 CHECK(!cq.IsEmpty()); | |
35 for (int i = 2; i <= 5; ++i) { | |
36 cq.Enqueue(i); | |
37 CHECK(!cq.IsEmpty()); | |
38 } | |
39 Record rec = 0; | |
40 for (int i = 1; i <= 4; ++i) { | |
41 CHECK(!cq.IsEmpty()); | |
42 cq.Dequeue(&rec); | |
43 CHECK_EQ(i, rec); | |
44 } | |
45 for (int i = 6; i <= 12; ++i) { | |
46 cq.Enqueue(i); | |
47 CHECK(!cq.IsEmpty()); | |
48 } | |
49 for (int i = 5; i <= 12; ++i) { | |
50 CHECK(!cq.IsEmpty()); | |
51 cq.Dequeue(&rec); | |
52 CHECK_EQ(i, rec); | |
53 } | |
54 CHECK(cq.IsEmpty()); | |
55 } | |
56 | |
57 | |
58 TEST(SamplingCircularQueue) { | |
59 typedef int Record; | |
60 const int kRecordsPerChunk = 4; | |
61 SamplingCircularQueue scq(sizeof(Record), | |
62 kRecordsPerChunk * sizeof(Record), | |
63 3); | |
64 scq.SetUpProducer(); | |
65 scq.SetUpConsumer(); | |
66 | |
67 // Check that we are using non-reserved values. | |
68 CHECK_NE(SamplingCircularQueue::kClear, 1); | |
69 CHECK_NE(SamplingCircularQueue::kEnd, 1); | |
70 // Fill up the first chunk. | |
71 CHECK_EQ(NULL, scq.StartDequeue()); | |
72 for (int i = 1; i < 1 + kRecordsPerChunk; ++i) { | |
73 Record* rec = reinterpret_cast<Record*>(scq.Enqueue()); | |
74 CHECK_NE(NULL, rec); | |
75 *rec = i; | |
76 CHECK_EQ(NULL, scq.StartDequeue()); | |
77 } | |
78 | |
79 // Fill up the second chunk. Consumption must still be unavailable. | |
80 CHECK_EQ(NULL, scq.StartDequeue()); | |
81 for (int i = 10; i < 10 + kRecordsPerChunk; ++i) { | |
82 Record* rec = reinterpret_cast<Record*>(scq.Enqueue()); | |
83 CHECK_NE(NULL, rec); | |
84 *rec = i; | |
85 CHECK_EQ(NULL, scq.StartDequeue()); | |
86 } | |
87 | |
88 Record* rec = reinterpret_cast<Record*>(scq.Enqueue()); | |
89 CHECK_NE(NULL, rec); | |
90 *rec = 20; | |
91 // Now as we started filling up the third chunk, consumption | |
92 // must become possible. | |
93 CHECK_NE(NULL, scq.StartDequeue()); | |
94 | |
95 // Consume the first chunk. | |
96 for (int i = 1; i < 1 + kRecordsPerChunk; ++i) { | |
97 Record* rec = reinterpret_cast<Record*>(scq.StartDequeue()); | |
98 CHECK_NE(NULL, rec); | |
99 CHECK_EQ(i, *rec); | |
100 CHECK_EQ(rec, reinterpret_cast<Record*>(scq.StartDequeue())); | |
101 scq.FinishDequeue(); | |
102 CHECK_NE(rec, reinterpret_cast<Record*>(scq.StartDequeue())); | |
103 } | |
104 // Now consumption must not be possible, as consumer now polls | |
105 // the first chunk for emptinness. | |
106 CHECK_EQ(NULL, scq.StartDequeue()); | |
107 | |
108 scq.FlushResidualRecords(); | |
109 // From now, consumer no more polls ahead of the current chunk, | |
110 // so it's possible to consume the second chunk. | |
111 CHECK_NE(NULL, scq.StartDequeue()); | |
112 // Consume the second chunk | |
113 for (int i = 10; i < 10 + kRecordsPerChunk; ++i) { | |
114 Record* rec = reinterpret_cast<Record*>(scq.StartDequeue()); | |
115 CHECK_NE(NULL, rec); | |
116 CHECK_EQ(i, *rec); | |
117 CHECK_EQ(rec, reinterpret_cast<Record*>(scq.StartDequeue())); | |
118 scq.FinishDequeue(); | |
119 CHECK_NE(rec, reinterpret_cast<Record*>(scq.StartDequeue())); | |
120 } | |
121 // Consumption must still be possible as the first cell of the | |
122 // last chunk is not clean. | |
123 CHECK_NE(NULL, scq.StartDequeue()); | |
124 | |
125 scq.TearDownConsumer(); | |
126 scq.TearDownProducer(); | |
127 } | |
OLD | NEW |