diff --git a/src/core/utils/stream/band.rs b/src/core/utils/stream/band.rs new file mode 100644 index 00000000..76f2a85a --- /dev/null +++ b/src/core/utils/stream/band.rs @@ -0,0 +1,26 @@ +use std::sync::atomic::{AtomicUsize, Ordering}; + +/// Stream concurrency factor; this is a live value. +static WIDTH: AtomicUsize = AtomicUsize::new(32); + +/// Practicable limits on the stream width +pub const WIDTH_LIMIT: (usize, usize) = (1, 1024); + +/// Sets the live concurrency factor. The first return value is the previous +/// width which was replaced. The second return value is the value which was set +/// after any applied limits. +pub fn set_width(width: usize) -> (usize, usize) { + let width = width.clamp(WIDTH_LIMIT.0, WIDTH_LIMIT.1); + (WIDTH.swap(width, Ordering::Relaxed), width) +} + +/// Used by stream operations where the concurrency factor hasn't been manually +/// supplied by the caller (most uses). Instead we provide a default value which +/// is adjusted at startup for the specific system and also dynamically. +#[inline] +pub fn automatic_width() -> usize { + let width = WIDTH.load(Ordering::Relaxed); + debug_assert!(width >= WIDTH_LIMIT.0, "WIDTH should not be zero"); + debug_assert!(width <= WIDTH_LIMIT.1, "WIDTH is probably too large"); + width +} diff --git a/src/core/utils/stream/mod.rs b/src/core/utils/stream/mod.rs index 4456784f..a5ef17c5 100644 --- a/src/core/utils/stream/mod.rs +++ b/src/core/utils/stream/mod.rs @@ -1,3 +1,4 @@ +mod band; mod broadband; mod cloned; mod expect; @@ -9,6 +10,7 @@ mod try_broadband; mod try_ready; mod wideband; +pub use band::{automatic_width, set_width, WIDTH_LIMIT}; pub use broadband::BroadbandExt; pub use cloned::Cloned; pub use expect::TryExpect; @@ -19,32 +21,3 @@ pub use tools::Tools; pub use try_broadband::TryBroadbandExt; pub use try_ready::TryReadyExt; pub use wideband::WidebandExt; - -/// Stream concurrency factor; this is a live value. -static WIDTH: std::sync::atomic::AtomicUsize = std::sync::atomic::AtomicUsize::new(32); - -/// Practicable limits on the stream width -pub const WIDTH_LIMIT: (usize, usize) = (1, 1024); - -/// Sets the live concurrency factor. The first return value is the previous -/// width which was replaced. The second return value is the value which was set -/// after any applied limits. -pub fn set_width(width: usize) -> (usize, usize) { - use std::sync::atomic::Ordering; - - let width = width.clamp(WIDTH_LIMIT.0, WIDTH_LIMIT.1); - (WIDTH.swap(width, Ordering::Relaxed), width) -} - -/// Used by stream operations where the concurrency factor hasn't been manually -/// supplied by the caller (most uses). Instead we provide a default value which -/// is adjusted at startup for the specific system and also dynamically. -#[inline] -pub fn automatic_width() -> usize { - use std::sync::atomic::Ordering; - - let width = WIDTH.load(Ordering::Relaxed); - debug_assert!(width >= WIDTH_LIMIT.0, "WIDTH should not be zero"); - debug_assert!(width <= WIDTH_LIMIT.1, "WIDTH is probably too large"); - width -}