1
1
use crate :: connection:: Connection ;
2
2
use crate :: datasrv:: DataObjectId ;
3
- use crate :: internal:: datasrv:: DataObjectRef ;
4
3
use crate :: internal:: datasrv:: messages:: {
5
4
DataDown , FromDataClientMessage , ToDataClientMessageDown ,
6
5
} ;
7
6
use crate :: internal:: datasrv:: utils:: DataObjectComposer ;
7
+ use crate :: internal:: datasrv:: DataObjectRef ;
8
8
use crate :: { Map , WrappedRcRefCell } ;
9
9
use orion:: kex:: SecretKey ;
10
10
use priority_queue:: PriorityQueue ;
@@ -13,8 +13,8 @@ use std::rc::Rc;
13
13
use std:: sync:: Arc ;
14
14
use std:: time:: Duration ;
15
15
use tokio:: net:: TcpStream ;
16
- use tokio:: sync:: { Notify , OwnedSemaphorePermit , Semaphore , oneshot } ;
17
- use tokio:: task:: { AbortHandle , JoinSet , spawn_local } ;
16
+ use tokio:: sync:: { oneshot , Notify , OwnedSemaphorePermit , Semaphore } ;
17
+ use tokio:: task:: { spawn_local , AbortHandle , JoinSet } ;
18
18
use tokio:: time:: Instant ;
19
19
20
20
const PROTOCOL_VERSION : u32 = 0 ;
@@ -304,29 +304,28 @@ pub(crate) async fn download_manager_process<
304
304
let mut join_set = JoinSet :: new ( ) ;
305
305
let semaphore = Arc :: new ( Semaphore :: new ( max_parallel_downloads as usize ) ) ;
306
306
loop {
307
- {
308
- let permit = semaphore. clone ( ) . acquire_owned ( ) . await . unwrap ( ) ;
309
- let is_empty = {
310
- let mut dm = dm_ref. get_mut ( ) ;
311
- if let Some ( ( data_id, _) ) = dm. download_queue . pop ( ) {
312
- let abort = join_set. spawn_local ( download_process (
313
- dm_ref. clone ( ) ,
314
- data_id,
315
- permit,
316
- max_download_tries,
317
- wait_between_download_tries,
318
- ) ) ;
319
- let info = dm. download_info . get_mut ( & data_id) . unwrap ( ) ;
320
- assert ! ( info. abort_handle. is_none( ) ) ;
321
- info. abort_handle = Some ( abort) ;
322
- dm. download_queue . is_empty ( )
323
- } else {
324
- true
325
- }
326
- } ;
327
- if is_empty {
328
- notify. notified ( ) . await ;
307
+ let permit = semaphore. clone ( ) . acquire_owned ( ) . await . unwrap ( ) ;
308
+ let is_empty = {
309
+ let mut dm = dm_ref. get_mut ( ) ;
310
+ if let Some ( ( data_id, _) ) = dm. download_queue . pop ( ) {
311
+ let abort = join_set. spawn_local ( download_process (
312
+ dm_ref. clone ( ) ,
313
+ data_id,
314
+ permit,
315
+ max_download_tries,
316
+ wait_between_download_tries,
317
+ ) ) ;
318
+ let info = dm. download_info . get_mut ( & data_id) . unwrap ( ) ;
319
+ assert ! ( info. abort_handle. is_none( ) ) ;
320
+ info. abort_handle = Some ( abort) ;
321
+ dm. download_queue . is_empty ( )
322
+ } else {
323
+ true
329
324
}
330
325
} ;
326
+ if is_empty {
327
+ notify. notified ( ) . await ;
328
+ }
329
+ while let Some ( _) = join_set. try_join_next ( ) { /* Do nothing */ }
331
330
}
332
331
}
0 commit comments