@@ -9,6 +9,7 @@ use std::{
9
9
10
10
use async_trait:: async_trait;
11
11
use bytes:: Bytes ;
12
+ use futures:: future:: { self , AbortHandle } ;
12
13
use log:: { debug, error, trace, warn} ;
13
14
use lru_time_cache:: LruCache ;
14
15
use shadowsocks:: {
@@ -23,7 +24,6 @@ use spin::Mutex as SpinMutex;
23
24
use tokio:: {
24
25
net:: UdpSocket ,
25
26
sync:: { mpsc, Mutex } ,
26
- task:: JoinHandle ,
27
27
time,
28
28
} ;
29
29
53
53
respond_writer : W ,
54
54
context : Arc < ServiceContext > ,
55
55
assoc_map : SharedAssociationMap < W > ,
56
- cleanup_abortable : JoinHandle < ( ) > ,
57
- keepalive_abortable : JoinHandle < ( ) > ,
56
+ cleanup_abortable : AbortHandle ,
57
+ keepalive_abortable : AbortHandle ,
58
58
keepalive_tx : mpsc:: Sender < SocketAddr > ,
59
59
balancer : PingBalancer ,
60
60
}
@@ -89,25 +89,29 @@ where
89
89
90
90
let cleanup_abortable = {
91
91
let assoc_map = assoc_map. clone ( ) ;
92
- tokio :: spawn ( async move {
92
+ let ( cleanup_task , cleanup_abortable ) = future :: abortable ( async move {
93
93
loop {
94
94
time:: sleep ( time_to_live) . await ;
95
95
96
96
// cleanup expired associations. iter() will remove expired elements
97
97
let _ = assoc_map. lock ( ) . await . iter ( ) ;
98
98
}
99
- } )
99
+ } ) ;
100
+ tokio:: spawn ( cleanup_task) ;
101
+ cleanup_abortable
100
102
} ;
101
103
102
- let ( keepalive_tx, mut keepalive_rx) = mpsc:: channel ( 64 ) ;
104
+ let ( keepalive_tx, mut keepalive_rx) = mpsc:: channel ( 256 ) ;
103
105
104
106
let keepalive_abortable = {
105
107
let assoc_map = assoc_map. clone ( ) ;
106
- tokio :: spawn ( async move {
108
+ let ( keepalive_task , keepalive_abortable ) = future :: abortable ( async move {
107
109
while let Some ( peer_addr) = keepalive_rx. recv ( ) . await {
108
110
assoc_map. lock ( ) . await . get ( & peer_addr) ;
109
111
}
110
- } )
112
+ } ) ;
113
+ tokio:: spawn ( keepalive_task) ;
114
+ keepalive_abortable
111
115
} ;
112
116
113
117
UdpAssociationManager {
@@ -195,7 +199,7 @@ enum UdpAssociationBypassState {
195
199
Empty ,
196
200
Connected {
197
201
socket : Arc < UdpSocket > ,
198
- abortable : JoinHandle < io :: Result < ( ) > > ,
202
+ abortable : AbortHandle ,
199
203
} ,
200
204
Aborted ,
201
205
}
@@ -213,7 +217,7 @@ impl UdpAssociationBypassState {
213
217
UdpAssociationBypassState :: Empty
214
218
}
215
219
216
- fn set_connected ( & mut self , socket : Arc < UdpSocket > , abortable : JoinHandle < io :: Result < ( ) > > ) {
220
+ fn set_connected ( & mut self , socket : Arc < UdpSocket > , abortable : AbortHandle ) {
217
221
* self = UdpAssociationBypassState :: Connected { socket, abortable } ;
218
222
}
219
223
@@ -226,7 +230,7 @@ enum UdpAssociationProxyState {
226
230
Empty ,
227
231
Connected {
228
232
socket : Arc < MonProxySocket > ,
229
- abortable : JoinHandle < io :: Result < ( ) > > ,
233
+ abortable : AbortHandle ,
230
234
} ,
231
235
Aborted ,
232
236
}
@@ -247,7 +251,7 @@ impl UdpAssociationProxyState {
247
251
* self = UdpAssociationProxyState :: Empty ;
248
252
}
249
253
250
- fn set_connected ( & mut self , socket : Arc < MonProxySocket > , abortable : JoinHandle < io :: Result < ( ) > > ) {
254
+ fn set_connected ( & mut self , socket : Arc < MonProxySocket > , abortable : AbortHandle ) {
251
255
self . abort_inner ( ) ;
252
256
* self = UdpAssociationProxyState :: Connected { socket, abortable } ;
253
257
}
@@ -390,12 +394,13 @@ where
390
394
ShadowUdpSocket :: connect_any_with_opts ( & target_addr, self . context . connect_opts_ref ( ) ) . await ?;
391
395
let socket: Arc < UdpSocket > = Arc :: new ( socket. into ( ) ) ;
392
396
393
- // CLIENT <- REMOTE
394
- let r2l_abortable = {
397
+ let ( r2l_fut, r2l_abortable) = {
395
398
let assoc = self . clone ( ) ;
396
- tokio :: spawn ( assoc. copy_bypassed_r2l ( socket. clone ( ) ) )
399
+ future :: abortable ( assoc. copy_bypassed_r2l ( socket. clone ( ) ) )
397
400
} ;
398
401
402
+ // CLIENT <- REMOTE
403
+ tokio:: spawn ( r2l_fut) ;
399
404
debug ! (
400
405
"created udp association for {} (bypassed) with {:?}" ,
401
406
self . peer_addr,
@@ -444,12 +449,13 @@ where
444
449
ShadowUdpSocket :: connect_any_with_opts ( & target_addr, self . context . connect_opts_ref ( ) ) . await ?;
445
450
let socket: Arc < UdpSocket > = Arc :: new ( socket. into ( ) ) ;
446
451
447
- // CLIENT <- REMOTE
448
- let r2l_abortable = {
452
+ let ( r2l_fut, r2l_abortable) = {
449
453
let assoc = self . clone ( ) ;
450
- tokio :: spawn ( assoc. copy_bypassed_r2l ( socket. clone ( ) ) )
454
+ future :: abortable ( assoc. copy_bypassed_r2l ( socket. clone ( ) ) )
451
455
} ;
452
456
457
+ // CLIENT <- REMOTE
458
+ tokio:: spawn ( r2l_fut) ;
453
459
debug ! (
454
460
"created udp association for {} (bypassed) with {:?}" ,
455
461
self . peer_addr,
@@ -509,12 +515,14 @@ where
509
515
let socket = MonProxySocket :: from_socket ( socket, self . context . flow_stat ( ) ) ;
510
516
let socket = Arc :: new ( socket) ;
511
517
512
- // CLIENT <- REMOTE
513
- let r2l_abortable = {
518
+ let ( r2l_fut, r2l_abortable) = {
514
519
let assoc = self . clone ( ) ;
515
- tokio :: spawn ( assoc. copy_proxied_r2l ( socket. clone ( ) ) )
520
+ future :: abortable ( assoc. copy_proxied_r2l ( socket. clone ( ) ) )
516
521
} ;
517
522
523
+ // CLIENT <- REMOTE
524
+ tokio:: spawn ( r2l_fut) ;
525
+
518
526
debug ! (
519
527
"created udp association for {} <-> {} (proxied) with {:?}" ,
520
528
self . peer_addr,
0 commit comments