1 // Copyright 2010 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.
5 #ifndef V8_PROFILER_UNBOUND_QUEUE_INL_H_
6 #define V8_PROFILER_UNBOUND_QUEUE_INL_H_
8 #include "src/profiler/unbound-queue.h"
13 template<typename Record>
14 struct UnboundQueue<Record>::Node: public Malloced {
15 explicit Node(const Record& value)
16 : value(value), next(NULL) {
24 template<typename Record>
25 UnboundQueue<Record>::UnboundQueue() {
26 first_ = new Node(Record());
27 divider_ = last_ = reinterpret_cast<base::AtomicWord>(first_);
31 template<typename Record>
32 UnboundQueue<Record>::~UnboundQueue() {
33 while (first_ != NULL) DeleteFirst();
37 template<typename Record>
38 void UnboundQueue<Record>::DeleteFirst() {
45 template<typename Record>
46 bool UnboundQueue<Record>::Dequeue(Record* rec) {
47 if (divider_ == base::Acquire_Load(&last_)) return false;
48 Node* next = reinterpret_cast<Node*>(divider_)->next;
50 base::Release_Store(÷r_, reinterpret_cast<base::AtomicWord>(next));
55 template<typename Record>
56 void UnboundQueue<Record>::Enqueue(const Record& rec) {
57 Node*& next = reinterpret_cast<Node*>(last_)->next;
59 base::Release_Store(&last_, reinterpret_cast<base::AtomicWord>(next));
61 while (first_ != reinterpret_cast<Node*>(base::Acquire_Load(÷r_))) {
67 template<typename Record>
68 bool UnboundQueue<Record>::IsEmpty() const {
69 return base::NoBarrier_Load(÷r_) == base::NoBarrier_Load(&last_);
73 template<typename Record>
74 Record* UnboundQueue<Record>::Peek() const {
75 if (divider_ == base::Acquire_Load(&last_)) return NULL;
76 Node* next = reinterpret_cast<Node*>(divider_)->next;
80 } } // namespace v8::internal
82 #endif // V8_PROFILER_UNBOUND_QUEUE_INL_H_