#[cfg(feature = "priority_boost")]
use core::sync::atomic::Ordering;
use r3_core::kernel::{traits::KernelBase as _, BoostPriorityError};
use crate::{error::BadContextError, KernelTraits, System};
#[cfg(feature = "priority_boost")]
use crate::{klock, task};
pub(super) fn expect_task_context<Traits: KernelTraits>() -> Result<(), BadContextError> {
if !Traits::is_task_context() {
Err(BadContextError::BadContext)
} else {
Ok(())
}
}
pub(super) fn expect_waitable_context<Traits: KernelTraits>() -> Result<(), BadContextError> {
if !Traits::is_task_context() || System::<Traits>::raw_is_priority_boost_active() {
Err(BadContextError::BadContext)
} else {
Ok(())
}
}
#[cfg(feature = "priority_boost")]
pub(super) fn boost_priority<Traits: KernelTraits>() -> Result<(), BoostPriorityError> {
if Traits::is_cpu_lock_active()
|| !Traits::is_task_context()
|| System::<Traits>::raw_is_priority_boost_active()
{
Err(BoostPriorityError::BadContext)
} else {
Traits::state()
.priority_boost
.store(true, Ordering::Relaxed);
Ok(())
}
}
#[cfg(feature = "priority_boost")]
pub(super) fn unboost_priority<Traits: KernelTraits>() -> Result<(), BoostPriorityError> {
if !Traits::is_task_context() || !System::<Traits>::raw_is_priority_boost_active() {
Err(BoostPriorityError::BadContext)
} else {
let lock = klock::lock_cpu()?;
Traits::state()
.priority_boost
.store(false, Ordering::Relaxed);
task::unlock_cpu_and_check_preemption::<Traits>(lock);
Ok(())
}
}
#[cfg(not(feature = "priority_boost"))]
pub(super) fn unboost_priority<Traits: KernelTraits>() -> Result<(), BoostPriorityError> {
Err(BoostPriorityError::BadContext)
}