blob: c53b35a8edb7901dff3b537ea4b62c86e18fc67c [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// 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_