Tweak identifiers and comments

This commit is contained in:
Dániel Buga 2023-08-12 22:42:50 +02:00
parent d5e66f6f87
commit 6ab0d71d92
6 changed files with 50 additions and 47 deletions

View File

@ -11,27 +11,22 @@ mod thread {
use crate::thread::ThreadContext; use crate::thread::ThreadContext;
#[export_name = "__thread_mode_pender"] #[export_name = "__thread_mode_pender"]
fn __thread_mode_pender(_core_id: OpaqueThreadContext) { fn __thread_mode_pender(_context: OpaqueThreadContext) {
unsafe { core::arch::asm!("sev") } unsafe { core::arch::asm!("sev") }
} }
/// TODO /// TODO
// Name pending // Name pending
#[derive(Default)] // Default enables Executor::new #[derive(Default)] // Default enables Executor::new
pub struct CortexMThreadContext; pub struct Context;
impl ThreadContext for CortexMThreadContext { impl ThreadContext for Context {
#[cfg(feature = "thread-context")] #[cfg(feature = "thread-context")]
fn context(&self) -> OpaqueThreadContext { fn context(&self) -> OpaqueThreadContext {
// Enabling thread-context is not incorrect, just wasteful. // Enabling thread-context is not incorrect, just wasteful.
OpaqueThreadContext(0) OpaqueThreadContext(0)
} }
#[cfg(not(feature = "thread-context"))]
fn context(&self) -> OpaqueThreadContext {
OpaqueThreadContext(())
}
fn wait(&mut self) { fn wait(&mut self) {
unsafe { core::arch::asm!("wfe") } unsafe { core::arch::asm!("wfe") }
} }
@ -39,7 +34,7 @@ mod thread {
/// TODO /// TODO
// Type alias for backwards compatibility // Type alias for backwards compatibility
pub type Executor = crate::thread::ThreadModeExecutor<CortexMThreadContext>; pub type Executor = crate::thread::ThreadModeExecutor<Context>;
} }
// None of this has to be public, I guess? // None of this has to be public, I guess?

View File

@ -17,27 +17,22 @@ mod thread {
static SIGNAL_WORK_THREAD_MODE: AtomicBool = AtomicBool::new(false); static SIGNAL_WORK_THREAD_MODE: AtomicBool = AtomicBool::new(false);
#[export_name = "__thread_mode_pender"] #[export_name = "__thread_mode_pender"]
fn __thread_mode_pender(_core_id: OpaqueThreadContext) { fn __thread_mode_pender(_context: OpaqueThreadContext) {
SIGNAL_WORK_THREAD_MODE.store(true, Ordering::SeqCst); SIGNAL_WORK_THREAD_MODE.store(true, Ordering::SeqCst);
} }
/// TODO /// TODO
// Name pending // Name pending
#[derive(Default)] // Default enables Executor::new #[derive(Default)] // Default enables Executor::new
pub struct RiscVThreadContext; pub struct Context;
impl ThreadContext for RiscVThreadContext { impl ThreadContext for Context {
#[cfg(feature = "thread-context")] #[cfg(feature = "thread-context")]
fn context(&self) -> OpaqueThreadContext { fn context(&self) -> OpaqueThreadContext {
// Enabling thread-context is not incorrect, just wasteful. // Enabling thread-context is not incorrect, just wasteful.
OpaqueThreadContext(0) OpaqueThreadContext(0)
} }
#[cfg(not(feature = "thread-context"))]
fn context(&self) -> OpaqueThreadContext {
OpaqueThreadContext(())
}
fn wait(&mut self) { fn wait(&mut self) {
// We do not care about race conditions between the load and store operations, // We do not care about race conditions between the load and store operations,
// interrupts will only set this value to true. // interrupts will only set this value to true.
@ -60,5 +55,5 @@ mod thread {
/// TODO /// TODO
// Type alias for backwards compatibility // Type alias for backwards compatibility
pub type Executor = crate::thread::ThreadModeExecutor<RiscVThreadContext>; pub type Executor = crate::thread::ThreadModeExecutor<Context>;
} }

View File

@ -18,11 +18,11 @@ mod thread {
/// TODO /// TODO
// Name pending // Name pending
pub struct StdThreadCtx { pub struct Context {
signaler: &'static Signaler, signaler: &'static Signaler,
} }
impl Default for StdThreadCtx { impl Default for Context {
fn default() -> Self { fn default() -> Self {
Self { Self {
signaler: &*Box::leak(Box::new(Signaler::new())), signaler: &*Box::leak(Box::new(Signaler::new())),
@ -30,7 +30,7 @@ mod thread {
} }
} }
impl ThreadContext for StdThreadCtx { impl ThreadContext for Context {
fn context(&self) -> OpaqueThreadContext { fn context(&self) -> OpaqueThreadContext {
OpaqueThreadContext(self.signaler as *const _ as usize) OpaqueThreadContext(self.signaler as *const _ as usize)
} }
@ -41,8 +41,8 @@ mod thread {
} }
#[export_name = "__thread_mode_pender"] #[export_name = "__thread_mode_pender"]
fn __thread_mode_pender(core_id: OpaqueThreadContext) { fn __thread_mode_pender(context: OpaqueThreadContext) {
let signaler: &'static Signaler = unsafe { std::mem::transmute(core_id) }; let signaler: &'static Signaler = unsafe { std::mem::transmute(context) };
signaler.signal() signaler.signal()
} }
@ -76,5 +76,5 @@ mod thread {
/// TODO /// TODO
// Type alias for backwards compatibility // Type alias for backwards compatibility
pub type Executor = crate::thread::ThreadModeExecutor<StdThreadCtx>; pub type Executor = crate::thread::ThreadModeExecutor<Context>;
} }

View File

@ -15,27 +15,22 @@ mod thread {
static SIGNAL_WORK_THREAD_MODE: AtomicBool = AtomicBool::new(false); static SIGNAL_WORK_THREAD_MODE: AtomicBool = AtomicBool::new(false);
#[export_name = "__thread_mode_pender"] #[export_name = "__thread_mode_pender"]
fn __thread_mode_pender(_core_id: OpaqueThreadContext) { fn __thread_mode_pender(_context: OpaqueThreadContext) {
SIGNAL_WORK_THREAD_MODE.store(true, Ordering::SeqCst); SIGNAL_WORK_THREAD_MODE.store(true, Ordering::SeqCst);
} }
/// TODO /// TODO
// Name pending // Name pending
#[derive(Default)] // Default enables Executor::new #[derive(Default)] // Default enables Executor::new
pub struct XtensaThreadContext; pub struct Context;
impl ThreadContext for XtensaThreadContext { impl ThreadContext for Context {
#[cfg(feature = "thread-context")] #[cfg(feature = "thread-context")]
fn context(&self) -> OpaqueThreadContext { fn context(&self) -> OpaqueThreadContext {
// Enabling thread-context is not incorrect, just wasteful. // Enabling thread-context is not incorrect, just wasteful.
OpaqueThreadContext(0) OpaqueThreadContext(0)
} }
#[cfg(not(feature = "thread-context"))]
fn context(&self) -> OpaqueThreadContext {
OpaqueThreadContext(())
}
fn wait(&mut self) { fn wait(&mut self) {
unsafe { unsafe {
// Manual critical section implementation that only masks interrupts handlers. // Manual critical section implementation that only masks interrupts handlers.
@ -66,5 +61,5 @@ mod thread {
/// TODO /// TODO
// Type alias for backwards compatibility // Type alias for backwards compatibility
pub type Executor = crate::thread::ThreadModeExecutor<XtensaThreadContext>; pub type Executor = crate::thread::ThreadModeExecutor<Context>;
} }

View File

@ -7,13 +7,17 @@ use atomic_polyfill::{AtomicBool, Ordering};
use crate::raw::{self, OpaqueInterruptContext, Pender}; use crate::raw::{self, OpaqueInterruptContext, Pender};
/// An interrupt source that can be used to drive an [`InterruptExecutor`]. /// Architecture-specific interface for an interrupt-mode executor. This trait describes what data
// Name pending /// should be passed to the [`InterruptExecutor`]'s pender, and how to enable the interrupt that
/// triggers polling the executor.
// TODO: Name pending
pub trait InterruptContext { pub trait InterruptContext {
/// Creates an opaque identifier for this interrupt. /// A pointer-sized piece of data that is passed to the pender function.
///
/// Usually, the context contains the interrupt that should be used to wake the executor.
fn context(&self) -> OpaqueInterruptContext; fn context(&self) -> OpaqueInterruptContext;
/// Sets up the interrupt request. /// Enabled the interrupt request.
fn enable(&self); fn enable(&self);
} }
@ -36,8 +40,8 @@ pub trait InterruptContext {
/// Some chips reserve some interrupts for this purpose, sometimes named "software interrupts" (SWI). /// Some chips reserve some interrupts for this purpose, sometimes named "software interrupts" (SWI).
/// If this is not the case, you may use an interrupt from any unused peripheral. /// If this is not the case, you may use an interrupt from any unused peripheral.
/// ///
/// It is somewhat more complex to use, it's recommended to use the thread-mode /// It is somewhat more complex to use, it's recommended to use the
/// [`Executor`] instead, if it works for your use case. /// [`crate::thread::ThreadModeExecutor`] instead, if it works for your use case.
pub struct InterruptModeExecutor { pub struct InterruptModeExecutor {
started: AtomicBool, started: AtomicBool,
executor: UnsafeCell<MaybeUninit<raw::Executor>>, executor: UnsafeCell<MaybeUninit<raw::Executor>>,

View File

@ -5,13 +5,21 @@ use core::marker::PhantomData;
use crate::raw::{OpaqueThreadContext, Pender}; use crate::raw::{OpaqueThreadContext, Pender};
use crate::{raw, Spawner}; use crate::{raw, Spawner};
/// TODO /// Architecture-specific interface for a thread-mode executor. This trait describes what the
// Name pending /// executor should do when idle, and what data should be passed to its pender.
// TODO: Name pending
pub trait ThreadContext: Sized { pub trait ThreadContext: Sized {
/// TODO /// A pointer-sized piece of data that is passed to the pender function.
///
/// For example, on multi-core systems, this can be used to store the ID of the core that
/// should be woken up.
#[cfg(feature = "thread-context")]
fn context(&self) -> OpaqueThreadContext; fn context(&self) -> OpaqueThreadContext;
/// TODO /// Waits for the executor to be waken.
///
/// While it is valid for this function can be empty, it is recommended to use a WFE instruction
/// or equivalent to let the CPU sleep.
fn wait(&mut self); fn wait(&mut self);
} }
@ -40,11 +48,17 @@ impl<C: ThreadContext> ThreadModeExecutor<C> {
Self::with_context(C::default()) Self::with_context(C::default())
} }
/// Create a new Executor. /// Create a new Executor using the given thread context.
pub fn with_context(context: C) -> Self { pub fn with_context(thread_context: C) -> Self {
#[cfg(not(feature = "thread-context"))]
let context = OpaqueThreadContext(());
#[cfg(feature = "thread-context")]
let context = thread_context.context();
Self { Self {
inner: raw::Executor::new(Pender::Thread(context.context())), inner: raw::Executor::new(Pender::Thread(context)),
context, context: thread_context,
not_send: PhantomData, not_send: PhantomData,
} }
} }