diff options
Diffstat (limited to 'deps/v8/src/circular-queue-inl.h')
-rw-r--r-- | deps/v8/src/circular-queue-inl.h | 62 |
1 files changed, 46 insertions, 16 deletions
diff --git a/deps/v8/src/circular-queue-inl.h b/deps/v8/src/circular-queue-inl.h index b48070ab5d..dfb7031578 100644 --- a/deps/v8/src/circular-queue-inl.h +++ b/deps/v8/src/circular-queue-inl.h @@ -33,30 +33,60 @@ namespace v8 { namespace internal { +template<typename T, unsigned L> +SamplingCircularQueue<T, L>::SamplingCircularQueue() + : enqueue_pos_(buffer_), + dequeue_pos_(buffer_) { +} + + +template<typename T, unsigned L> +SamplingCircularQueue<T, L>::~SamplingCircularQueue() { +} + + +template<typename T, unsigned L> +T* SamplingCircularQueue<T, L>::Peek() { + MemoryBarrier(); + if (Acquire_Load(&dequeue_pos_->marker) == kFull) { + return &dequeue_pos_->record; + } + return NULL; +} + + +template<typename T, unsigned L> +void SamplingCircularQueue<T, L>::Remove() { + Release_Store(&dequeue_pos_->marker, kEmpty); + dequeue_pos_ = Next(dequeue_pos_); +} -void* SamplingCircularQueue::Enqueue() { - if (producer_pos_->enqueue_pos == producer_pos_->next_chunk_pos) { - if (producer_pos_->enqueue_pos == buffer_ + buffer_size_) { - producer_pos_->next_chunk_pos = buffer_; - producer_pos_->enqueue_pos = buffer_; - } - Acquire_Store(producer_pos_->next_chunk_pos, kEnqueueStarted); - // Skip marker. - producer_pos_->enqueue_pos += 1; - producer_pos_->next_chunk_pos += chunk_size_; + +template<typename T, unsigned L> +T* SamplingCircularQueue<T, L>::StartEnqueue() { + MemoryBarrier(); + if (Acquire_Load(&enqueue_pos_->marker) == kEmpty) { + return &enqueue_pos_->record; } - void* result = producer_pos_->enqueue_pos; - producer_pos_->enqueue_pos += record_size_; - return result; + return NULL; } -void SamplingCircularQueue::WrapPositionIfNeeded( - SamplingCircularQueue::Cell** pos) { - if (*pos == buffer_ + buffer_size_) *pos = buffer_; +template<typename T, unsigned L> +void SamplingCircularQueue<T, L>::FinishEnqueue() { + Release_Store(&enqueue_pos_->marker, kFull); + enqueue_pos_ = Next(enqueue_pos_); } +template<typename T, unsigned L> +typename SamplingCircularQueue<T, L>::Entry* SamplingCircularQueue<T, L>::Next( + Entry* entry) { + Entry* next = entry + 1; + if (next == &buffer_[L]) return buffer_; + return next; +} + } } // namespace v8::internal #endif // V8_CIRCULAR_QUEUE_INL_H_ |