Move scheme API to redox-scheme.

This commit is contained in:
4lDO2
2023-12-26 11:21:01 +01:00
parent 8009c0457a
commit dcb73fea4b
2 changed files with 0 additions and 120 deletions
-119
View File
@@ -409,122 +409,3 @@ pub mod call {
Error::demux(redox_munmap_v1(addr, length)).map(|_| ())
}
}
#[cfg(feature = "scheme")]
pub mod scheme {
use super::*;
use core::mem::size_of;
use syscall::Packet;
pub use syscall::{Scheme, SchemeBlock, SchemeBlockMut, SchemeMut};
#[repr(transparent)]
#[derive(Clone, Copy, Default)]
pub struct Request(Packet);
impl Request {
pub fn handle_scheme(mut self, scheme: &impl Scheme) -> Response {
scheme.handle(&mut self.0);
Response(self.0)
}
pub fn handle_scheme_mut(mut self, scheme: &mut impl SchemeMut) -> Response {
scheme.handle(&mut self.0);
Response(self.0)
}
pub fn handle_scheme_block(
mut self,
scheme: &mut impl SchemeBlock,
) -> Result<Response, Request> {
match scheme.handle(&mut self.0) {
Some(code) => Ok(Response(Packet { a: code, ..self.0 })),
None => Err(self),
}
}
pub fn handle_scheme_block_mut(
mut self,
scheme: &mut impl SchemeBlockMut,
) -> Result<Response, Request> {
match scheme.handle(&mut self.0) {
Some(code) => Ok(Response(Packet { a: code, ..self.0 })),
None => Err(self),
}
}
}
#[repr(transparent)]
#[derive(Clone, Copy, Default)]
pub struct Response(Packet);
impl Response {
pub fn new(req: &Request, status: Result<usize>) -> Self {
Self(Packet {
a: Error::mux(status),
..req.0
})
}
}
pub enum SignalBehavior {
Interrupt,
Restart,
}
// TODO: Support uninitialized memory
#[inline]
pub fn read_requests(
socket: usize,
buf: &mut [Request],
behavior: SignalBehavior,
) -> Result<usize> {
let len = buf.len().checked_mul(size_of::<Request>()).unwrap();
let bytes_read = loop {
match call::read(socket, unsafe {
core::slice::from_raw_parts_mut(buf.as_mut_ptr().cast(), len)
}) {
Ok(n) => break n,
error @ Err(Error {
errno: errno::EINTR,
}) => match behavior {
SignalBehavior::Restart => continue,
SignalBehavior::Interrupt => return error,
},
Err(err) => return Err(err),
}
};
debug_assert_eq!(bytes_read % size_of::<Request>(), 0);
Ok(bytes_read / size_of::<Request>())
}
#[inline]
pub fn write_responses(
socket: usize,
buf: &[Response],
behavior: SignalBehavior,
) -> Result<usize> {
let bytes = unsafe {
core::slice::from_raw_parts(
buf.as_ptr().cast(),
buf.len().checked_mul(size_of::<Response>()).unwrap(),
)
};
let bytes_written = loop {
match call::write(socket, bytes) {
Ok(n) => break n,
error @ Err(Error {
errno: errno::EINTR,
}) => match behavior {
SignalBehavior::Restart => continue,
SignalBehavior::Interrupt => return error,
},
Err(err) => return Err(err),
}
};
debug_assert_eq!(bytes_written % size_of::<Response>(), 0);
Ok(bytes_written / size_of::<Response>())
}
}