@@ -23,7 +23,7 @@ use std::{
23
23
pin:: Pin ,
24
24
sync:: {
25
25
atomic:: { AtomicBool , AtomicU64 , Ordering } ,
26
- Arc , RwLock ,
26
+ Arc , Mutex , RwLock ,
27
27
} ,
28
28
task:: { Context , Poll } ,
29
29
} ;
@@ -47,7 +47,7 @@ use quinn::{AsyncUdpSocket, ServerConfig};
47
47
use rand:: Rng ;
48
48
use smallvec:: SmallVec ;
49
49
use snafu:: { ResultExt , Snafu } ;
50
- use tokio:: sync:: { mpsc, Mutex } ;
50
+ use tokio:: sync:: { mpsc, Mutex as AsyncMutex } ;
51
51
use tokio_util:: sync:: CancellationToken ;
52
52
use tracing:: {
53
53
debug, error, event, info, info_span, instrument, trace, trace_span, warn, Instrument , Level ,
@@ -1089,7 +1089,7 @@ struct DirectAddrUpdateState {
1089
1089
#[ cfg( not( wasm_browser) ) ]
1090
1090
port_mapper : portmapper:: Client ,
1091
1091
/// The prober that discovers local network conditions, including the closest relay relay and NAT mappings.
1092
- net_reporter : Arc < Mutex < net_report:: Client > > ,
1092
+ net_reporter : Arc < AsyncMutex < net_report:: Client > > ,
1093
1093
relay_map : RelayMap ,
1094
1094
run_done : mpsc:: Sender < ( ) > ,
1095
1095
}
@@ -1116,7 +1116,7 @@ impl DirectAddrUpdateState {
1116
1116
fn new (
1117
1117
msock : Arc < MagicSock > ,
1118
1118
#[ cfg( not( wasm_browser) ) ] port_mapper : portmapper:: Client ,
1119
- net_reporter : Arc < Mutex < net_report:: Client > > ,
1119
+ net_reporter : Arc < AsyncMutex < net_report:: Client > > ,
1120
1120
relay_map : RelayMap ,
1121
1121
run_done : mpsc:: Sender < ( ) > ,
1122
1122
) -> Self {
@@ -1385,7 +1385,7 @@ impl Handle {
1385
1385
msock. clone ( ) ,
1386
1386
#[ cfg( not( wasm_browser) ) ]
1387
1387
port_mapper,
1388
- Arc :: new ( Mutex :: new ( net_reporter) ) ,
1388
+ Arc :: new ( AsyncMutex :: new ( net_reporter) ) ,
1389
1389
relay_map,
1390
1390
direct_addr_done_tx,
1391
1391
) ;
@@ -1461,7 +1461,9 @@ impl Handle {
1461
1461
self . msock . closing . store ( true , Ordering :: Relaxed ) ;
1462
1462
self . actor_token . cancel ( ) ;
1463
1463
1464
- if let Some ( task) = self . actor_task . lock ( ) . await . take ( ) {
1464
+ // MutexGuard is not held across await points
1465
+ let task = self . actor_task . lock ( ) . expect ( "poisoned" ) . take ( ) ;
1466
+ if let Some ( task) = task {
1465
1467
// give the tasks a moment to shutdown cleanly
1466
1468
let shutdown_done = time:: timeout ( Duration :: from_millis ( 100 ) , async move {
1467
1469
if let Err ( err) = task. await {
@@ -1502,7 +1504,7 @@ struct DiscoState {
1502
1504
/// Encryption key for this node.
1503
1505
secret_encryption_key : crypto_box:: SecretKey ,
1504
1506
/// The state for an active DiscoKey.
1505
- secrets : std :: sync :: Mutex < HashMap < PublicKey , SharedSecret > > ,
1507
+ secrets : Mutex < HashMap < PublicKey , SharedSecret > > ,
1506
1508
/// Disco (ping) queue
1507
1509
sender : mpsc:: Sender < ( SendAddr , PublicKey , disco:: Message ) > ,
1508
1510
}
0 commit comments