changed Mutex to RwLock
This commit is contained in:
parent
a3b808cc29
commit
e294bdd386
@ -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,
|
||||
|
||||
29
src/peer.rs
29
src/peer.rs
@ -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]);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user