Skip to main content

dope_core/backend/uring/ops/
poll.rs

1use std::{io, time};
2
3use crate::driver::{
4    self,
5    ops::{poll, reactors},
6    schedule,
7};
8
9fn prepare<'d>(
10    context: &mut driver::Context<'_, 'd>,
11    work: schedule::Reactor<'_, 'd>,
12) -> super::MaintenanceState {
13    let work = reactors::Backend::prepare(context, work);
14    let limit = work.remaining();
15    let mut budget = work.budget::<super::Maintenance>(limit);
16    super::maintain(context, &mut budget)
17}
18
19impl<'d> poll::Poll<'d> for driver::Context<'_, 'd> {
20    fn commit(&mut self, work: schedule::Reactor<'_, 'd>) -> io::Result<poll::Commit> {
21        let backend = prepare(self, work);
22        let pending = backend != super::MaintenanceState::Drained
23            || self.driver_ref().maintenance().has_deferred_maintenance();
24        self.backend().ring.commit()?;
25        Ok(if pending {
26            poll::Commit::Pending
27        } else {
28            poll::Commit::Drained
29        })
30    }
31
32    fn wait(
33        &mut self,
34        work: schedule::Reactor<'_, 'd>,
35        timeout: Option<time::Duration>,
36    ) -> io::Result<()> {
37        let backend_pending = prepare(self, work) != super::MaintenanceState::Drained;
38        let must_not_block = backend_pending
39            || self.driver_ref().maintenance().has_deferred_maintenance()
40            || self.driver_ref().ready().has_ready();
41        let nonblocking = must_not_block || timeout.is_some_and(|timeout| timeout.is_zero());
42        let backend = self.backend();
43        if nonblocking {
44            backend.ring.commit()
45        } else {
46            backend.ring.wait(timeout)
47        }
48    }
49}