use bytes::BytesMut;
use std::io;
use std::os::unix::io::RawFd;
use std::sync::Mutex;
use std::task::Waker;
pub struct RequestState {
pub completed: bool,
pub consumed: bool,
pub waker: Option<Waker>,
pub err: Option<io::Error>,
pub buffer: BytesMut,
pub bytes_transferred: usize,
pub result_code: i32,
}
pub struct IoRequest {
pub fd: RawFd,
pub offset: u64,
pub length: usize,
pub op_type: UringOpType,
pub open_flags: i32,
pub state: Mutex<RequestState>,
}
pub enum UringOpType {
Read,
Write,
OpenAt,
Close,
UnlinkAt,
}
impl IoRequest {
pub fn fail(&self, err: io::Error) {
let mut state = self.state.lock().unwrap();
state.err = Some(err);
state.completed = true;
if let Some(waker) = state.waker.take() {
drop(state);
waker.wake();
}
}
}