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