#once-cell #static #no-std

no-std once_cell_no_std

Sync single assignment cells for no_std

2 releases

0.1.1 Oct 9, 2025
0.1.0 Oct 9, 2025

#945 in Rust patterns

Download history 364/week @ 2025-10-09 14/week @ 2025-10-16 3/week @ 2025-10-23

381 downloads per month

MIT/Apache

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!

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.

No runtime deps