dope_core/backend/uring/ops/
poll.rs1use 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}