1use std::sync::atomic::{AtomicU8, Ordering};
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
24#[repr(u8)]
25pub enum DriverMode {
26 #[default]
30 Normal = 0,
31
32 Replay = 1,
37}
38
39impl DriverMode {
40 pub fn from_u8(value: u8) -> Self {
44 match value {
45 0 => Self::Normal,
46 1 => Self::Replay,
47 _ => Self::Normal, }
49 }
50
51 pub fn as_u8(self) -> u8 {
53 self as u8
54 }
55
56 pub fn is_replay(self) -> bool {
58 self == Self::Replay
59 }
60
61 pub fn is_normal(self) -> bool {
63 self == Self::Normal
64 }
65}
66
67#[derive(Debug)]
89pub struct AtomicDriverMode {
90 inner: AtomicU8,
91}
92
93impl AtomicDriverMode {
94 pub fn new(mode: DriverMode) -> Self {
96 Self {
97 inner: AtomicU8::new(mode.as_u8()),
98 }
99 }
100
101 pub fn get(&self, ordering: Ordering) -> DriverMode {
107 DriverMode::from_u8(self.inner.load(ordering))
108 }
109
110 pub fn set(&self, mode: DriverMode, ordering: Ordering) {
117 self.inner.store(mode.as_u8(), ordering);
118 }
119
120 pub fn compare_exchange(
133 &self,
134 current: DriverMode,
135 new: DriverMode,
136 success: Ordering,
137 failure: Ordering,
138 ) -> bool {
139 self.inner
140 .compare_exchange(current.as_u8(), new.as_u8(), success, failure)
141 .is_ok()
142 }
143}
144
145impl Clone for AtomicDriverMode {
146 fn clone(&self) -> Self {
147 Self::new(self.get(Ordering::Relaxed))
148 }
149}
150
151#[cfg(test)]
152mod tests {
153 use super::*;
154
155 #[test]
156 fn test_driver_mode_conversions() {
157 let normal = DriverMode::Normal;
158 let replay = DriverMode::Replay;
159
160 assert_eq!(normal.as_u8(), 0);
161 assert_eq!(replay.as_u8(), 1);
162
163 assert!(normal.is_normal());
164 assert!(!normal.is_replay());
165
166 assert!(replay.is_replay());
167 assert!(!replay.is_normal());
168 }
169
170 #[test]
171 fn test_from_u8() {
172 assert_eq!(DriverMode::from_u8(0), DriverMode::Normal);
173 assert_eq!(DriverMode::from_u8(1), DriverMode::Replay);
174 assert_eq!(DriverMode::from_u8(255), DriverMode::Normal); }
176
177 #[test]
178 fn test_atomic_driver_mode() {
179 let mode = AtomicDriverMode::new(DriverMode::Normal);
180
181 assert_eq!(mode.get(Ordering::Relaxed), DriverMode::Normal);
182
183 mode.set(DriverMode::Replay, Ordering::Relaxed);
184 assert_eq!(mode.get(Ordering::Relaxed), DriverMode::Replay);
185
186 assert!(mode.compare_exchange(
188 DriverMode::Replay,
189 DriverMode::Normal,
190 Ordering::Relaxed,
191 Ordering::Relaxed
192 ));
193 assert_eq!(mode.get(Ordering::Relaxed), DriverMode::Normal);
194
195 assert!(!mode.compare_exchange(
197 DriverMode::Replay, DriverMode::Replay,
199 Ordering::Relaxed,
200 Ordering::Relaxed
201 ));
202 }
203
204 #[test]
205 fn test_default() {
206 let mode: DriverMode = Default::default();
207 assert_eq!(mode, DriverMode::Normal);
208 }
209}