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_H_ 6 #define V8_PROFILER_UNBOUND_QUEUE_H_ 7 8 #include "src/allocation.h" 9 #include "src/base/atomicops.h" 10 11 namespace v8 { 12 namespace 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 21 template<typename Record> 22 class UnboundQueue BASE_EMBEDDED { 23 public: 24 inline UnboundQueue(); 25 inline ~UnboundQueue(); 26 27 V8_INLINE bool Dequeue(Record* rec); 28 V8_INLINE void Enqueue(const Record& rec); 29 V8_INLINE bool IsEmpty() const; 30 V8_INLINE Record* Peek() const; 31 32 private: 33 V8_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_H_ 49