Remove cds/detail/functor_wrapper.h
[libcds.git] / cds / intrusive / details / queue_stat.h
1 //$$CDS-header$$
2
3 #ifndef __CDS_INTRUSIVE_DETAILS_QUEUE_STAT_H
4 #define __CDS_INTRUSIVE_DETAILS_QUEUE_STAT_H
5
6 #include <cds/cxx11_atomic.h>
7
8 namespace cds { namespace intrusive {
9
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.
17     */
18     template <typename Counter = cds::atomicity::event_counter >
19     struct queue_stat
20     {
21         typedef Counter     counter_type    ;   ///< Counter type
22
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"
29
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; }
42
43         //@cond
44         void reset()
45         {
46             m_EnqueueCount.reset();
47             m_DequeueCount.reset();
48             m_EnqueueRace.reset();
49             m_DequeueRace.reset();
50             m_AdvanceTailError.reset();
51             m_BadTail.reset();
52         }
53
54         queue_stat& operator +=( queue_stat const& s )
55         {
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();
62
63             return *this;
64         }
65         //@endcond
66     };
67
68     /// Dummy queue statistics - no counting is performed. Support interface like \ref queue_stat
69     /** @ingroup cds_intrusive_helper
70     */
71     struct queue_dummy_stat
72     {
73         //@cond
74         void onEnqueue()                {}
75         void onDequeue()                {}
76         void onEnqueueRace()            {}
77         void onDequeueRace()            {}
78         void onAdvanceTailFailed()      {}
79         void onBadTail()                {}
80
81         void reset() {}
82         queue_dummy_stat& operator +=( queue_dummy_stat const& s )
83         {
84             return *this;
85         }
86         //@endcond
87     };
88
89
90 }}  // namespace cds::intrusive
91
92
93 #endif  // #ifndef __CDS_INTRUSIVE_DETAILS_QUEUE_STAT_H