use std::sync::Arc;
use crate::{NetworkManagerData, PtpAddressFamily};
mod recv;
mod send;
pub use recv::RecvResult;
pub struct OpenSocket<A: PtpAddressFamily> {
pub(crate) state: Arc<NetworkManagerData<A>>,
pub(crate) socket_id: usize,
pub(crate) packet_receiver: tokio::sync::mpsc::Receiver<RecvResult<A>>,
}
impl<A: PtpAddressFamily> Drop for OpenSocket<A> {
fn drop(&mut self) {
let socket_data = self
.state
.sockets
.write()
.unwrap()
.remove(&self.socket_id)
.unwrap();
let mut interfaces = self.state.interfaces.write().unwrap();
let entry = interfaces.get_mut(&socket_data.interface_filter).unwrap();
entry.refcount = entry.refcount.checked_sub(1).unwrap();
if entry.refcount == 0 {
interfaces.remove(&socket_data.interface_filter);
}
}
}
pub struct ConnectedSocket<A: PtpAddressFamily> {
pub(crate) state: Arc<NetworkManagerData<A>>,
pub(crate) socket_id: usize,
pub(crate) packet_receiver: tokio::sync::mpsc::Receiver<RecvResult<A>>,
}
impl<A: PtpAddressFamily> Drop for ConnectedSocket<A> {
fn drop(&mut self) {
let socket_data = self
.state
.sockets
.write()
.unwrap()
.remove(&self.socket_id)
.unwrap();
let mut interfaces = self.state.interfaces.write().unwrap();
let entry = interfaces.get_mut(&socket_data.interface_filter).unwrap();
entry.refcount = entry.refcount.checked_sub(1).unwrap();
if entry.refcount == 0 {
interfaces.remove(&socket_data.interface_filter);
}
}
}