use core::ptr::NonNull;
use cpu_local::CurrentThreadHeader;
use crate::KernelTlsBase;
#[repr(C)]
#[derive(Debug, Default)]
pub struct TaskLocalState {
pub(crate) current_header: usize,
pub(crate) kernel_tls: KernelTlsBase,
}
impl TaskLocalState {
pub const fn new() -> Self {
Self {
current_header: 0,
kernel_tls: KernelTlsBase::new(0),
}
}
pub(crate) fn set_kernel_tls(&mut self, kernel_tls: KernelTlsBase) {
self.kernel_tls = KernelTlsBase::for_task_context(kernel_tls);
}
pub fn set_current_header(&mut self, header: NonNull<CurrentThreadHeader>) {
self.current_header = header.as_ptr() as usize;
}
pub const fn current_header(&self) -> Option<NonNull<CurrentThreadHeader>> {
NonNull::new(self.current_header as *mut CurrentThreadHeader)
}
}
const _: () = {
assert!(core::mem::size_of::<TaskLocalState>() == 2 * core::mem::size_of::<usize>());
assert!(core::mem::align_of::<TaskLocalState>() == core::mem::align_of::<usize>());
};