use core::ptr::NonNull;
use crate::{KernelTlsBase, context::TaskAnchor};
#[repr(C)]
#[derive(Debug, Default)]
pub struct TaskLocalState {
pub(crate) context_header: usize,
pub(crate) kernel_tls: KernelTlsBase,
}
impl TaskLocalState {
pub(crate) fn set_kernel_tls(&mut self, kernel_tls: KernelTlsBase) {
self.kernel_tls = KernelTlsBase::for_task_context(kernel_tls);
}
pub fn set_task_anchor(&mut self, header: TaskAnchor) {
self.context_header = header.as_ptr() as usize;
}
pub const fn task_anchor(&self) -> Option<TaskAnchor> {
match NonNull::new(self.context_header as *mut ()) {
Some(pointer) => Some(TaskAnchor::new(pointer)),
None => None,
}
}
}
const _: () = {
assert!(core::mem::size_of::<TaskLocalState>() == 2 * core::mem::size_of::<usize>());
assert!(core::mem::align_of::<TaskLocalState>() == core::mem::align_of::<usize>());
};