blob: fffb1dbcfb13d966c2164d19dc781404c976af52 [file] [log] [blame]
Leon Clarkef7060e22010-06-03 12:02:55 +01001// Copyright 2010 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_UNBOUND_QUEUE_INL_H_
29#define V8_UNBOUND_QUEUE_INL_H_
30
31#include "unbound-queue.h"
32
33namespace v8 {
34namespace internal {
35
36template<typename Record>
37struct UnboundQueue<Record>::Node: public Malloced {
38 explicit Node(const Record& value)
39 : value(value), next(NULL) {
40 }
41
42 Record value;
43 Node* next;
44};
45
46
47template<typename Record>
48UnboundQueue<Record>::UnboundQueue() {
49 first_ = new Node(Record());
50 divider_ = last_ = reinterpret_cast<AtomicWord>(first_);
51}
52
53
54template<typename Record>
55UnboundQueue<Record>::~UnboundQueue() {
56 while (first_ != NULL) DeleteFirst();
57}
58
59
60template<typename Record>
61void UnboundQueue<Record>::DeleteFirst() {
62 Node* tmp = first_;
63 first_ = tmp->next;
64 delete tmp;
65}
66
67
68template<typename Record>
69void UnboundQueue<Record>::Dequeue(Record* rec) {
70 ASSERT(divider_ != last_);
71 Node* next = reinterpret_cast<Node*>(divider_)->next;
72 *rec = next->value;
73 OS::ReleaseStore(&divider_, reinterpret_cast<AtomicWord>(next));
74}
75
76
77template<typename Record>
78void UnboundQueue<Record>::Enqueue(const Record& rec) {
79 Node*& next = reinterpret_cast<Node*>(last_)->next;
80 next = new Node(rec);
81 OS::ReleaseStore(&last_, reinterpret_cast<AtomicWord>(next));
82 while (first_ != reinterpret_cast<Node*>(divider_)) DeleteFirst();
83}
84
Ben Murdoch7f4d5bd2010-06-15 11:15:29 +010085
86template<typename Record>
87Record* UnboundQueue<Record>::Peek() {
88 ASSERT(divider_ != last_);
89 Node* next = reinterpret_cast<Node*>(divider_)->next;
90 return &next->value;
91}
92
Leon Clarkef7060e22010-06-03 12:02:55 +010093} } // namespace v8::internal
94
95#endif // V8_UNBOUND_QUEUE_INL_H_