changed Mutex to RwLock

This commit is contained in:
asxalex 2024-02-21 21:59:18 +08:00
parent a3b808cc29
commit e294bdd386
2 changed files with 16 additions and 15 deletions

View File

@ -73,7 +73,7 @@ impl<'a> Common<'a> {
} }
} }
#[derive(Debug, PartialEq, Serialize_repr, Deserialize_repr)] #[derive(Debug, PartialEq, Serialize_repr, Deserialize_repr, Copy, Clone)]
#[repr(u8)] #[repr(u8)]
pub enum PacketType { pub enum PacketType {
PKTInvalid, PKTInvalid,

View File

@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize};
use sqlx::prelude::FromRow; use sqlx::prelude::FromRow;
use std::default::Default; use std::default::Default;
use std::sync::atomic::{AtomicU32, AtomicU64, AtomicU8, Ordering}; use std::sync::atomic::{AtomicU32, AtomicU64, AtomicU8, Ordering};
use std::sync::Mutex; use std::sync::RwLock;
#[derive(Debug)] #[derive(Debug)]
pub struct Peer { pub struct Peer {
@ -13,8 +13,8 @@ pub struct Peer {
// 对端阶段的udp信息包括ipv4地址和子网掩码位数 // 对端阶段的udp信息包括ipv4地址和子网掩码位数
pub dev_addr: IpSubnet, pub dev_addr: IpSubnet,
// 对端对外开放的ip和端口信息 // 对端对外开放的ip和端口信息
pub sock: Mutex<SdlanSock>, pub sock: RwLock<SdlanSock>,
pub pub_key: Mutex<Vec<u8>>, pub pub_key: RwLock<Vec<u8>>,
pub timeout: isize, pub timeout: isize,
@ -27,10 +27,10 @@ pub struct Peer {
// 最近一次合法时间 // 最近一次合法时间
pub last_valid_timestamp: AtomicU64, pub last_valid_timestamp: AtomicU64,
pub v6_info: Mutex<V6Info>, pub v6_info: RwLock<V6Info>,
// 该节点锁属的网络 // 该节点锁属的网络
pub network_id: Mutex<String>, pub network_id: RwLock<String>,
} }
impl Peer { impl Peer {
@ -38,25 +38,25 @@ impl Peer {
Self { Self {
// id: Mutex::new(id.to_string()), // id: Mutex::new(id.to_string()),
dev_addr: IpSubnet::new(0, 0), dev_addr: IpSubnet::new(0, 0),
sock: Mutex::new(SdlanSock { sock: RwLock::new(SdlanSock {
family: 0, family: AF_INET,
port: 0, port: 0,
// has_v6: false, // has_v6: false,
// v6_port: 0, // v6_port: 0,
v4: [0; 4], v4: [0; 4],
v6: [0; 16], v6: [0; 16],
}), }),
v6_info: Mutex::new(V6Info { v6_info: RwLock::new(V6Info {
port: 0, port: 0,
v6: [0; 16], v6: [0; 16],
}), }),
pub_key: Mutex::new(vec![]), pub_key: RwLock::new(vec![]),
timeout: 0, timeout: 0,
last_seen: AtomicU64::new(0), last_seen: AtomicU64::new(0),
last_p2p: AtomicU64::new(0), last_p2p: AtomicU64::new(0),
last_send_query: AtomicU64::new(0), last_send_query: AtomicU64::new(0),
last_valid_timestamp: AtomicU64::new(0), last_valid_timestamp: AtomicU64::new(0),
network_id: Mutex::new(String::new()), network_id: RwLock::new(String::new()),
} }
} }
} }
@ -152,6 +152,7 @@ pub struct SdlanSock {
use std::borrow::Cow; use std::borrow::Cow;
use std::sync::Arc; use std::sync::Arc;
use crate::config::AF_INET;
use crate::utils::SDLanError; use crate::utils::SDLanError;
pub struct PeerMap { pub struct PeerMap {
pub peers: DashMap<String, Arc<Peer>>, pub peers: DashMap<String, Arc<Peer>>,
@ -207,7 +208,7 @@ impl PeerMap {
pub fn find_peer_by_sock(&self, sock: &SdlanSock) -> Option<Arc<Peer>> { pub fn find_peer_by_sock(&self, sock: &SdlanSock) -> Option<Arc<Peer>> {
for k in self.peers.iter() { for k in self.peers.iter() {
let itersock = k.value().sock.lock().unwrap(); let itersock = k.value().sock.read().unwrap();
if itersock.family == sock.family if itersock.family == sock.family
&& itersock.port == sock.port && itersock.port == sock.port
&& itersock.v4 == sock.v4 && itersock.v4 == sock.v4
@ -233,14 +234,14 @@ mod test {
let pm = PeerMap::new(); let pm = PeerMap::new();
let mut p = Peer::new(); let mut p = Peer::new();
{ {
let mut sl = p.sock.lock().unwrap(); let mut sl = p.sock.write().unwrap();
sl.family = AF_INET; sl.family = AF_INET;
sl.v4 = [1; 4]; sl.v4 = [1; 4];
sl.port = 20; sl.port = 20;
} }
pm.insert_peer(&id, Arc::new(p)); pm.insert_peer(&id, Arc::new(p));
if let Some(p2) = pm.find_peer_by_id(&id) { if let Some(p2) = pm.find_peer_by_id(&id) {
let pl = p2.sock.lock().unwrap(); let pl = p2.sock.read().unwrap();
assert_eq!(pl.family, crate::config::AF_INET); assert_eq!(pl.family, crate::config::AF_INET);
assert_eq!(pl.port, 20); assert_eq!(pl.port, 20);
assert_eq!(pl.v4, [1; 4]); assert_eq!(pl.v4, [1; 4]);
@ -256,7 +257,7 @@ mod test {
v4: [1; 4], v4: [1; 4],
v6: [1; 16], v6: [1; 16],
}) { }) {
let pl = p3.sock.lock().unwrap(); let pl = p3.sock.read().unwrap();
assert_eq!(pl.family, AF_INET); assert_eq!(pl.family, AF_INET);
assert_eq!(pl.port, 20); assert_eq!(pl.port, 20);
assert_eq!(pl.v4, [1; 4]); assert_eq!(pl.v4, [1; 4]);