diff options
Diffstat (limited to 'cli/util')
-rw-r--r-- | cli/util/mod.rs | 1 | ||||
-rw-r--r-- | cli/util/sync.rs | 35 |
2 files changed, 36 insertions, 0 deletions
diff --git a/cli/util/mod.rs b/cli/util/mod.rs index c3133cc10..61511679f 100644 --- a/cli/util/mod.rs +++ b/cli/util/mod.rs @@ -11,6 +11,7 @@ pub mod fs; pub mod logger; pub mod path; pub mod progress_bar; +pub mod sync; pub mod text_encoding; pub mod time; pub mod unix; diff --git a/cli/util/sync.rs b/cli/util/sync.rs new file mode 100644 index 000000000..6d136abc1 --- /dev/null +++ b/cli/util/sync.rs @@ -0,0 +1,35 @@ +// Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. + +use std::sync::atomic::AtomicBool; +use std::sync::atomic::Ordering; + +/// Simplifies the use of an atomic boolean as a flag. +#[derive(Debug, Default)] +pub struct AtomicFlag(AtomicBool); + +impl AtomicFlag { + /// Raises the flag returning if the raise was successful. + pub fn raise(&self) -> bool { + !self.0.swap(true, Ordering::SeqCst) + } + + /// Gets if the flag is raised. + pub fn is_raised(&self) -> bool { + self.0.load(Ordering::SeqCst) + } +} + +#[cfg(test)] +mod test { + use super::AtomicFlag; + + #[test] + fn atomic_flag_raises() { + let flag = AtomicFlag::default(); + assert!(!flag.is_raised()); // false by default + assert!(flag.raise()); + assert!(flag.is_raised()); + assert!(!flag.raise()); + assert!(flag.is_raised()); + } +} |