Skip to content

Commit 7442339

Browse files
committed
use atmoic compare_exchange_weak instead of store when marking peer as used
1 parent 79c052d commit 7442339

File tree

2 files changed

+19
-9
lines changed

2 files changed

+19
-9
lines changed

forwarder/src/lib.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,7 @@ use anyhow::Context;
66
use log::info;
77
use mio::{Events, Poll, Registry};
88
use parking_lot::{RwLock, RwLockUpgradableReadGuard, RwLockWriteGuard};
9-
use std::{
10-
net::SocketAddr,
11-
sync::{atomic::Ordering, Arc},
12-
time::Duration,
13-
};
9+
use std::{net::SocketAddr, sync::Arc, time::Duration};
1410
use {
1511
peer::{Peer, PeerManager},
1612
socket::{Socket, SocketTrait, SocketUri},
@@ -66,7 +62,7 @@ pub fn run_server(listen_uri: SocketUri, remote_uri: SocketUri, passphrase: Opti
6662
let peers = peer_manager.upgradable_read();
6763
match peers.find_peer_with_client_addr(&from_addr) {
6864
Some(peer) => {
69-
peer.used.store(true, Ordering::Relaxed);
65+
peer.set_used();
7066
// client ---> server socket ---peer socket----> remote
7167
peer.socket.send(&buffer[..size]).ok();
7268
}
@@ -134,7 +130,7 @@ fn peers_thread(
134130
for event in &events {
135131
let token = event.token();
136132
let peer = peers.find_peer_with_token(&token).unwrap();
137-
peer.used.store(true, Ordering::Relaxed);
133+
peer.set_used();
138134
// each epoll event may result in multiple readiness events
139135
while let Ok(size) = peer.socket.recv(&mut buffer) {
140136
if let Some(ref passphrase) = passphrase {
@@ -160,7 +156,7 @@ fn try_cleanup(peer_manager: &RwLock<PeerManager>) {
160156
let mut peers = peer_manager.write();
161157
let mut used_client_count = 0;
162158
for peer in peers.get_all() {
163-
let used = peer.used.swap(false, Ordering::Relaxed);
159+
let used = peer.reset_used();
164160
if !used {
165161
let client_addr = peer.get_client_addr();
166162
log::info!("cleaning peer that handled '{client_addr}'");

forwarder/src/peer.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::{
44
borrow::Borrow,
55
collections::BTreeMap,
66
net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6},
7+
sync::atomic::Ordering,
78
sync::{atomic::AtomicBool, Arc},
89
};
910

@@ -12,7 +13,7 @@ pub struct Peer {
1213
pub socket: Socket,
1314
client_addr: SocketAddr,
1415
token: Token,
15-
pub used: AtomicBool,
16+
used: AtomicBool,
1617
}
1718

1819
impl Peer {
@@ -39,6 +40,19 @@ impl Peer {
3940
Ok((peer, token))
4041
}
4142

43+
/// mark `Peer` as being used to prevent cleanup thread from cleaning it
44+
pub fn set_used(&self) {
45+
self.used
46+
.compare_exchange_weak(false, true, Ordering::Relaxed, Ordering::Relaxed)
47+
.ok();
48+
}
49+
50+
/// mark `Peer` as not being in use and returns `true` if it was used
51+
/// before reseting otherwise returns `false`
52+
pub fn reset_used(&self) -> bool {
53+
self.used.swap(false, Ordering::Relaxed)
54+
}
55+
4256
pub fn get_client_addr(&self) -> &SocketAddr {
4357
&self.client_addr
4458
}

0 commit comments

Comments
 (0)