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