@@ -7,13 +7,10 @@ use alloc::sync::Arc;
77#[ cfg( feature = "smp" ) ]
88use alloc:: vec:: Vec ;
99use core:: cell:: RefCell ;
10- use core:: future:: { self , Future } ;
1110use core:: ptr;
1211#[ cfg( all( target_arch = "x86_64" , feature = "smp" ) ) ]
1312use core:: sync:: atomic:: AtomicBool ;
1413use core:: sync:: atomic:: { AtomicI32 , AtomicU32 , Ordering } ;
15- use core:: task:: Poll :: Ready ;
16- use core:: task:: ready;
1714
1815use ahash:: RandomState ;
1916use crossbeam_utils:: Backoff ;
@@ -223,8 +220,7 @@ struct NewTask {
223220 prio : Priority ,
224221 core_id : CoreId ,
225222 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 > > > ,
228224}
229225
230226impl From < NewTask > for Task {
@@ -461,157 +457,130 @@ impl PerCoreScheduler {
461457 #[ inline]
462458 pub fn get_current_task_object_map (
463459 & self ,
464- ) -> Arc < async_lock :: RwLock < HashMap < FileDescriptor , Arc < dyn ObjectInterface > , RandomState > > > {
460+ ) -> Arc < RwSpinLock < HashMap < FileDescriptor , Arc < dyn ObjectInterface > , RandomState > > > {
465461 without_interrupts ( || self . current_task . borrow ( ) . object_map . clone ( ) )
466462 }
467463
468464 /// Map a file descriptor to their IO interface and returns
469465 /// the shared reference
470466 #[ 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 )
482471 }
483472
484473 /// Creates a new map between file descriptor and their IO interface and
485474 /// 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 < ( ) > {
488478 let mut map = HashMap :: < FileDescriptor , Arc < dyn ObjectInterface > , RandomState > :: with_hasher (
489479 RandomState :: with_seeds ( 0 , 0 , 0 , 0 ) ,
490480 ) ;
491481
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 ( ) ;
504485
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+ }
509492
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) ) ;
512495 } ) ;
513496
514497 Ok ( ( ) )
515498 }
516499
517500 /// Insert a new IO interface and returns a file descriptor as
518501 /// 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 ) ;
536514 }
537- } ;
538515
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)
543523 } )
544- . await
545524 }
546525
547526 /// Duplicate a IO interface and returns a new file descriptor as
548527 /// 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 ) ;
568542 }
569- } ;
570543
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 ) ;
576545 }
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+ }
578554 } )
579- . await
580555 }
581556
582- pub async fn dup_object2 (
557+ pub fn dup_object2 (
583558 & self ,
584559 fd1 : FileDescriptor ,
585560 fd2 : FileDescriptor ,
586561 ) -> 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 ( ) ;
593565
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+ }
600573 } )
601- . await
602574 }
603575
604576 /// 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 )
613583 } )
614- . await
615584 }
616585
617586 #[ inline]
0 commit comments