pub trait CpuDomainExecutor:
Debug
+ Send
+ Sync
+ 'static {
// Required methods
fn capabilities(&self) -> CpuDomainExecutorCapabilities;
fn submit(
&self,
jobs: &dyn ScopedCpuJobs,
) -> Result<(), CpuDomainExecutorError>;
fn install(
&self,
job: &mut dyn ScopedCpuJob,
) -> Result<(), CpuDomainExecutorError>;
}Expand description
Object-safe synchronous executor for one CPU resource domain.
submit is an indexed fork/join boundary and install is one borrowed
provider-owned inner-region entry. Neither method may retain its borrowed
job after returning.
§Examples
use std::num::NonZeroUsize;
use tenferro_cpu::{
CpuDomainExecutor, CpuDomainExecutorCapabilities, CpuDomainExecutorError,
CpuExecutorAffinity, CpuExecutorReentrancy, CpuExecutorShutdown,
CpuInnerParallelism, ScopedCpuJob, ScopedCpuJobs,
};
#[derive(Debug)]
struct Inline;
impl CpuDomainExecutor for Inline {
fn capabilities(&self) -> CpuDomainExecutorCapabilities {
CpuDomainExecutorCapabilities {
worker_count: NonZeroUsize::new(1).unwrap(),
outer_parallelism: false,
inner_parallelism: CpuInnerParallelism::None,
reentrancy: CpuExecutorReentrancy::Rejected,
affinity: CpuExecutorAffinity::None,
shutdown: CpuExecutorShutdown::CallerOwned,
}
}
fn submit(&self, _jobs: &dyn ScopedCpuJobs) -> Result<(), CpuDomainExecutorError> {
Ok(())
}
fn install(&self, job: &mut dyn ScopedCpuJob) -> Result<(), CpuDomainExecutorError> {
job.run()
}
}
let executor: &dyn CpuDomainExecutor = &Inline;
assert_eq!(executor.capabilities().worker_count.get(), 1);Required Methods§
Sourcefn capabilities(&self) -> CpuDomainExecutorCapabilities
fn capabilities(&self) -> CpuDomainExecutorCapabilities
Return immutable construction-time executor capabilities.
§Examples
use std::num::NonZeroUsize;
use tenferro_cpu::{
CpuDomainExecutor, CpuDomainExecutorCapabilities, CpuDomainExecutorError,
CpuExecutorAffinity, CpuExecutorReentrancy, CpuExecutorShutdown,
CpuInnerParallelism, ScopedCpuJob, ScopedCpuJobs,
};
let executor: &dyn CpuDomainExecutor = &Inline;
assert_eq!(executor.capabilities().worker_count.get(), 2);Sourcefn submit(&self, jobs: &dyn ScopedCpuJobs) -> Result<(), CpuDomainExecutorError>
fn submit(&self, jobs: &dyn ScopedCpuJobs) -> Result<(), CpuDomainExecutorError>
Submit all indexed jobs as one synchronous fork/join operation.
All 0..jobs.len() jobs must be complete when this method returns.
§Examples
use std::num::NonZeroUsize;
use std::sync::atomic::{AtomicUsize, Ordering};
use tenferro_cpu::{
CpuDomainExecutor, CpuDomainExecutorCapabilities, CpuDomainExecutorError,
CpuExecutorAffinity, CpuExecutorReentrancy, CpuExecutorShutdown,
CpuInnerParallelism, ScopedCpuJob, ScopedCpuJobs,
};
struct Jobs<'a>(&'a AtomicUsize);
impl ScopedCpuJobs for Jobs<'_> {
fn len(&self) -> usize { 2 }
fn run(&self, _index: usize) -> Result<(), CpuDomainExecutorError> {
self.0.fetch_add(1, Ordering::Relaxed);
Ok(())
}
}
let count = AtomicUsize::new(0);
Inline.submit(&Jobs(&count)).unwrap();
assert_eq!(count.load(Ordering::Relaxed), 2);§Errors
Returns CpuDomainExecutorError::Admission,
CpuDomainExecutorError::Scheduling,
CpuDomainExecutorError::Cancellation, or
CpuDomainExecutorError::PanicBridge for executor-owned failures.
Sourcefn install(
&self,
job: &mut dyn ScopedCpuJob,
) -> Result<(), CpuDomainExecutorError>
fn install( &self, job: &mut dyn ScopedCpuJob, ) -> Result<(), CpuDomainExecutorError>
Enter one synchronous provider-owned inner parallel region.
§Examples
use std::num::NonZeroUsize;
use tenferro_cpu::{
CpuDomainExecutor, CpuDomainExecutorCapabilities, CpuDomainExecutorError,
CpuExecutorAffinity, CpuExecutorReentrancy, CpuExecutorShutdown,
CpuInnerParallelism, ScopedCpuJob, ScopedCpuJobs,
};
struct Job(bool);
impl ScopedCpuJob for Job {
fn run(&mut self) -> Result<(), CpuDomainExecutorError> {
self.0 = true;
Ok(())
}
}
let mut job = Job(false);
Inline.install(&mut job).unwrap();
assert!(job.0);§Errors
Returns CpuDomainExecutorError::Admission,
CpuDomainExecutorError::Scheduling,
CpuDomainExecutorError::Cancellation, or
CpuDomainExecutorError::PanicBridge for executor-owned failures.