From a7462ccd43dad6ffc55ba3f4f34a803c4bda1768 Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Sat, 16 Mar 2024 09:25:01 +0100 Subject: [PATCH] Improve API. --- src/lib.rs | 124 ++++++++++++++++++++++------------------ src/scheme_block.rs | 16 +++++- src/scheme_block_mut.rs | 16 +++++- 3 files changed, 97 insertions(+), 59 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 5bfaeb2..4e2291a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -80,85 +80,99 @@ impl CallerCtx { use core::mem::size_of; #[repr(transparent)] -#[derive(Clone, Copy, Default)] -pub struct Request(Packet); +#[derive(Clone, Copy, Debug, Default)] +pub struct Request { + packet: Packet, +} #[derive(Clone, Copy, Debug, Eq, Ord, Hash, PartialEq, PartialOrd)] pub struct Id(u64); #[derive(Debug)] -pub struct CancelationRequest { +pub struct CancellationRequest { pub id: Id, } -impl Request { - pub fn context_id(&self) -> usize { - self.0.pid - } - pub fn request_id(&self) -> Id { - Id(self.0.id) - } - pub fn is_ksmsg(&self) -> bool { - // TODO: Should KSMSG_MMAP_PREP be a regular scheme call? - matches!( - self.0.a, - self::KSMSG_CANCEL | self::KSMSG_MSYNC | self::KSMSG_MUNMAP | self::KSMSG_MMAP - ) - } - // TODO: Better API - pub fn as_maybe_cancelation_req_opt(&self) -> Option<CancelationRequest> { - if self.0.a == KSMSG_CANCEL { - Some(CancelationRequest { - id: Id((self.0.b as u64) | (self.0.c as u64) << 32), - }) - } else { - None - } +#[repr(transparent)] +#[derive(Clone, Copy, Debug)] +pub struct CallRequest { + inner: Request, +} + +pub enum RequestKind { + Call(CallRequest), + Cancellation(CancellationRequest), + MsyncMsg, + MunmapMsg, + MmapMsg, +} + +impl CallRequest { + #[inline] + pub fn request(&self) -> Request { + self.inner } - pub fn handle_scheme(mut self, scheme: &impl Scheme) -> Option<Response> { - if self.is_ksmsg() { - return None; - } + + pub fn handle_scheme(mut self, scheme: &impl Scheme) -> Response { unsafe { - scheme.handle(&mut self.0); + scheme.handle(&mut self.inner.packet); } - Some(Response(self.0)) + Response(self.inner.packet) } - pub fn handle_scheme_mut(mut self, scheme: &mut impl SchemeMut) -> Option<Response> { - if self.is_ksmsg() { - return None; - } + pub fn handle_scheme_mut(mut self, scheme: &mut impl SchemeMut) -> Response { unsafe { - scheme.handle(&mut self.0); + scheme.handle(&mut self.inner.packet); } - Some(Response(self.0)) + Response(self.inner.packet) } - pub fn handle_scheme_block( - mut self, - scheme: &mut impl SchemeBlock, - ) -> Result<Option<Response>, Request> { - if self.is_ksmsg() { - return Ok(None); - } - match unsafe { scheme.handle(&mut self.0) } { - Some(code) => Ok(Some(Response(Packet { a: code, ..self.0 }))), + pub fn handle_scheme_block(mut self, scheme: &mut impl SchemeBlock) -> Result<Response, Self> { + match unsafe { scheme.handle(&self.inner.packet) } { + Some(code) => Ok(Response(Packet { + a: code, + ..self.inner.packet + })), None => Err(self), } } pub fn handle_scheme_block_mut( mut self, scheme: &mut impl SchemeBlockMut, - ) -> Result<Option<Response>, Request> { - if self.is_ksmsg() { - return Ok(None); - } - match unsafe { scheme.handle(&mut self.0) } { - Some(code) => Ok(Some(Response(Packet { a: code, ..self.0 }))), + ) -> Result<Response, Self> { + match unsafe { scheme.handle(&self.inner.packet) } { + Some(code) => Ok(Response(Packet { + a: code, + ..self.inner.packet + })), None => Err(self), } } } +impl Request { + #[inline] + pub fn context_id(&self) -> usize { + self.packet.pid + } + #[inline] + pub fn request_id(&self) -> Id { + Id(self.packet.id) + } + pub fn kind(self) -> RequestKind { + // TODO: Should KSMSG_MMAP_PREP be a regular scheme call? + + match self.packet.a { + KSMSG_CANCEL => RequestKind::Cancellation(CancellationRequest { + id: Id((self.packet.b as u64) | ((self.packet.c as u64) << 32)), + }), + KSMSG_MSYNC => RequestKind::MsyncMsg, + KSMSG_MUNMAP => RequestKind::MunmapMsg, + KSMSG_MMAP => RequestKind::MmapMsg, + + _ => RequestKind::Call(CallRequest { inner: self }), + } + } +} + pub struct Socket(libredox::Fd); impl Socket { @@ -219,10 +233,10 @@ impl Socket { pub struct Response(Packet); impl Response { - pub fn new(req: &Request, status: Result<usize>) -> Self { + pub fn new(req: &CallRequest, status: Result<usize>) -> Self { Self(Packet { a: Error::mux(status), - ..req.0 + ..req.inner.packet }) } } diff --git a/src/scheme_block.rs b/src/scheme_block.rs index 7d04609..2be3e2f 100644 --- a/src/scheme_block.rs +++ b/src/scheme_block.rs @@ -229,12 +229,24 @@ pub trait SchemeBlock { } #[allow(unused_variables)] - fn mmap_prep(&self, id: usize, offset: u64, size: usize, flags: MapFlags) -> Result<Option<usize>> { + fn mmap_prep( + &self, + id: usize, + offset: u64, + size: usize, + flags: MapFlags, + ) -> Result<Option<usize>> { Err(Error::new(EOPNOTSUPP)) } #[allow(unused_variables)] - fn munmap(&self, id: usize, offset: u64, size: usize, flags: MunmapFlags) -> Result<Option<usize>> { + fn munmap( + &self, + id: usize, + offset: u64, + size: usize, + flags: MunmapFlags, + ) -> Result<Option<usize>> { Err(Error::new(EOPNOTSUPP)) } } diff --git a/src/scheme_block_mut.rs b/src/scheme_block_mut.rs index 58f445f..eeca6cb 100644 --- a/src/scheme_block_mut.rs +++ b/src/scheme_block_mut.rs @@ -229,12 +229,24 @@ pub trait SchemeBlockMut { } #[allow(unused_variables)] - fn mmap_prep(&mut self, id: usize, offset: u64, size: usize, flags: MapFlags) -> Result<Option<usize>> { + fn mmap_prep( + &mut self, + id: usize, + offset: u64, + size: usize, + flags: MapFlags, + ) -> Result<Option<usize>> { Err(Error::new(EOPNOTSUPP)) } #[allow(unused_variables)] - fn munmap(&mut self, id: usize, offset: u64, size: usize, flags: MunmapFlags) -> Result<Option<usize>> { + fn munmap( + &mut self, + id: usize, + offset: u64, + size: usize, + flags: MunmapFlags, + ) -> Result<Option<usize>> { Err(Error::new(EOPNOTSUPP)) } } -- GitLab