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)]
pub enum PacketType {
PKTInvalid,

View File

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