Skip to content

phil-opp/once_cell_no_std

Repository files navigation

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.

About

Rust crate providing `Sync` single assignment cells for `no_std`

Resources

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT

Stars

Watchers

Forks

Packages

No packages published

Contributors 56

Languages