Skip to main content

dope_runtime/executor/
external.rs

1use dope_core::driver::{
2    Completion, CompletionBackend, CompletionRouter, DriverOps, ExternalDispatch, PoolDriver,
3};
4
5pub fn install_external<B: CompletionBackend>(
6    aux: Option<ExternalDispatch<B>>,
7) -> Option<ExternalDispatch<B>> {
8    B::install_external(aux)
9}
10
11#[inline(always)]
12pub(super) fn current_external<B: CompletionBackend>() -> Option<ExternalDispatch<B>> {
13    B::current_external()
14}
15
16pub(super) struct ExternalRouter<B: CompletionBackend> {
17    pub(super) aux: Option<ExternalDispatch<B>>,
18}
19
20impl<B: PoolDriver> CompletionRouter<B> for ExternalRouter<B> {
21    #[inline(always)]
22    fn on_complete(&mut self, driver: &mut B::Driver, ev: Completion<B>) {
23        if let Some(a) = self.aux {
24            unsafe { (a.route)(a.state, driver, ev) };
25        } else if let Some(b) = ev.buffer_select() {
26            use dope_core::driver::ProvidedRingOps;
27            driver.provided_ring().defer(b);
28        }
29    }
30}