Move libcds 1.6.0 from SVN
[libcds.git] / cds / intrusive / deque_stat.h
1 //$$CDS-header$$
2
3 #ifndef __CDS_INTRUSIVE_DEQUE_STAT_H
4 #define __CDS_INTRUSIVE_DEQUE_STAT_H
5
6 #include <cds/cxx11_atomic.h>
7
8 namespace cds { namespace intrusive {
9
10     /// Deque 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::atomics::event_counter.
14         You may use other counter type like as cds::atomics::item_counter,
15         or even integral type, for example, \p int.
16     */
17     template <typename Counter = cds::atomicity::event_counter >
18     struct deque_stat
19     {
20         typedef Counter     counter_type    ;   ///< Counter type
21
22         counter_type m_PushFrontCount       ;   ///< push front event count
23         counter_type m_PushBackCount        ;   ///< push back event count
24         counter_type m_PopFrontCount        ;   ///< pop front event count
25         counter_type m_PopBackCount         ;   ///< pop back event count
26         counter_type m_PopEmptyCount        ;   ///< pop from empty deque event count
27         counter_type m_PushFrontContentionCount ;   ///< \p push_front contention count
28         counter_type m_PushBackContentionCount ;    ///< \p push_back contention count
29         counter_type m_PopFrontContentionCount ;   ///< \p pop_front contention count
30         counter_type m_PopBackContentionCount ;    ///< \p pop_back contention count
31
32         /// Register \p push_front call
33         void onPushFront()               { ++m_PushFrontCount; }
34
35         /// Register \p push_back call
36         void onPushBack()               { ++m_PushBackCount; }
37
38         /// Register \p pop_front call
39         void onPopFront()                { ++m_PopFrontCount; }
40
41         /// Register \p pop_back call
42         void onPopBack()                { ++m_PopBackCount; }
43
44         /// Register popping from empty deque
45         void onPopEmpty()               { ++m_PopEmptyCount; }
46
47         /// Register "\p push_front contention" event
48         void onPushFrontContention()    { ++m_PushFrontContentionCount; }
49
50         /// Register "\p push_back contention" event
51         void onPushBackContention()     { ++m_PushBackContentionCount; }
52
53         /// Register "\p pop_front contention" event
54         void onPopFrontContention()     { ++m_PopFrontContentionCount; }
55
56         /// Register "\p pop_back contention" event
57         void onPopBackContention()      { ++m_PopBackContentionCount; }
58     };
59
60
61     /// Dummy deque statistics - no counting is performed. Support interface like \ref deque_stat
62     /** @ingroup cds_intrusive_helper
63     */
64     struct deque_dummy_stat
65     {
66         //@cond
67         void onPushFront()              {}
68         void onPushBack()               {}
69         void onPopFront()               {}
70         void onPopBack()                {}
71         void onPopEmpty()               {}
72         void onPushFrontContention()    {}
73         void onPushBackContention()     {}
74         void onPopFrontContention()     {}
75         void onPopBackContention()      {}
76         //@endcond
77     };
78
79 }}  // namespace cds::intrusive
80
81
82 #endif  // #ifndef __CDS_INTRUSIVE_DEQUE_STAT_H