use bytes::BytesMut;
use std::io;
use std::os::unix::io::RawFd;
use std::sync::Mutex;
use std::task::Waker;
use std::thread::ThreadId;
pub(super) struct RequestState {
pub completed: bool,
pub waker: Option<Waker>,
pub err: Option<io::Error>,
pub buffer: BytesMut,
pub bytes_read: usize,
}
pub(super) struct IoRequest {
pub fd: RawFd,
pub offset: u64,
pub length: usize,
pub thread_id: ThreadId,
pub state: Mutex<RequestState>,
}
impl IoRequest {
pub(super) 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();
}
}
}