Home | History | Annotate | Download | only in profiler
      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 
     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::SeqCst_MemoryFence();
     28   if (base::Acquire_Load(&dequeue_pos_->marker) == kFull) {
     29     return &dequeue_pos_->record;
     30   }
     31   return nullptr;
     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::SeqCst_MemoryFence();
     45   if (base::Acquire_Load(&enqueue_pos_->marker) == kEmpty) {
     46     return &enqueue_pos_->record;
     47   }
     48   return nullptr;
     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 internal
     68 }  // namespace v8
     69 
     70 #endif  // V8_PROFILER_CIRCULAR_QUEUE_INL_H_
     71