diff options
Diffstat (limited to 'deps/v8/test/cctest/test-circular-queue.cc')
-rw-r--r-- | deps/v8/test/cctest/test-circular-queue.cc | 157 |
1 files changed, 74 insertions, 83 deletions
diff --git a/deps/v8/test/cctest/test-circular-queue.cc b/deps/v8/test/cctest/test-circular-queue.cc index 4d7856e276..c900be1a64 100644 --- a/deps/v8/test/cctest/test-circular-queue.cc +++ b/deps/v8/test/cctest/test-circular-queue.cc @@ -35,77 +35,76 @@ using i::SamplingCircularQueue; TEST(SamplingCircularQueue) { - typedef SamplingCircularQueue::Cell Record; - const int kRecordsPerChunk = 4; - SamplingCircularQueue scq(sizeof(Record), - kRecordsPerChunk * sizeof(Record), - 3); + typedef i::AtomicWord Record; + const int kMaxRecordsInQueue = 4; + SamplingCircularQueue<Record, kMaxRecordsInQueue> scq; // Check that we are using non-reserved values. // Fill up the first chunk. - CHECK_EQ(NULL, scq.StartDequeue()); - for (Record i = 1; i < 1 + kRecordsPerChunk; ++i) { - Record* rec = reinterpret_cast<Record*>(scq.Enqueue()); + CHECK_EQ(NULL, scq.Peek()); + for (Record i = 1; i < 1 + kMaxRecordsInQueue; ++i) { + Record* rec = reinterpret_cast<Record*>(scq.StartEnqueue()); CHECK_NE(NULL, rec); *rec = i; - CHECK_EQ(NULL, scq.StartDequeue()); + scq.FinishEnqueue(); } - // Fill up the second chunk. Consumption must still be unavailable. - CHECK_EQ(NULL, scq.StartDequeue()); - for (Record i = 10; i < 10 + kRecordsPerChunk; ++i) { - Record* rec = reinterpret_cast<Record*>(scq.Enqueue()); + // The queue is full, enqueue is not allowed. + CHECK_EQ(NULL, scq.StartEnqueue()); + + // Try to enqueue when the the queue is full. Consumption must be available. + CHECK_NE(NULL, scq.Peek()); + for (int i = 0; i < 10; ++i) { + Record* rec = reinterpret_cast<Record*>(scq.StartEnqueue()); + CHECK_EQ(NULL, rec); + CHECK_NE(NULL, scq.Peek()); + } + + // Consume all records. + for (Record i = 1; i < 1 + kMaxRecordsInQueue; ++i) { + Record* rec = reinterpret_cast<Record*>(scq.Peek()); CHECK_NE(NULL, rec); - *rec = i; - CHECK_EQ(NULL, scq.StartDequeue()); + CHECK_EQ(static_cast<int64_t>(i), static_cast<int64_t>(*rec)); + CHECK_EQ(rec, reinterpret_cast<Record*>(scq.Peek())); + scq.Remove(); + CHECK_NE(rec, reinterpret_cast<Record*>(scq.Peek())); } + // The queue is empty. + CHECK_EQ(NULL, scq.Peek()); - Record* rec = reinterpret_cast<Record*>(scq.Enqueue()); - CHECK_NE(NULL, rec); - *rec = 20; - // Now as we started filling up the third chunk, consumption - // must become possible. - CHECK_NE(NULL, scq.StartDequeue()); - // Consume the first chunk. - for (Record i = 1; i < 1 + kRecordsPerChunk; ++i) { - Record* rec = reinterpret_cast<Record*>(scq.StartDequeue()); + CHECK_EQ(NULL, scq.Peek()); + for (Record i = 0; i < kMaxRecordsInQueue / 2; ++i) { + Record* rec = reinterpret_cast<Record*>(scq.StartEnqueue()); CHECK_NE(NULL, rec); - CHECK_EQ(static_cast<int64_t>(i), static_cast<int64_t>(*rec)); - CHECK_EQ(rec, reinterpret_cast<Record*>(scq.StartDequeue())); - scq.FinishDequeue(); - CHECK_NE(rec, reinterpret_cast<Record*>(scq.StartDequeue())); + *rec = i; + scq.FinishEnqueue(); } - // Now consumption must not be possible, as consumer now polls - // the first chunk for emptinness. - CHECK_EQ(NULL, scq.StartDequeue()); - - scq.FlushResidualRecords(); - // From now, consumer no more polls ahead of the current chunk, - // so it's possible to consume the second chunk. - CHECK_NE(NULL, scq.StartDequeue()); - // Consume the second chunk - for (Record i = 10; i < 10 + kRecordsPerChunk; ++i) { - Record* rec = reinterpret_cast<Record*>(scq.StartDequeue()); + + // Consume all available kMaxRecordsInQueue / 2 records. + CHECK_NE(NULL, scq.Peek()); + for (Record i = 0; i < kMaxRecordsInQueue / 2; ++i) { + Record* rec = reinterpret_cast<Record*>(scq.Peek()); CHECK_NE(NULL, rec); CHECK_EQ(static_cast<int64_t>(i), static_cast<int64_t>(*rec)); - CHECK_EQ(rec, reinterpret_cast<Record*>(scq.StartDequeue())); - scq.FinishDequeue(); - CHECK_NE(rec, reinterpret_cast<Record*>(scq.StartDequeue())); + CHECK_EQ(rec, reinterpret_cast<Record*>(scq.Peek())); + scq.Remove(); + CHECK_NE(rec, reinterpret_cast<Record*>(scq.Peek())); } - // Consumption must still be possible as the first cell of the - // last chunk is not clean. - CHECK_NE(NULL, scq.StartDequeue()); + + // The queue is empty. + CHECK_EQ(NULL, scq.Peek()); } namespace { +typedef i::AtomicWord Record; +typedef SamplingCircularQueue<Record, 12> TestSampleQueue; + class ProducerThread: public i::Thread { public: - typedef SamplingCircularQueue::Cell Record; - - ProducerThread(SamplingCircularQueue* scq, + ProducerThread(TestSampleQueue* scq, int records_per_chunk, Record value, i::Semaphore* finished) @@ -117,16 +116,17 @@ class ProducerThread: public i::Thread { virtual void Run() { for (Record i = value_; i < value_ + records_per_chunk_; ++i) { - Record* rec = reinterpret_cast<Record*>(scq_->Enqueue()); + Record* rec = reinterpret_cast<Record*>(scq_->StartEnqueue()); CHECK_NE(NULL, rec); *rec = i; + scq_->FinishEnqueue(); } finished_->Signal(); } private: - SamplingCircularQueue* scq_; + TestSampleQueue* scq_; const int records_per_chunk_; Record value_; i::Semaphore* finished_; @@ -140,58 +140,49 @@ TEST(SamplingCircularQueueMultithreading) { // to the case of profiling under Linux, where signal handler that // does sampling is called in the context of different VM threads. - typedef ProducerThread::Record Record; const int kRecordsPerChunk = 4; - SamplingCircularQueue scq(sizeof(Record), - kRecordsPerChunk * sizeof(Record), - 3); - i::Semaphore* semaphore = i::OS::CreateSemaphore(0); - // Don't poll ahead, making possible to check data in the buffer - // immediately after enqueuing. - scq.FlushResidualRecords(); + TestSampleQueue scq; + i::Semaphore semaphore(0); - // Check that we are using non-reserved values. - ProducerThread producer1(&scq, kRecordsPerChunk, 1, semaphore); - ProducerThread producer2(&scq, kRecordsPerChunk, 10, semaphore); - ProducerThread producer3(&scq, kRecordsPerChunk, 20, semaphore); + ProducerThread producer1(&scq, kRecordsPerChunk, 1, &semaphore); + ProducerThread producer2(&scq, kRecordsPerChunk, 10, &semaphore); + ProducerThread producer3(&scq, kRecordsPerChunk, 20, &semaphore); - CHECK_EQ(NULL, scq.StartDequeue()); + CHECK_EQ(NULL, scq.Peek()); producer1.Start(); - semaphore->Wait(); + semaphore.Wait(); for (Record i = 1; i < 1 + kRecordsPerChunk; ++i) { - Record* rec = reinterpret_cast<Record*>(scq.StartDequeue()); + Record* rec = reinterpret_cast<Record*>(scq.Peek()); CHECK_NE(NULL, rec); CHECK_EQ(static_cast<int64_t>(i), static_cast<int64_t>(*rec)); - CHECK_EQ(rec, reinterpret_cast<Record*>(scq.StartDequeue())); - scq.FinishDequeue(); - CHECK_NE(rec, reinterpret_cast<Record*>(scq.StartDequeue())); + CHECK_EQ(rec, reinterpret_cast<Record*>(scq.Peek())); + scq.Remove(); + CHECK_NE(rec, reinterpret_cast<Record*>(scq.Peek())); } - CHECK_EQ(NULL, scq.StartDequeue()); + CHECK_EQ(NULL, scq.Peek()); producer2.Start(); - semaphore->Wait(); + semaphore.Wait(); for (Record i = 10; i < 10 + kRecordsPerChunk; ++i) { - Record* rec = reinterpret_cast<Record*>(scq.StartDequeue()); + Record* rec = reinterpret_cast<Record*>(scq.Peek()); CHECK_NE(NULL, rec); CHECK_EQ(static_cast<int64_t>(i), static_cast<int64_t>(*rec)); - CHECK_EQ(rec, reinterpret_cast<Record*>(scq.StartDequeue())); - scq.FinishDequeue(); - CHECK_NE(rec, reinterpret_cast<Record*>(scq.StartDequeue())); + CHECK_EQ(rec, reinterpret_cast<Record*>(scq.Peek())); + scq.Remove(); + CHECK_NE(rec, reinterpret_cast<Record*>(scq.Peek())); } - CHECK_EQ(NULL, scq.StartDequeue()); + CHECK_EQ(NULL, scq.Peek()); producer3.Start(); - semaphore->Wait(); + semaphore.Wait(); for (Record i = 20; i < 20 + kRecordsPerChunk; ++i) { - Record* rec = reinterpret_cast<Record*>(scq.StartDequeue()); + Record* rec = reinterpret_cast<Record*>(scq.Peek()); CHECK_NE(NULL, rec); CHECK_EQ(static_cast<int64_t>(i), static_cast<int64_t>(*rec)); - CHECK_EQ(rec, reinterpret_cast<Record*>(scq.StartDequeue())); - scq.FinishDequeue(); - CHECK_NE(rec, reinterpret_cast<Record*>(scq.StartDequeue())); + CHECK_EQ(rec, reinterpret_cast<Record*>(scq.Peek())); + scq.Remove(); + CHECK_NE(rec, reinterpret_cast<Record*>(scq.Peek())); } - CHECK_EQ(NULL, scq.StartDequeue()); - - delete semaphore; + CHECK_EQ(NULL, scq.Peek()); } |