Skip to main content

io_engine/
callback_worker.rs

1use crate::tasks::{CbArgs, IOEvent};
2use crossfire::{MTx, Tx, flavor::Flavor};
3use io_buffer::Buffer;
4use rustix::io::Errno;
5
6/// A trait for workers that accept IO events.
7///
8/// This allows using either `IOWorkers` (wrappers around channels) or direct channels
9/// (`MTx`, `Tx`) or any other sink, or even process inline.
10pub trait Worker<C: CbArgs>: Send + 'static {
11    fn done(&self, event: Box<IOEvent<C>>);
12}
13
14// Implement Worker for Crossfire MTx (Multi-Producer)
15impl<C, F> Worker<C> for MTx<F>
16where
17    F: Flavor<Item = Box<IOEvent<C>>>,
18    C: CbArgs,
19{
20    fn done(&self, item: Box<IOEvent<C>>) {
21        let _ = self.send(item);
22    }
23}
24
25// Implement Worker for Crossfire Tx (Single-Producer)
26impl<C, F> Worker<C> for Tx<F>
27where
28    F: Flavor<Item = Box<IOEvent<C>>>,
29    C: CbArgs,
30{
31    fn done(&self, item: Box<IOEvent<C>>) {
32        let _ = self.send(item);
33    }
34}
35
36/// Example Inline worker that executes callbacks directly without spawning threads.
37/// Use this for very lightweight callback logic to avoid thread context switching overhead.
38///
39/// # Safety
40///
41/// It does not resubmit short I/O
42pub struct InlineClosure<C: CbArgs>(pub Box<dyn Fn(C, i64, Result<Option<Buffer>, Errno>) + Send>);
43
44impl<C: CbArgs> Worker<C> for InlineClosure<C> {
45    fn done(&self, event: Box<IOEvent<C>>) {
46        event.callback_unchecked(&self.0);
47    }
48}