ostd/task/preempt/guard.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
// SPDX-License-Identifier: MPL-2.0
use crate::{sync::GuardTransfer, task::atomic_mode::InAtomicMode};
/// A guard for disable preempt.
#[clippy::has_significant_drop]
#[must_use]
#[derive(Debug)]
// #[concur::lock(no_preempt)]
// #[safety::Memo(LockNoInterrupt)] // FIXME: support safety attr on struct
pub struct DisabledPreemptGuard {
// This private field prevents user from constructing values of this type directly.
_private: (),
}
impl !Send for DisabledPreemptGuard {}
// SAFETY: The guard disables preemptions, which meets the second
// sufficient condition for atomic mode.
unsafe impl InAtomicMode for DisabledPreemptGuard {}
impl DisabledPreemptGuard {
fn new() -> Self {
super::cpu_local::inc_guard_count();
Self { _private: () }
}
}
impl GuardTransfer for DisabledPreemptGuard {
fn transfer_to(&mut self) -> Self {
disable_preempt()
}
}
impl Drop for DisabledPreemptGuard {
fn drop(&mut self) {
super::cpu_local::dec_guard_count();
}
}
/// Disables preemption.
pub fn disable_preempt() -> DisabledPreemptGuard {
DisabledPreemptGuard::new()
}