Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / v8 / src / unbound-queue.h
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.
4
5 #ifndef V8_UNBOUND_QUEUE_
6 #define V8_UNBOUND_QUEUE_
7
8 #include "allocation.h"
9
10 namespace v8 {
11 namespace internal {
12
13
14 // Lock-free unbound queue for small records.  Intended for
15 // transferring small records between a Single producer and a Single
16 // consumer. Doesn't have restrictions on the number of queued
17 // elements, so producer never blocks.  Implemented after Herb
18 // Sutter's article:
19 // http://www.ddj.com/high-performance-computing/210604448
20 template<typename Record>
21 class UnboundQueue BASE_EMBEDDED {
22  public:
23   inline UnboundQueue();
24   inline ~UnboundQueue();
25
26   INLINE(bool Dequeue(Record* rec));
27   INLINE(void Enqueue(const Record& rec));
28   INLINE(bool IsEmpty() const);
29   INLINE(Record* Peek() const);
30
31  private:
32   INLINE(void DeleteFirst());
33
34   struct Node;
35
36   Node* first_;
37   AtomicWord divider_;  // Node*
38   AtomicWord last_;     // Node*
39
40   DISALLOW_COPY_AND_ASSIGN(UnboundQueue);
41 };
42
43
44 } }  // namespace v8::internal
45
46 #endif  // V8_UNBOUND_QUEUE_