@@ -7,13 +7,10 @@ use alloc::sync::Arc;
7
7
#[ cfg( feature = "smp" ) ]
8
8
use alloc:: vec:: Vec ;
9
9
use core:: cell:: RefCell ;
10
- use core:: future:: { self , Future } ;
11
10
use core:: ptr;
12
11
#[ cfg( all( target_arch = "x86_64" , feature = "smp" ) ) ]
13
12
use core:: sync:: atomic:: AtomicBool ;
14
13
use core:: sync:: atomic:: { AtomicI32 , AtomicU32 , Ordering } ;
15
- use core:: task:: Poll :: Ready ;
16
- use core:: task:: ready;
17
14
18
15
use ahash:: RandomState ;
19
16
use crossbeam_utils:: Backoff ;
@@ -223,8 +220,7 @@ struct NewTask {
223
220
prio : Priority ,
224
221
core_id : CoreId ,
225
222
stacks : TaskStacks ,
226
- object_map :
227
- Arc < async_lock:: RwLock < HashMap < FileDescriptor , Arc < dyn ObjectInterface > , RandomState > > > ,
223
+ object_map : Arc < RwSpinLock < HashMap < FileDescriptor , Arc < dyn ObjectInterface > , RandomState > > > ,
228
224
}
229
225
230
226
impl From < NewTask > for Task {
@@ -461,157 +457,130 @@ impl PerCoreScheduler {
461
457
#[ inline]
462
458
pub fn get_current_task_object_map (
463
459
& self ,
464
- ) -> Arc < async_lock :: RwLock < HashMap < FileDescriptor , Arc < dyn ObjectInterface > , RandomState > > > {
460
+ ) -> Arc < RwSpinLock < HashMap < FileDescriptor , Arc < dyn ObjectInterface > , RandomState > > > {
465
461
without_interrupts ( || self . current_task . borrow ( ) . object_map . clone ( ) )
466
462
}
467
463
468
464
/// Map a file descriptor to their IO interface and returns
469
465
/// the shared reference
470
466
#[ inline]
471
- pub async fn get_object ( & self , fd : FileDescriptor ) -> io:: Result < Arc < dyn ObjectInterface > > {
472
- future:: poll_fn ( |cx| {
473
- without_interrupts ( || {
474
- let borrowed = self . current_task . borrow ( ) ;
475
- let mut pinned_obj = core:: pin:: pin!( borrowed. object_map. read( ) ) ;
476
-
477
- let guard = ready ! ( pinned_obj. as_mut( ) . poll( cx) ) ;
478
- Ready ( guard. get ( & fd) . cloned ( ) . ok_or ( Errno :: Badf ) )
479
- } )
480
- } )
481
- . await
467
+ pub fn get_object ( & self , fd : FileDescriptor ) -> io:: Result < Arc < dyn ObjectInterface > > {
468
+ let current_task = self . current_task . borrow ( ) ;
469
+ let object_map = current_task. object_map . read ( ) ;
470
+ object_map. get ( & fd) . cloned ( ) . ok_or ( Errno :: Badf )
482
471
}
483
472
484
473
/// Creates a new map between file descriptor and their IO interface and
485
474
/// clone the standard descriptors.
486
- #[ allow( dead_code) ]
487
- pub async fn recreate_objmap ( & self ) -> io:: Result < ( ) > {
475
+ #[ cfg( feature = "common-os" ) ]
476
+ #[ cfg_attr( not( target_arch = "x86_64" ) , expect( dead_code) ) ]
477
+ pub fn recreate_objmap ( & self ) -> io:: Result < ( ) > {
488
478
let mut map = HashMap :: < FileDescriptor , Arc < dyn ObjectInterface > , RandomState > :: with_hasher (
489
479
RandomState :: with_seeds ( 0 , 0 , 0 , 0 ) ,
490
480
) ;
491
481
492
- future:: poll_fn ( |cx| {
493
- without_interrupts ( || {
494
- let borrowed = self . current_task . borrow ( ) ;
495
- let mut pinned_obj = core:: pin:: pin!( borrowed. object_map. read( ) ) ;
496
-
497
- let guard = ready ! ( pinned_obj. as_mut( ) . poll( cx) ) ;
498
- // clone standard file descriptors
499
- for i in 0 ..3 {
500
- if let Some ( obj) = guard. get ( & i) {
501
- map. insert ( i, obj. clone ( ) ) ;
502
- }
503
- }
482
+ without_interrupts ( || {
483
+ let mut current_task = self . current_task . borrow_mut ( ) ;
484
+ let object_map = current_task. object_map . read ( ) ;
504
485
505
- Ready ( io:: Result :: Ok ( ( ) ) )
506
- } )
507
- } )
508
- . await ?;
486
+ // clone standard file descriptors
487
+ for i in 0 ..3 {
488
+ if let Some ( obj) = object_map. get ( & i) {
489
+ map. insert ( i, obj. clone ( ) ) ;
490
+ }
491
+ }
509
492
510
- without_interrupts ( || {
511
- self . current_task . borrow_mut ( ) . object_map = Arc :: new ( async_lock :: RwLock :: new ( map) ) ;
493
+ drop ( object_map ) ;
494
+ current_task. object_map = Arc :: new ( RwSpinLock :: new ( map) ) ;
512
495
} ) ;
513
496
514
497
Ok ( ( ) )
515
498
}
516
499
517
500
/// Insert a new IO interface and returns a file descriptor as
518
501
/// identifier to this object
519
- pub async fn insert_object ( & self , obj : Arc < dyn ObjectInterface > ) -> io:: Result < FileDescriptor > {
520
- future:: poll_fn ( |cx| {
521
- without_interrupts ( || {
522
- let borrowed = self . current_task . borrow ( ) ;
523
- let mut pinned_obj = core:: pin:: pin!( borrowed. object_map. write( ) ) ;
524
-
525
- let mut guard = ready ! ( pinned_obj. as_mut( ) . poll( cx) ) ;
526
- let new_fd = || -> io:: Result < FileDescriptor > {
527
- let mut fd: FileDescriptor = 0 ;
528
- loop {
529
- if !guard. contains_key ( & fd) {
530
- break Ok ( fd) ;
531
- } else if fd == FileDescriptor :: MAX {
532
- break Err ( Errno :: Overflow ) ;
533
- }
534
-
535
- fd = fd. saturating_add ( 1 ) ;
502
+ pub fn insert_object ( & self , obj : Arc < dyn ObjectInterface > ) -> io:: Result < FileDescriptor > {
503
+ without_interrupts ( || {
504
+ let current_task = self . current_task . borrow ( ) ;
505
+ let mut object_map = current_task. object_map . write ( ) ;
506
+
507
+ let new_fd = || -> io:: Result < FileDescriptor > {
508
+ let mut fd: FileDescriptor = 0 ;
509
+ loop {
510
+ if !object_map. contains_key ( & fd) {
511
+ break Ok ( fd) ;
512
+ } else if fd == FileDescriptor :: MAX {
513
+ break Err ( Errno :: Overflow ) ;
536
514
}
537
- } ;
538
515
539
- let fd = new_fd ( ) ?;
540
- let _ = guard. insert ( fd, obj. clone ( ) ) ;
541
- Ready ( Ok ( fd) )
542
- } )
516
+ fd = fd. saturating_add ( 1 ) ;
517
+ }
518
+ } ;
519
+
520
+ let fd = new_fd ( ) ?;
521
+ let _ = object_map. insert ( fd, obj. clone ( ) ) ;
522
+ Ok ( fd)
543
523
} )
544
- . await
545
524
}
546
525
547
526
/// Duplicate a IO interface and returns a new file descriptor as
548
527
/// identifier to the new copy
549
- pub async fn dup_object ( & self , fd : FileDescriptor ) -> io:: Result < FileDescriptor > {
550
- future:: poll_fn ( |cx| {
551
- without_interrupts ( || {
552
- let borrowed = self . current_task . borrow ( ) ;
553
- let mut pinned_obj = core:: pin:: pin!( borrowed. object_map. write( ) ) ;
554
-
555
- let mut guard = ready ! ( pinned_obj. as_mut( ) . poll( cx) ) ;
556
- let obj = ( * ( guard. get ( & fd) . ok_or ( Errno :: Inval ) ?) ) . clone ( ) ;
557
-
558
- let new_fd = || -> io:: Result < FileDescriptor > {
559
- let mut fd: FileDescriptor = 0 ;
560
- loop {
561
- if !guard. contains_key ( & fd) {
562
- break Ok ( fd) ;
563
- } else if fd == FileDescriptor :: MAX {
564
- break Err ( Errno :: Overflow ) ;
565
- }
566
-
567
- fd = fd. saturating_add ( 1 ) ;
528
+ pub fn dup_object ( & self , fd : FileDescriptor ) -> io:: Result < FileDescriptor > {
529
+ without_interrupts ( || {
530
+ let current_task = self . current_task . borrow ( ) ;
531
+ let mut object_map = current_task. object_map . write ( ) ;
532
+
533
+ let obj = ( * ( object_map. get ( & fd) . ok_or ( Errno :: Inval ) ?) ) . clone ( ) ;
534
+
535
+ let new_fd = || -> io:: Result < FileDescriptor > {
536
+ let mut fd: FileDescriptor = 0 ;
537
+ loop {
538
+ if !object_map. contains_key ( & fd) {
539
+ break Ok ( fd) ;
540
+ } else if fd == FileDescriptor :: MAX {
541
+ break Err ( Errno :: Overflow ) ;
568
542
}
569
- } ;
570
543
571
- let fd = new_fd ( ) ?;
572
- if guard. try_insert ( fd, obj) . is_err ( ) {
573
- Ready ( Err ( Errno :: Mfile ) )
574
- } else {
575
- Ready ( Ok ( fd) )
544
+ fd = fd. saturating_add ( 1 ) ;
576
545
}
577
- } )
546
+ } ;
547
+
548
+ let fd = new_fd ( ) ?;
549
+ if object_map. try_insert ( fd, obj) . is_err ( ) {
550
+ Err ( Errno :: Mfile )
551
+ } else {
552
+ Ok ( fd)
553
+ }
578
554
} )
579
- . await
580
555
}
581
556
582
- pub async fn dup_object2 (
557
+ pub fn dup_object2 (
583
558
& self ,
584
559
fd1 : FileDescriptor ,
585
560
fd2 : FileDescriptor ,
586
561
) -> io:: Result < FileDescriptor > {
587
- future:: poll_fn ( |cx| {
588
- without_interrupts ( || {
589
- let borrowed = self . current_task . borrow ( ) ;
590
- let mut pinned_obj = core:: pin:: pin!( borrowed. object_map. write( ) ) ;
591
- let mut guard = ready ! ( pinned_obj. as_mut( ) . poll( cx) ) ;
592
- let obj = guard. get ( & fd1) . cloned ( ) . ok_or ( Errno :: Badf ) ?;
562
+ without_interrupts ( || {
563
+ let current_task = self . current_task . borrow ( ) ;
564
+ let mut object_map = current_task. object_map . write ( ) ;
593
565
594
- if guard. try_insert ( fd2, obj) . is_err ( ) {
595
- Ready ( Err ( Errno :: Mfile ) )
596
- } else {
597
- Ready ( Ok ( fd2) )
598
- }
599
- } )
566
+ let obj = object_map. get ( & fd1) . cloned ( ) . ok_or ( Errno :: Badf ) ?;
567
+
568
+ if object_map. try_insert ( fd2, obj) . is_err ( ) {
569
+ Err ( Errno :: Mfile )
570
+ } else {
571
+ Ok ( fd2)
572
+ }
600
573
} )
601
- . await
602
574
}
603
575
604
576
/// Remove a IO interface, which is named by the file descriptor
605
- pub async fn remove_object ( & self , fd : FileDescriptor ) -> io:: Result < Arc < dyn ObjectInterface > > {
606
- future:: poll_fn ( |cx| {
607
- without_interrupts ( || {
608
- let borrowed = self . current_task . borrow ( ) ;
609
- let mut pinned_obj = core:: pin:: pin!( borrowed. object_map. write( ) ) ;
610
- let mut guard = ready ! ( pinned_obj. as_mut( ) . poll( cx) ) ;
611
- Ready ( guard. remove ( & fd) . ok_or ( Errno :: Badf ) )
612
- } )
577
+ pub fn remove_object ( & self , fd : FileDescriptor ) -> io:: Result < Arc < dyn ObjectInterface > > {
578
+ without_interrupts ( || {
579
+ let current_task = self . current_task . borrow ( ) ;
580
+ let mut object_map = current_task. object_map . write ( ) ;
581
+
582
+ object_map. remove ( & fd) . ok_or ( Errno :: Badf )
613
583
} )
614
- . await
615
584
}
616
585
617
586
#[ inline]
0 commit comments