unbound-queue-inl.h 1.98 KB
Newer Older
1
// Copyright 2010 the V8 project authors. All rights reserved.
2 3
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
4

5 6
#ifndef V8_PROFILER_UNBOUND_QUEUE_INL_H_
#define V8_PROFILER_UNBOUND_QUEUE_INL_H_
7

8
#include "src/profiler/unbound-queue.h"
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

namespace v8 {
namespace internal {

template<typename Record>
struct UnboundQueue<Record>::Node: public Malloced {
  explicit Node(const Record& value)
      : value(value), next(NULL) {
  }

  Record value;
  Node* next;
};


template<typename Record>
UnboundQueue<Record>::UnboundQueue() {
  first_ = new Node(Record());
27
  divider_ = last_ = reinterpret_cast<base::AtomicWord>(first_);
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
}


template<typename Record>
UnboundQueue<Record>::~UnboundQueue() {
  while (first_ != NULL) DeleteFirst();
}


template<typename Record>
void UnboundQueue<Record>::DeleteFirst() {
  Node* tmp = first_;
  first_ = tmp->next;
  delete tmp;
}


template<typename Record>
46
bool UnboundQueue<Record>::Dequeue(Record* rec) {
47
  if (divider_ == base::Acquire_Load(&last_)) return false;
48 49
  Node* next = reinterpret_cast<Node*>(divider_)->next;
  *rec = next->value;
50
  base::Release_Store(&divider_, reinterpret_cast<base::AtomicWord>(next));
51
  return true;
52 53 54 55 56 57 58
}


template<typename Record>
void UnboundQueue<Record>::Enqueue(const Record& rec) {
  Node*& next = reinterpret_cast<Node*>(last_)->next;
  next = new Node(rec);
59
  base::Release_Store(&last_, reinterpret_cast<base::AtomicWord>(next));
60

61
  while (first_ != reinterpret_cast<Node*>(base::Acquire_Load(&divider_))) {
62 63 64 65 66 67 68
    DeleteFirst();
  }
}


template<typename Record>
bool UnboundQueue<Record>::IsEmpty() const {
69
  return base::NoBarrier_Load(&divider_) == base::NoBarrier_Load(&last_);
70 71
}

72 73

template<typename Record>
74
Record* UnboundQueue<Record>::Peek() const {
75
  if (divider_ == base::Acquire_Load(&last_)) return NULL;
76 77 78 79
  Node* next = reinterpret_cast<Node*>(divider_)->next;
  return &next->value;
}

80 81
}  // namespace internal
}  // namespace v8
82

83
#endif  // V8_PROFILER_UNBOUND_QUEUE_INL_H_