Move libcds 1.6.0 from SVN
[libcds.git] / cds / urcu / options.h
1 //$$CDS-header$$
2
3 #ifndef _CDS_URCU_OPTIONS_H
4 #define _CDS_URCU_OPTIONS_H
5
6 #include <cds/details/defs.h>
7
8 namespace cds { namespace urcu {
9     /// Exception "RCU deadlock detected"
10     /**@anchor cds_urcu_rcu_deadlock
11         This exception is raised when \p cds::opt::v::rcu_throw_deadlock deadlock checking policy
12         is used, see \p cds::opt::rcu_check_deadlock option.
13     */
14     class rcu_deadlock: public cds::Exception
15     {
16         //@cond
17         typedef cds::Exception base_class;
18     public:
19         rcu_deadlock()
20             : base_class( "RCU deadlock detected")
21         {}
22         //@endcond
23     };
24 }} // namespace cds::urcu
25
26
27 namespace cds { namespace opt {
28
29     /// [type-option] RCU check deadlock option setter
30     /**
31         The RCU containers can check if a deadlock between read-side critical section
32         and \p synchronize call is possible.
33         This option specifies a policy for checking this situation.
34         Possible \p Type is:
35         - \p opt::v::rcu_no_check_deadlock - no deadlock checking
36         - \p opt::v::rcu_assert_deadlock - call \p assert in debug mode only
37         - \p opt::v::rcu_throw_deadlock - throw an \p cds::urcu::rcu_deadlock exception when a deadlock
38             is encountered
39
40         Usually, the default \p Type for this option is \p opt::v::rcu_throw_deadlock.
41     */
42     template <typename Type>
43     struct rcu_check_deadlock
44     {
45         //@cond
46         template <typename Base> struct pack: public Base
47         {
48             typedef Type rcu_check_deadlock;
49         };
50         //@endcond
51     };
52
53     namespace v {
54         /// \ref opt::rcu_check_deadlock option value: no deadlock checking
55         struct rcu_no_check_deadlock {};
56
57         /// \ref opt::rcu_check_deadlock option value: call \p assert in debug mode only
58         struct rcu_assert_deadlock {};
59
60         /// \ref opt::rcu_check_deadlock option value: throw a cds::urcu::rcu_deadlock exception when a deadlock detected
61         struct rcu_throw_deadlock {};
62     }
63 }}  // namespace cds::opt
64
65
66 #endif  // #ifndef _CDS_URCU_OPTIONS_H