Skip to main content

CpuDomainExecutor

Trait CpuDomainExecutor 

Source
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§

Source

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);
Source

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.

Source

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.

Implementors§