urcu/rcu/
mod.rs

1//! Extra RCU types and functions.
2
3pub(crate) mod builder;
4pub(crate) mod callback;
5pub(crate) mod cleanup;
6pub(crate) mod context;
7pub(crate) mod flavor;
8pub(crate) mod guard;
9pub(crate) mod poller;
10pub(crate) mod reference;
11
12pub use crate::rcu::callback::{RcuCall, RcuCallFn, RcuDefer, RcuDeferFn};
13pub use crate::rcu::reference::RcuRefBox;
14
15/// Returns an immutable RCU-protected pointer.
16///
17/// > It does not actually dereference the pointer, instead, it protects the pointer
18/// > for later dereferencing. It also executes any needed memory-barrier instructions
19/// > for a given CPU architecture.
20///
21/// #### Safety
22///
23/// * The thread must be inside a RCU critical section.
24pub unsafe fn dereference<T>(pointer: *const T) -> *const T {
25    // SAFETY: It is safe to cast the pointer to a void*.
26    unsafe { urcu_sys::rcu_dereference(pointer as *mut std::ffi::c_void) as *const T }
27}
28
29/// Returns a mutable RCU-protected pointer.
30///
31/// > It does not actually dereference the pointer, instead, it protects the pointer
32/// > for later dereferencing. It also executes any needed memory-barrier instructions
33/// > for a given CPU architecture.
34///
35/// #### Safety
36///
37/// * The thread must be inside a RCU critical section.
38pub unsafe fn dereference_mut<T>(pointer: *mut T) -> *mut T {
39    // SAFETY: It is safe to cast the pointer to a void*.
40    unsafe { urcu_sys::rcu_dereference(pointer as *mut std::ffi::c_void) as *mut T }
41}
42
43/// Defines flavor-specific types for `liburcu-bp`.
44#[cfg(feature = "flavor-bp")]
45pub mod bp {
46
47    pub use crate::rcu::context::RcuContextBp;
48    pub use crate::rcu::flavor::RcuFlavorBp;
49    pub use crate::rcu::guard::RcuGuardBp;
50    pub use crate::rcu::poller::RcuPollerBp;
51}
52
53/// Defines flavor-specific types for `liburcu-mb`.
54#[cfg(feature = "flavor-mb")]
55pub mod mb {
56    pub use crate::rcu::context::RcuContextMb;
57    pub use crate::rcu::flavor::RcuFlavorMb;
58    pub use crate::rcu::guard::RcuGuardMb;
59    pub use crate::rcu::poller::RcuPollerMb;
60}
61
62/// Defines flavor-specific types for `liburcu-memb`.
63#[cfg(feature = "flavor-memb")]
64pub mod memb {
65    pub use crate::rcu::context::RcuContextMemb;
66    pub use crate::rcu::flavor::RcuFlavorMemb;
67    pub use crate::rcu::guard::RcuGuardMemb;
68    pub use crate::rcu::poller::RcuPollerMemb;
69}
70
71/// Defines flavor-specific types for `liburcu-qsbr`.
72#[cfg(feature = "flavor-qsbr")]
73pub mod qsbr {
74    pub use crate::rcu::context::RcuContextQsbr;
75    pub use crate::rcu::flavor::RcuFlavorQsbr;
76    pub use crate::rcu::guard::RcuGuardQsbr;
77    pub use crate::rcu::poller::RcuPollerQsbr;
78}
79
80/// Defines flavor-specific types for the default flavor.
81pub mod default {
82    #[cfg(feature = "flavor-memb")]
83    mod memb {
84        /// Defines the default RCU flavor.
85        pub type RcuDefaultFlavor = crate::rcu::flavor::RcuFlavorMemb;
86
87        /// Defines the default RCU guard.
88        pub type RcuDefaultGuard<'a> = crate::rcu::guard::RcuGuardMemb<'a>;
89
90        /// Defines the default RCU poller.
91        pub type RcuDefaultPoller<'a> = crate::rcu::poller::RcuPollerMemb<'a>;
92
93        /// Defines the default RCU context.
94        pub type RcuDefaultContext<const READ: bool = false, const DEFER: bool = false> =
95            crate::rcu::context::RcuContextMemb<READ, DEFER>;
96    }
97
98    #[cfg(all(not(feature = "flavor-memb"), feature = "flavor-mb"))]
99    mod mb {
100        /// Defines the default RCU flavor.
101        pub type RcuDefaultFlavor = crate::rcu::flavor::RcuFlavorMb;
102
103        /// Defines the default RCU guard.
104        pub type RcuDefaultGuard<'a> = crate::rcu::guard::RcuGuardMb<'a>;
105
106        /// Defines the default RCU poller.
107        pub type RcuDefaultPoller<'a> = crate::rcu::poller::RcuPollerMb<'a>;
108
109        /// Defines the default RCU context.
110        pub type RcuDefaultContext<const READ: bool = false, const DEFER: bool = false> =
111            crate::rcu::context::RcuContextMb<READ, DEFER>;
112    }
113
114    #[cfg(all(
115        not(feature = "flavor-memb"),
116        not(feature = "flavor-mb"),
117        feature = "flavor-bp"
118    ))]
119    mod bp {
120        /// Defines the default RCU flavor.
121        pub type RcuDefaultFlavor = crate::rcu::flavor::RcuFlavorBp;
122
123        /// Defines the default RCU guard.
124        pub type RcuDefaultGuard<'a> = crate::rcu::guard::RcuGuardBp<'a>;
125
126        /// Defines the default RCU poller.
127        pub type RcuDefaultPoller<'a> = crate::rcu::poller::RcuPollerBp<'a>;
128
129        /// Defines the default RCU context.
130        pub type RcuDefaultContext<const READ: bool = false, const DEFER: bool = false> =
131            crate::rcu::context::RcuContextBp<READ, DEFER>;
132    }
133
134    #[cfg(all(
135        not(feature = "flavor-memb"),
136        not(feature = "flavor-mb"),
137        not(feature = "flavor-bp"),
138        feature = "flavor-qsbr"
139    ))]
140    mod qsbr {
141        /// Defines the default RCU flavor.
142        pub type RcuDefaultFlavor = crate::rcu::flavor::RcuFlavorQsbr;
143
144        /// Defines the default RCU guard.
145        pub type RcuDefaultGuard<'a> = crate::rcu::guard::RcuGuardQsbr<'a>;
146
147        /// Defines the default RCU poller.
148        pub type RcuDefaultPoller<'a> = crate::rcu::poller::RcuPollerQsbr<'a>;
149
150        /// Defines the default RCU context.
151        pub type RcuDefaultContext<const READ: bool = false, const DEFER: bool = false> =
152            crate::rcu::context::RcuContextQsbr<READ, DEFER>;
153    }
154
155    #[cfg(feature = "flavor-memb")]
156    pub use memb::*;
157
158    #[cfg(all(not(feature = "flavor-memb"), feature = "flavor-mb"))]
159    pub use mb::*;
160
161    #[cfg(all(
162        not(feature = "flavor-memb"),
163        not(feature = "flavor-mb"),
164        feature = "flavor-bp"
165    ))]
166    pub use bp::*;
167
168    #[cfg(all(
169        not(feature = "flavor-memb"),
170        not(feature = "flavor-mb"),
171        not(feature = "flavor-bp"),
172        feature = "flavor-qsbr"
173    ))]
174    pub use qsbr::*;
175}