dope_runtime/executor/
external.rs1use 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}