@@ -255,24 +255,7 @@ impl Udp {
255
255
256
256
let running = tokio:: task:: spawn ( async move {
257
257
debug ! ( target: "UDP TRACKER" , "Started: Waiting for packets on socket address: udp://{address} ..." ) ;
258
-
259
- let tracker = tracker. clone ( ) ;
260
- let socket = socket. clone ( ) ;
261
-
262
- let reqs = & mut ActiveRequests :: default ( ) ;
263
-
264
- // Main Waiting Loop, awaits on async [`receive_request`].
265
- loop {
266
- if let Some ( h) = reqs. rb . push_overwrite (
267
- Self :: do_request ( Self :: receive_request ( socket. clone ( ) ) . await , tracker. clone ( ) , socket. clone ( ) ) . abort_handle ( ) ,
268
- ) {
269
- if !h. is_finished ( ) {
270
- // the task is still running, lets yield and give it a chance to flush.
271
- tokio:: task:: yield_now ( ) . await ;
272
- h. abort ( ) ;
273
- }
274
- }
275
- }
258
+ Self :: run_udp_server ( tracker, socket) . await ;
276
259
} ) ;
277
260
278
261
tx_start
@@ -292,6 +275,27 @@ impl Udp {
292
275
task:: yield_now ( ) . await ; // lets allow the other threads to complete.
293
276
}
294
277
278
+ async fn run_udp_server ( tracker : Arc < Tracker > , socket : Arc < UdpSocket > ) {
279
+ let tracker = tracker. clone ( ) ;
280
+ let socket = socket. clone ( ) ;
281
+
282
+ let reqs = & mut ActiveRequests :: default ( ) ;
283
+
284
+ // Main Waiting Loop, awaits on async [`receive_request`].
285
+ loop {
286
+ if let Some ( h) = reqs. rb . push_overwrite (
287
+ Self :: spawn_request_processor ( Self :: receive_request ( socket. clone ( ) ) . await , tracker. clone ( ) , socket. clone ( ) )
288
+ . abort_handle ( ) ,
289
+ ) {
290
+ if !h. is_finished ( ) {
291
+ // the task is still running, lets yield and give it a chance to flush.
292
+ tokio:: task:: yield_now ( ) . await ;
293
+ h. abort ( ) ;
294
+ }
295
+ }
296
+ }
297
+ }
298
+
295
299
async fn receive_request ( socket : Arc < UdpSocket > ) -> Result < UdpRequest , Box < std:: io:: Error > > {
296
300
// Wait for the socket to be readable
297
301
socket. readable ( ) . await ?;
@@ -309,26 +313,27 @@ impl Udp {
309
313
}
310
314
}
311
315
312
- fn do_request (
316
+ fn spawn_request_processor (
313
317
result : Result < UdpRequest , Box < std:: io:: Error > > ,
314
318
tracker : Arc < Tracker > ,
315
319
socket : Arc < UdpSocket > ,
316
320
) -> JoinHandle < ( ) > {
317
- // timeout not needed, as udp is non-blocking.
318
- tokio:: task:: spawn ( async move {
319
- match result {
320
- Ok ( udp_request) => {
321
- trace ! ( "Received Request from: {}" , udp_request. from) ;
322
- Self :: make_response ( tracker. clone ( ) , socket. clone ( ) , udp_request) . await ;
323
- }
324
- Err ( error) => {
325
- debug ! ( "error: {error}" ) ;
326
- }
321
+ tokio:: task:: spawn ( Self :: process_request ( result, tracker, socket) )
322
+ }
323
+
324
+ async fn process_request ( result : Result < UdpRequest , Box < std:: io:: Error > > , tracker : Arc < Tracker > , socket : Arc < UdpSocket > ) {
325
+ match result {
326
+ Ok ( udp_request) => {
327
+ trace ! ( "Received Request from: {}" , udp_request. from) ;
328
+ Self :: process_valid_request ( tracker. clone ( ) , socket. clone ( ) , udp_request) . await ;
327
329
}
328
- } )
330
+ Err ( error) => {
331
+ debug ! ( "error: {error}" ) ;
332
+ }
333
+ }
329
334
}
330
335
331
- async fn make_response ( tracker : Arc < Tracker > , socket : Arc < UdpSocket > , udp_request : UdpRequest ) {
336
+ async fn process_valid_request ( tracker : Arc < Tracker > , socket : Arc < UdpSocket > , udp_request : UdpRequest ) {
332
337
trace ! ( "Making Response to {udp_request:?}" ) ;
333
338
let from = udp_request. from ;
334
339
let response = handlers:: handle_packet ( udp_request, & tracker. clone ( ) , socket. clone ( ) ) . await ;
0 commit comments