3 #ifndef __CDS_INTRUSIVE_DETAILS_QUEUE_STAT_H
4 #define __CDS_INTRUSIVE_DETAILS_QUEUE_STAT_H
6 #include <cds/cxx11_atomic.h>
8 namespace cds { namespace intrusive {
10 /// Queue internal statistics. May be used for debugging or profiling
11 /** @ingroup cds_intrusive_helper
12 Template argument \p Counter defines type of counter.
13 Default is cds::atomicity::event_counter, that is weak, i.e. it is not guaranteed
14 strict event counting.
15 You may use stronger type of counter like as cds::atomicity::item_counter,
16 or even integral type, for example, \p int.
18 template <typename Counter = cds::atomicity::event_counter >
21 typedef Counter counter_type ; ///< Counter type
23 counter_type m_EnqueueCount ; ///< Enqueue call count
24 counter_type m_DequeueCount ; ///< Dequeue call count
25 counter_type m_EnqueueRace ; ///< Count of enqueue race conditions encountered
26 counter_type m_DequeueRace ; ///< Count of dequeue race conditions encountered
27 counter_type m_AdvanceTailError ; ///< Count of "advance tail failed" events
28 counter_type m_BadTail ; ///< Count of events "Tail is not pointed to the last item in the queue"
30 /// Register enqueue call
31 void onEnqueue() { ++m_EnqueueCount; }
32 /// Register dequeue call
33 void onDequeue() { ++m_DequeueCount; }
34 /// Register enqueue race event
35 void onEnqueueRace() { ++m_EnqueueRace; }
36 /// Register dequeue race event
37 void onDequeueRace() { ++m_DequeueRace; }
38 /// Register "advance tail failed" event
39 void onAdvanceTailFailed() { ++m_AdvanceTailError; }
40 /// Register event "Tail is not pointed to last item in the queue"
41 void onBadTail() { ++m_BadTail; }
46 m_EnqueueCount.reset();
47 m_DequeueCount.reset();
48 m_EnqueueRace.reset();
49 m_DequeueRace.reset();
50 m_AdvanceTailError.reset();
54 queue_stat& operator +=( queue_stat const& s )
56 m_EnqueueCount += s.m_EnqueueCount.get();
57 m_DequeueCount += s.m_DequeueCount.get();
58 m_EnqueueRace += s.m_EnqueueRace.get();
59 m_DequeueRace += s.m_DequeueRace.get();
60 m_AdvanceTailError += s.m_AdvanceTailError.get();
61 m_BadTail += s.m_BadTail.get();
68 /// Dummy queue statistics - no counting is performed. Support interface like \ref queue_stat
69 /** @ingroup cds_intrusive_helper
71 struct queue_dummy_stat
76 void onEnqueueRace() {}
77 void onDequeueRace() {}
78 void onAdvanceTailFailed() {}
82 queue_dummy_stat& operator +=( queue_dummy_stat const& s )
90 }} // namespace cds::intrusive
93 #endif // #ifndef __CDS_INTRUSIVE_DETAILS_QUEUE_STAT_H