mirror of
https://github.com/asterinas/asterinas.git
synced 2025-06-29 14:23:22 +00:00
Support poll multiple packets
This commit is contained in:
committed by
Tate, Hongliang Tian
parent
646406115e
commit
878e8a88f4
@ -101,8 +101,6 @@ impl Connected {
|
||||
}
|
||||
let vsockspace = VSOCK_GLOBAL.get().unwrap();
|
||||
vsockspace.reset(&connection.info).unwrap();
|
||||
vsockspace.remove_connected_socket(&self.id());
|
||||
vsockspace.recycle_port(&self.local_addr().port);
|
||||
connection.set_local_shutdown();
|
||||
}
|
||||
Ok(())
|
||||
@ -143,19 +141,6 @@ impl Connected {
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for Connected {
|
||||
fn drop(&mut self) {
|
||||
let connection = self.connection.lock_irq_disabled();
|
||||
if connection.is_local_shutdown() {
|
||||
return;
|
||||
}
|
||||
let vsockspace = VSOCK_GLOBAL.get().unwrap();
|
||||
vsockspace.reset(&connection.info).unwrap();
|
||||
vsockspace.remove_connected_socket(&self.id());
|
||||
vsockspace.recycle_port(&self.local_addr().port);
|
||||
}
|
||||
}
|
||||
|
||||
struct Connection {
|
||||
info: ConnectionInfo,
|
||||
buffer: HeapRb<u8>,
|
||||
|
@ -66,15 +66,6 @@ impl Init {
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for Init {
|
||||
fn drop(&mut self) {
|
||||
if let Some(addr) = *self.bound_addr.lock() {
|
||||
let vsockspace = VSOCK_GLOBAL.get().unwrap();
|
||||
vsockspace.recycle_port(&addr.port);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for Init {
|
||||
fn default() -> Self {
|
||||
Self::new()
|
||||
|
@ -3,7 +3,7 @@
|
||||
use super::connected::Connected;
|
||||
use crate::{
|
||||
events::IoEvents,
|
||||
net::socket::vsock::{addr::VsockSocketAddr, VSOCK_GLOBAL},
|
||||
net::socket::vsock::addr::VsockSocketAddr,
|
||||
prelude::*,
|
||||
process::signal::{Pollee, Poller},
|
||||
};
|
||||
@ -31,8 +31,9 @@ impl Listen {
|
||||
pub fn push_incoming(&self, connect: Arc<Connected>) -> Result<()> {
|
||||
let mut incoming_connections = self.incoming_connection.lock_irq_disabled();
|
||||
if incoming_connections.len() >= self.backlog {
|
||||
return_errno_with_message!(Errno::ENOMEM, "queue in listenging socket is full")
|
||||
return_errno_with_message!(Errno::ECONNREFUSED, "queue in listenging socket is full")
|
||||
}
|
||||
// FIXME: check if the port is already used
|
||||
incoming_connections.push_back(connect);
|
||||
Ok(())
|
||||
}
|
||||
@ -62,11 +63,3 @@ impl Listen {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for Listen {
|
||||
fn drop(&mut self) {
|
||||
let vsockspace = VSOCK_GLOBAL.get().unwrap();
|
||||
vsockspace.recycle_port(&self.addr.port);
|
||||
vsockspace.remove_listen_socket(&self.addr);
|
||||
}
|
||||
}
|
||||
|
@ -339,3 +339,28 @@ impl Socket for VsockStreamSocket {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for VsockStreamSocket {
|
||||
fn drop(&mut self) {
|
||||
let vsockspace = VSOCK_GLOBAL.get().unwrap();
|
||||
let inner = self.status.read();
|
||||
match &*inner {
|
||||
Status::Init(init) => {
|
||||
if let Some(addr) = init.bound_addr() {
|
||||
vsockspace.recycle_port(&addr.port);
|
||||
}
|
||||
}
|
||||
Status::Listen(listen) => {
|
||||
vsockspace.recycle_port(&listen.addr().port);
|
||||
vsockspace.remove_listen_socket(&listen.addr());
|
||||
}
|
||||
Status::Connected(connected) => {
|
||||
if !connected.is_closed() {
|
||||
vsockspace.reset(&connected.get_info()).unwrap();
|
||||
}
|
||||
vsockspace.remove_connected_socket(&connected.id());
|
||||
vsockspace.recycle_port(&connected.local_addr().port);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user