@@ -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,158 +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.
486475 #[ cfg( feature = "common-os" ) ]
487476 #[ cfg_attr( not( target_arch = "x86_64" ) , expect( dead_code) ) ]
488- pub async fn recreate_objmap ( & self ) -> io:: Result < ( ) > {
477+ pub fn recreate_objmap ( & self ) -> io:: Result < ( ) > {
489478 let mut map = HashMap :: < FileDescriptor , Arc < dyn ObjectInterface > , RandomState > :: with_hasher (
490479 RandomState :: with_seeds ( 0 , 0 , 0 , 0 ) ,
491480 ) ;
492481
493- future:: poll_fn ( |cx| {
494- without_interrupts ( || {
495- let borrowed = self . current_task . borrow ( ) ;
496- let mut pinned_obj = core:: pin:: pin!( borrowed. object_map. read( ) ) ;
497-
498- let guard = ready ! ( pinned_obj. as_mut( ) . poll( cx) ) ;
499- // clone standard file descriptors
500- for i in 0 ..3 {
501- if let Some ( obj) = guard. get ( & i) {
502- map. insert ( i, obj. clone ( ) ) ;
503- }
504- }
482+ without_interrupts ( || {
483+ let mut current_task = self . current_task . borrow_mut ( ) ;
484+ let object_map = current_task. object_map . read ( ) ;
505485
506- Ready ( io:: Result :: Ok ( ( ) ) )
507- } )
508- } )
509- . 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+ }
510492
511- without_interrupts ( || {
512- 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) ) ;
513495 } ) ;
514496
515497 Ok ( ( ) )
516498 }
517499
518500 /// Insert a new IO interface and returns a file descriptor as
519501 /// identifier to this object
520- pub async fn insert_object ( & self , obj : Arc < dyn ObjectInterface > ) -> io:: Result < FileDescriptor > {
521- future:: poll_fn ( |cx| {
522- without_interrupts ( || {
523- let borrowed = self . current_task . borrow ( ) ;
524- let mut pinned_obj = core:: pin:: pin!( borrowed. object_map. write( ) ) ;
525-
526- let mut guard = ready ! ( pinned_obj. as_mut( ) . poll( cx) ) ;
527- let new_fd = || -> io:: Result < FileDescriptor > {
528- let mut fd: FileDescriptor = 0 ;
529- loop {
530- if !guard. contains_key ( & fd) {
531- break Ok ( fd) ;
532- } else if fd == FileDescriptor :: MAX {
533- break Err ( Errno :: Overflow ) ;
534- }
535-
536- 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 ) ;
537514 }
538- } ;
539515
540- let fd = new_fd ( ) ?;
541- let _ = guard. insert ( fd, obj. clone ( ) ) ;
542- Ready ( Ok ( fd) )
543- } )
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)
544523 } )
545- . await
546524 }
547525
548526 /// Duplicate a IO interface and returns a new file descriptor as
549527 /// identifier to the new copy
550- pub async fn dup_object ( & self , fd : FileDescriptor ) -> io:: Result < FileDescriptor > {
551- future:: poll_fn ( |cx| {
552- without_interrupts ( || {
553- let borrowed = self . current_task . borrow ( ) ;
554- let mut pinned_obj = core:: pin:: pin!( borrowed. object_map. write( ) ) ;
555-
556- let mut guard = ready ! ( pinned_obj. as_mut( ) . poll( cx) ) ;
557- let obj = ( * ( guard. get ( & fd) . ok_or ( Errno :: Inval ) ?) ) . clone ( ) ;
558-
559- let new_fd = || -> io:: Result < FileDescriptor > {
560- let mut fd: FileDescriptor = 0 ;
561- loop {
562- if !guard. contains_key ( & fd) {
563- break Ok ( fd) ;
564- } else if fd == FileDescriptor :: MAX {
565- break Err ( Errno :: Overflow ) ;
566- }
567-
568- 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 ) ;
569542 }
570- } ;
571543
572- let fd = new_fd ( ) ?;
573- if guard. try_insert ( fd, obj) . is_err ( ) {
574- Ready ( Err ( Errno :: Mfile ) )
575- } else {
576- Ready ( Ok ( fd) )
544+ fd = fd. saturating_add ( 1 ) ;
577545 }
578- } )
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+ }
579554 } )
580- . await
581555 }
582556
583- pub async fn dup_object2 (
557+ pub fn dup_object2 (
584558 & self ,
585559 fd1 : FileDescriptor ,
586560 fd2 : FileDescriptor ,
587561 ) -> io:: Result < FileDescriptor > {
588- future:: poll_fn ( |cx| {
589- without_interrupts ( || {
590- let borrowed = self . current_task . borrow ( ) ;
591- let mut pinned_obj = core:: pin:: pin!( borrowed. object_map. write( ) ) ;
592- let mut guard = ready ! ( pinned_obj. as_mut( ) . poll( cx) ) ;
593- 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 ( ) ;
594565
595- if guard. try_insert ( fd2, obj) . is_err ( ) {
596- Ready ( Err ( Errno :: Mfile ) )
597- } else {
598- Ready ( Ok ( fd2) )
599- }
600- } )
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+ }
601573 } )
602- . await
603574 }
604575
605576 /// Remove a IO interface, which is named by the file descriptor
606- pub async fn remove_object ( & self , fd : FileDescriptor ) -> io:: Result < Arc < dyn ObjectInterface > > {
607- future:: poll_fn ( |cx| {
608- without_interrupts ( || {
609- let borrowed = self . current_task . borrow ( ) ;
610- let mut pinned_obj = core:: pin:: pin!( borrowed. object_map. write( ) ) ;
611- let mut guard = ready ! ( pinned_obj. as_mut( ) . poll( cx) ) ;
612- Ready ( guard. remove ( & fd) . ok_or ( Errno :: Badf ) )
613- } )
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 )
614583 } )
615- . await
616584 }
617585
618586 #[ inline]
0 commit comments