Home | History | Annotate | Download | only in src
      1 // Copyright 2011 the V8 project authors. All rights reserved.
      2 // Redistribution and use in source and binary forms, with or without
      3 // modification, are permitted provided that the following conditions are
      4 // met:
      5 //
      6 //     * Redistributions of source code must retain the above copyright
      7 //       notice, this list of conditions and the following disclaimer.
      8 //     * Redistributions in binary form must reproduce the above
      9 //       copyright notice, this list of conditions and the following
     10 //       disclaimer in the documentation and/or other materials provided
     11 //       with the distribution.
     12 //     * Neither the name of Google Inc. nor the names of its
     13 //       contributors may be used to endorse or promote products derived
     14 //       from this software without specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 
     28 #ifndef V8_CIRCULAR_QUEUE_INL_H_
     29 #define V8_CIRCULAR_QUEUE_INL_H_
     30 
     31 #include "circular-queue.h"
     32 
     33 namespace v8 {
     34 namespace internal {
     35 
     36 template<typename T, unsigned L>
     37 SamplingCircularQueue<T, L>::SamplingCircularQueue()
     38     : enqueue_pos_(buffer_),
     39       dequeue_pos_(buffer_) {
     40 }
     41 
     42 
     43 template<typename T, unsigned L>
     44 SamplingCircularQueue<T, L>::~SamplingCircularQueue() {
     45 }
     46 
     47 
     48 template<typename T, unsigned L>
     49 T* SamplingCircularQueue<T, L>::Peek() {
     50   MemoryBarrier();
     51   if (Acquire_Load(&dequeue_pos_->marker) == kFull) {
     52     return &dequeue_pos_->record;
     53   }
     54   return NULL;
     55 }
     56 
     57 
     58 template<typename T, unsigned L>
     59 void SamplingCircularQueue<T, L>::Remove() {
     60   Release_Store(&dequeue_pos_->marker, kEmpty);
     61   dequeue_pos_ = Next(dequeue_pos_);
     62 }
     63 
     64 
     65 template<typename T, unsigned L>
     66 T* SamplingCircularQueue<T, L>::StartEnqueue() {
     67   MemoryBarrier();
     68   if (Acquire_Load(&enqueue_pos_->marker) == kEmpty) {
     69     return &enqueue_pos_->record;
     70   }
     71   return NULL;
     72 }
     73 
     74 
     75 template<typename T, unsigned L>
     76 void SamplingCircularQueue<T, L>::FinishEnqueue() {
     77   Release_Store(&enqueue_pos_->marker, kFull);
     78   enqueue_pos_ = Next(enqueue_pos_);
     79 }
     80 
     81 
     82 template<typename T, unsigned L>
     83 typename SamplingCircularQueue<T, L>::Entry* SamplingCircularQueue<T, L>::Next(
     84     Entry* entry) {
     85   Entry* next = entry + 1;
     86   if (next == &buffer_[L]) return buffer_;
     87   return next;
     88 }
     89 
     90 } }  // namespace v8::internal
     91 
     92 #endif  // V8_CIRCULAR_QUEUE_INL_H_
     93