use crate::flow::Flow;
use crate::operation::{IoSlice, Operation};
use crate::result::Result as TorusResult;
use crate::Torus;
pub struct RawTorus<'a> {
torus: &'a Torus,
}
impl<'a> RawTorus<'a> {
pub(crate) fn new(torus: &'a Torus) -> Self {
Self { torus }
}
pub unsafe fn submit_read(
&self,
fd: i32,
buf: *mut u8,
len: usize,
offset: u64,
) -> crate::Result<()> {
let flow = Flow::new(Operation::Read {
fd,
buf,
len,
offset,
});
self.torus.submit(&flow)
}
pub unsafe fn submit_write(
&self,
fd: i32,
buf: *const u8,
len: usize,
offset: u64,
) -> crate::Result<()> {
let flow = Flow::new(Operation::Write {
fd,
buf,
len,
offset,
});
self.torus.submit(&flow)
}
pub unsafe fn submit_readv(&self, fd: i32, bufs: &[IoSlice], offset: u64) -> crate::Result<()> {
let flow = Flow::new(Operation::Readv {
fd,
bufs: bufs.as_ptr(),
buf_count: bufs.len() as u32,
offset,
});
self.torus.submit(&flow)
}
pub unsafe fn submit_writev(
&self,
fd: i32,
bufs: &[IoSlice],
offset: u64,
) -> crate::Result<()> {
let flow = Flow::new(Operation::Writev {
fd,
bufs: bufs.as_ptr(),
buf_count: bufs.len() as u32,
offset,
});
self.torus.submit(&flow)
}
pub unsafe fn submit_recv(&self, fd: i32, buf: *mut u8, len: usize) -> crate::Result<()> {
let flow = Flow::new(Operation::Recv { fd, buf, len });
self.torus.submit(&flow)
}
pub unsafe fn submit_send(&self, fd: i32, buf: *const u8, len: usize) -> crate::Result<()> {
let flow = Flow::new(Operation::Send { fd, buf, len });
self.torus.submit(&flow)
}
pub fn submit_close(&self, fd: i32) -> crate::Result<()> {
let flow = Flow::new(Operation::Close { fd });
self.torus.submit(&flow)
}
pub fn reap(&self, results: &mut Vec<TorusResult>) -> crate::Result<usize> {
self.torus.reap(results)
}
pub fn wait(&self, timeout_us: u64) -> crate::Result<()> {
self.torus.wait(timeout_us)
}
pub fn torus(&self) -> &Torus {
self.torus
}
}