Home | History | Annotate | Download | only in profiler
      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