2 releases
| 0.1.1 | Oct 9, 2025 |
|---|---|
| 0.1.0 | Oct 9, 2025 |
#945 in Rust patterns
381 downloads per month
30KB
227 lines
once_cell_no_std
The once_cell_no_std crate provides a no_std OnceCell type that implements Sync and can be used in
statics. It does not use spinlocks or any other form of blocking. Instead, concurrent
initialization is reported as an explicit ConcurrentInitialization error that the caller can
handle as it likes.
OnceCell might store arbitrary non-Copy types, can be assigned to at most once and provide direct access
to the stored contents. In a nutshell, API looks roughly like this:
impl OnceCell<T> {
fn new() -> OnceCell<T> { ... }
fn set(&self, value: T) -> Result<Result<(), T>, ConcurrentInitialization> { ... }
fn get(&self) -> Option<&T> { ... }
}
Note that, like with RefCell and Mutex, the set method requires only a shared reference.
Because of the single assignment restriction get can return an &T instead of Ref<T>
or MutexGuard<T>.
More patterns and use-cases are in the docs!
Related crates
This crate was forked from the great
once_cell crate. The original once_cell crate
provides two flavors of OnceCell types: unsync::OnceCell and
sync::OnceCell. The following
table compares the types against once_cell_no_std::OnceCell:
OnceCell (this crate) |
once_cell::sync::OnceCell |
once_cell::unsync::OnceCell |
|
|---|---|---|---|
implements Sync |
yes | yes | no |
| concurrent initialization leads to | ConcurrentInitialization error returned |
thread blocked | cannot happen |
no_std supported |
yes | partially (requires critical-section implementation) |
yes |
Parts of once_cell API are included into std/core as of Rust 1.70.0.
The following table compares once_cell_no_std::OnceCell against the core::cell::OnceCell and std::sync::OnceLock types:
OnceCell (this crate) |
std::sync::OnceLock |
core::cell::OnceCell |
|
|---|---|---|---|
implements Sync |
yes | yes | no |
| concurrent initialization leads to | ConcurrentInitialization error returned |
thread blocked | cannot happen |
no_std supported |
yes | no | yes |
For more related crates, check out the README of once_cell.