1 unstable release
0.1.0 | Jul 22, 2024 |
---|
#1732 in Embedded development
287 downloads per month
13KB
98 lines
percore
Safe per-CPU core mutable state on no_std platforms through exception masking.
This crate provides two main wrapper types: PerCore
to provide an instance of a value per
CPU core, where each core can access only its instance, and ExceptionLock
to guard a value
so that it can only be accessed while exceptions are masked. These may be combined with
RefCell
to provide safe per-core mutable state.
ExceptionLock
may also be combined with a spinlock-based mutex (such as one provided by the
spin
crate) to avoid deadlocks when accessing global mutable
state from exception handlers.
Example
use core::cell::RefCell;
use percore::{exception_free, Cores, ExceptionLock, PerCore};
/// The total number of CPU cores in the target system.
const CORE_COUNT: usize = 2;
struct CoresImpl;
unsafe impl Cores for CoresImpl {
fn core_index() -> usize {
todo!("Return the index of the current CPU core, 0 or 1")
}
}
struct CoreState {
// Your per-core mutable state goes here...
foo: u32,
}
const EMPTY_CORE_STATE: ExceptionLock<RefCell<CoreState>> =
ExceptionLock::new(RefCell::new(CoreState { foo: 0 }));
static CORE_STATE: PerCore<ExceptionLock<RefCell<CoreState>>, CoresImpl, CORE_COUNT> =
PerCore::new([EMPTY_CORE_STATE; CORE_COUNT]);
fn main() {
// Mask exceptions while accessing mutable state.
exception_free(|token| {
// `token` proves that interrupts are masked, so we can safely access per-core mutable
// state.
CORE_STATE.get().borrow_mut(token).foo = 42;
});
}
This is not an officially supported Google product.
Supported architectures
Currently only aarch64 is fully supported. The crate will build for other architectures, but you'll
need to provide your own implementation of the exception_free
function. Patches are welcome to add
support for other architectures.
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Contributing
If you want to contribute to the project, see details of how we accept contributions.