From 98e2a991953700bf2542d240153018a76e725f0f Mon Sep 17 00:00:00 2001 From: Ruihan Li Date: Sat, 27 Jul 2024 09:27:56 +0800 Subject: [PATCH] Store `Arc` in UNIX listeners --- .../src/net/socket/unix/stream/listener.rs | 55 ++++++++----------- 1 file changed, 22 insertions(+), 33 deletions(-) diff --git a/kernel/aster-nix/src/net/socket/unix/stream/listener.rs b/kernel/aster-nix/src/net/socket/unix/stream/listener.rs index f2dca11b2..a6935ea7d 100644 --- a/kernel/aster-nix/src/net/socket/unix/stream/listener.rs +++ b/kernel/aster-nix/src/net/socket/unix/stream/listener.rs @@ -12,24 +12,22 @@ use crate::{ }; pub(super) struct Listener { - addr: UnixSocketAddrBound, + backlog: Arc, } impl Listener { pub(super) fn new(addr: UnixSocketAddrBound, backlog: usize) -> Result { - BACKLOG_TABLE.add_backlog(&addr, backlog)?; - Ok(Self { addr }) + let backlog = BACKLOG_TABLE.add_backlog(addr, backlog)?; + Ok(Self { backlog }) } pub(super) fn addr(&self) -> &UnixSocketAddrBound { - &self.addr + self.backlog.addr() } pub(super) fn try_accept(&self) -> Result<(Arc, SocketAddr)> { - let addr = self.addr().clone(); - let connected = { - let local_endpoint = BACKLOG_TABLE.pop_incoming(&addr)?; + let local_endpoint = self.backlog.pop_incoming()?; Connected::new(local_endpoint) }; @@ -41,9 +39,7 @@ impl Listener { } pub(super) fn poll(&self, mask: IoEvents, poller: Option<&mut Poller>) -> IoEvents { - let addr = self.addr(); - let backlog = BACKLOG_TABLE.get_backlog(addr).unwrap(); - backlog.poll(mask, poller) + self.backlog.poll(mask, poller) } pub(super) fn register_observer( @@ -51,18 +47,14 @@ impl Listener { observer: Weak>, mask: IoEvents, ) -> Result<()> { - let addr = self.addr(); - let backlog = BACKLOG_TABLE.get_backlog(addr)?; - backlog.register_observer(observer, mask) + self.backlog.register_observer(observer, mask) } pub(super) fn unregister_observer( &self, observer: &Weak>, ) -> Option>> { - let addr = self.addr(); - let backlog = BACKLOG_TABLE.get_backlog(addr).ok()?; - backlog.unregister_observer(observer) + self.backlog.unregister_observer(observer) } } @@ -80,9 +72,9 @@ impl BacklogTable { } } - fn add_backlog(&self, addr: &UnixSocketAddrBound, backlog: usize) -> Result<()> { + fn add_backlog(&self, addr: UnixSocketAddrBound, backlog: usize) -> Result> { let inode = { - let UnixSocketAddrBound::Path(_, dentry) = addr else { + let UnixSocketAddrBound::Path(_, ref dentry) = addr else { todo!() }; create_keyable_inode(dentry) @@ -92,9 +84,9 @@ impl BacklogTable { if backlog_sockets.contains_key(&inode) { return_errno_with_message!(Errno::EADDRINUSE, "the addr is already used"); } - let new_backlog = Arc::new(Backlog::new(backlog)); - backlog_sockets.insert(inode, new_backlog); - Ok(()) + let new_backlog = Arc::new(Backlog::new(addr, backlog)); + backlog_sockets.insert(inode, new_backlog.clone()); + Ok(new_backlog) } fn get_backlog(&self, addr: &UnixSocketAddrBound) -> Result> { @@ -112,16 +104,6 @@ impl BacklogTable { .ok_or_else(|| Error::with_message(Errno::EINVAL, "the socket is not listened")) } - fn pop_incoming(&self, addr: &UnixSocketAddrBound) -> Result { - let backlog = self.get_backlog(addr)?; - - if let Some(endpoint) = backlog.pop_incoming() { - Ok(endpoint) - } else { - return_errno_with_message!(Errno::EAGAIN, "no pending connection is available") - } - } - fn push_incoming(&self, addr: &UnixSocketAddrBound, endpoint: Endpoint) -> Result<()> { let backlog = self.get_backlog(addr).map_err(|_| { Error::with_message( @@ -144,20 +126,26 @@ impl BacklogTable { } struct Backlog { + addr: UnixSocketAddrBound, pollee: Pollee, backlog: usize, incoming_endpoints: Mutex>, } impl Backlog { - fn new(backlog: usize) -> Self { + fn new(addr: UnixSocketAddrBound, backlog: usize) -> Self { Self { + addr, pollee: Pollee::new(IoEvents::empty()), backlog, incoming_endpoints: Mutex::new(VecDeque::with_capacity(backlog)), } } + fn addr(&self) -> &UnixSocketAddrBound { + &self.addr + } + fn push_incoming(&self, endpoint: Endpoint) -> Result<()> { let mut endpoints = self.incoming_endpoints.lock(); if endpoints.len() >= self.backlog { @@ -168,13 +156,14 @@ impl Backlog { Ok(()) } - fn pop_incoming(&self) -> Option { + fn pop_incoming(&self) -> Result { let mut incoming_endpoints = self.incoming_endpoints.lock(); let endpoint = incoming_endpoints.pop_front(); if incoming_endpoints.is_empty() { self.pollee.del_events(IoEvents::IN); } endpoint + .ok_or_else(|| Error::with_message(Errno::EAGAIN, "no pending connection is available")) } fn poll(&self, mask: IoEvents, poller: Option<&mut Poller>) -> IoEvents {