pub use crate::{
runtime::clock::{RqClockSample, SchedulerDeadlineUpdate, SchedulerRuntimeDeadline},
sched::system::{
CpuLifecycleState, CpuLoadSummary, CpuLocal, CpuLocalOwnerBorrow, CpuRemote, CpuSnapshot,
},
};
use crate::{
runtime::{
context::{current_cpu_remote, runtime_current_cpu, validate_schedule_context},
lock::PreemptScope,
switch::RuntimeScheduleOrigin,
task_runtime,
},
thread::TaskError,
};
pub unsafe fn current_needs_reschedule_pinned() -> Result<bool, TaskError> {
Ok(current_cpu_remote()
.ok_or(TaskError::NotInitialized)?
.needs_reschedule())
}
pub unsafe fn current_needs_immediate_scheduler_work_pinned() -> Result<bool, TaskError> {
Ok(current_cpu_remote()
.ok_or(TaskError::NotInitialized)?
.needs_immediate_scheduler_work())
}
pub fn current_cpu_needs_resched() -> Result<bool, TaskError> {
let _pin = PreemptScope::enter();
unsafe { current_needs_reschedule_pinned() }
}
#[doc(hidden)]
pub unsafe fn finish_current_cpu_idle_polling() -> Result<(), TaskError> {
let remote = current_cpu_remote().ok_or(TaskError::NotInitialized)?;
remote.finish_idle_wait();
Ok(())
}
pub fn idle_current_cpu_once() -> Result<(), TaskError> {
validate_schedule_context(RuntimeScheduleOrigin::Preempt)?;
let may_wait = {
let cpu = runtime_current_cpu()?;
cpu.prepare_idle_wait()
};
if may_wait {
task_runtime::wait_for_interrupt();
}
Ok(())
}
use crate::runtime::handle::opaque_handle;
opaque_handle!(
CurrentCpuLocalHandle,
"runtime::cpu"
);
opaque_handle!(
CpuRemoteHandle,
"runtime::cpu"
);
opaque_handle!(
IrqGuardToken,
"runtime::cpu"
);
opaque_handle!(
PreemptGuardToken,
"runtime::cpu"
);
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[repr(transparent)]
pub struct LocalIrqState(usize);
impl LocalIrqState {
pub const unsafe fn from_raw(raw: usize) -> Self {
Self(raw)
}
pub const fn into_raw(self) -> usize {
self.0
}
}
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[repr(transparent)]
pub struct RuntimeCpuId(u32);
impl RuntimeCpuId {
pub const fn new(value: u32) -> Self {
Self(value)
}
pub const fn as_u32(self) -> u32 {
self.0
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[repr(C)]
pub struct CurrentCpuOwnerHandles {
local: CurrentCpuLocalHandle,
remote: CpuRemoteHandle,
}
impl CurrentCpuOwnerHandles {
pub const NONE: Self = Self {
local: CurrentCpuLocalHandle::NONE,
remote: CpuRemoteHandle::NONE,
};
pub const unsafe fn new(local: CurrentCpuLocalHandle, remote: CpuRemoteHandle) -> Self {
Self { local, remote }
}
pub const fn local(self) -> CurrentCpuLocalHandle {
self.local
}
pub const fn remote(self) -> CpuRemoteHandle {
self.remote
}
}
pub use crate::sched::system::OwnerControlDrain;