use crate::runtime::task::Task;
use std::io::Result;
use std::{mem, ptr};
pub(crate) const UNINIT_RESULT: Result<usize> = Ok((1 << 32) - 1);
pub(crate) struct IoRequestData {
ret: Result<usize>,
task: Task,
#[cfg(debug_assertions)]
was_executed: bool,
}
impl IoRequestData {
#[inline(always)]
pub(crate) fn new(task: Task) -> Self {
Self {
ret: UNINIT_RESULT,
task,
#[cfg(debug_assertions)]
was_executed: false,
}
}
#[inline(always)]
fn check_if_executed_in_debug(&mut self) {
#[cfg(debug_assertions)]
{
assert!(!self.was_executed, "{}", crate::bug_message::BUG_MESSAGE);
self.was_executed = true;
}
}
#[inline(always)]
pub(crate) fn set_ret(&mut self, ret: Result<usize>) {
self.ret = ret;
}
#[inline(always)]
pub(crate) fn ret(&mut self) -> Result<usize> {
mem::replace(&mut self.ret, UNINIT_RESULT)
}
#[inline(always)]
pub(crate) unsafe fn task(&mut self) -> Task {
self.check_if_executed_in_debug();
unsafe { ptr::read(&self.task) }
}
}