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_PROFILER_CIRCULAR_QUEUE_INL_H_ 6#define V8_PROFILER_CIRCULAR_QUEUE_INL_H_ 7 8#include "src/profiler/circular-queue.h" 9 10namespace v8 { 11namespace internal { 12 13template<typename T, unsigned L> 14SamplingCircularQueue<T, L>::SamplingCircularQueue() 15 : enqueue_pos_(buffer_), 16 dequeue_pos_(buffer_) { 17} 18 19 20template<typename T, unsigned L> 21SamplingCircularQueue<T, L>::~SamplingCircularQueue() { 22} 23 24 25template<typename T, unsigned L> 26T* 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 35template<typename T, unsigned L> 36void SamplingCircularQueue<T, L>::Remove() { 37 base::Release_Store(&dequeue_pos_->marker, kEmpty); 38 dequeue_pos_ = Next(dequeue_pos_); 39} 40 41 42template<typename T, unsigned L> 43T* 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 52template<typename T, unsigned L> 53void SamplingCircularQueue<T, L>::FinishEnqueue() { 54 base::Release_Store(&enqueue_pos_->marker, kFull); 55 enqueue_pos_ = Next(enqueue_pos_); 56} 57 58 59template<typename T, unsigned L> 60typename 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 internal 68} // namespace v8 69 70#endif // V8_PROFILER_CIRCULAR_QUEUE_INL_H_ 71