Skip to content

Commit a01b629

Browse files
committed
cut-spaghetti-import.
1 parent a98ea4e commit a01b629

1 file changed

Lines changed: 24 additions & 1 deletion

File tree

tock/kernel/src/lib.rs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2564,7 +2564,30 @@ use core::{mem, ptr, slice, str};
25642564

25652565
use crate::callback::{AppId, CallbackId};
25662566
use crate::capabilities::ProcessManagementCapability;
2567-
use crate::common::cells::MapCell;
2567+
struct MapCell<T> {
2568+
val: core::cell::UnsafeCell<core::mem::MaybeUninit<T>>,
2569+
occupied: Cell<bool>,
2570+
}
2571+
impl<T> MapCell<T> {
2572+
pub fn is_some(&self) -> bool {
2573+
self.occupied.get()
2574+
}
2575+
pub fn map<F, R>(&self, closure: F) -> Option<R>
2576+
where
2577+
F: FnOnce(&mut T) -> R,
2578+
{
2579+
if self.is_some() {
2580+
self.occupied.set(false);
2581+
let valref = unsafe { &mut *self.val.get() };
2582+
// TODO: change to valref.get_mut() once stabilized [#53491](https://github.com/rust-lang/rust/issues/53491)
2583+
let res = closure(unsafe { &mut *valref.as_mut_ptr() });
2584+
self.occupied.set(true);
2585+
Some(res)
2586+
} else {
2587+
None
2588+
}
2589+
}
2590+
}
25682591
use crate::common::{Queue, RingBuffer};
25692592
use crate::mem::{AppSlice, Shared};
25702593
use crate::platform::mpu::{self, MPU};

0 commit comments

Comments
 (0)