1 // Copyright 2011 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_CIRCULAR_QUEUE_INL_H_ 6 #define V8_CIRCULAR_QUEUE_INL_H_ 7 8 #include "src/circular-queue.h" 9 10 namespace v8 { 11 namespace internal { 12 13 template<typename T, unsigned L> 14 SamplingCircularQueue<T, L>::SamplingCircularQueue() 15 : enqueue_pos_(buffer_), 16 dequeue_pos_(buffer_) { 17 } 18 19 20 template<typename T, unsigned L> 21 SamplingCircularQueue<T, L>::~SamplingCircularQueue() { 22 } 23 24 25 template<typename T, unsigned L> 26 T* SamplingCircularQueue<T, L>::Peek() { 27 base::MemoryBarrier(); 28 if (base::Acquire_Load(&dequeue_pos_->marker) == kFull) { 29 return &dequeue_pos_->record; 30 } 31 return NULL; 32 } 33 34 35 template<typename T, unsigned L> 36 void SamplingCircularQueue<T, L>::Remove() { 37 base::Release_Store(&dequeue_pos_->marker, kEmpty); 38 dequeue_pos_ = Next(dequeue_pos_); 39 } 40 41 42 template<typename T, unsigned L> 43 T* SamplingCircularQueue<T, L>::StartEnqueue() { 44 base::MemoryBarrier(); 45 if (base::Acquire_Load(&enqueue_pos_->marker) == kEmpty) { 46 return &enqueue_pos_->record; 47 } 48 return NULL; 49 } 50 51 52 template<typename T, unsigned L> 53 void SamplingCircularQueue<T, L>::FinishEnqueue() { 54 base::Release_Store(&enqueue_pos_->marker, kFull); 55 enqueue_pos_ = Next(enqueue_pos_); 56 } 57 58 59 template<typename T, unsigned L> 60 typename SamplingCircularQueue<T, L>::Entry* SamplingCircularQueue<T, L>::Next( 61 Entry* entry) { 62 Entry* next = entry + 1; 63 if (next == &buffer_[L]) return buffer_; 64 return next; 65 } 66 67 } } // namespace v8::internal 68 69 #endif // V8_CIRCULAR_QUEUE_INL_H_ 70