1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
//! Types and traits to activate and schedule fibers.
use std::rc::Rc;
use std::cell::RefCell;
pub mod activate;
pub use self::activate::{Activations, Activator, ActivateOnDrop, SyncActivator};
/// A type that can be scheduled.
pub trait Schedule {
/// A descriptive name for the operator
fn name(&self) -> &str;
/// An address identifying the operator.
fn path(&self) -> &[usize];
/// Schedules the operator, receives "cannot terminate" boolean.
///
/// The return value indicates whether `self` has outstanding
/// work and would be upset if the computation terminated.
fn schedule(&mut self) -> bool;
}
/// Methods for types which schedule fibers.
pub trait Scheduler {
/// Provides a shared handle to the activation scheduler.
fn activations(&self) -> Rc<RefCell<Activations>>;
/// Constructs an `Activator` tied to the specified operator address.
fn activator_for(&self, path: Rc<[usize]>) -> Activator {
Activator::new(path, self.activations())
}
/// Constructs a `SyncActivator` tied to the specified operator address.
fn sync_activator_for(&self, path: Vec<usize>) -> SyncActivator {
let sync_activations = self.activations().borrow().sync();
SyncActivator::new(path, sync_activations)
}
}