@@ -6,6 +6,7 @@ use core::ffi::CStr;
66use core:: future;
77use core:: hint:: black_box;
88use core:: mem:: MaybeUninit ;
9+ use core:: pin:: pin;
910use core:: task:: Poll ;
1011
1112use hermit_sync:: { InterruptTicketMutex , Lazy } ;
@@ -579,28 +580,34 @@ impl WasmManager {
579580
580581async fn wasm_run ( ) {
581582 loop {
582- while let Some ( ( fd, data) ) = OUTPUT . lock ( ) . data . pop_front ( ) {
583- let obj = match fd {
584- Descriptor :: Stdout => crate :: core_scheduler ( )
585- . get_object ( fd:: STDOUT_FILENO )
586- . unwrap ( ) ,
587- Descriptor :: Stderr => crate :: core_scheduler ( )
588- . get_object ( fd:: STDERR_FILENO )
589- . unwrap ( ) ,
590- Descriptor :: RawFd ( raw_fd) => crate :: core_scheduler ( ) . get_object ( raw_fd) . unwrap ( ) ,
591- _ => panic ! ( "Unsuppted {fd:?}" ) ,
592- } ;
593-
594- obj. write ( & data) . await . unwrap ( ) ;
595- }
596-
597583 future:: poll_fn ( |cx| {
598- let mut guard = OUTPUT . lock ( ) ;
599- if guard. data . is_empty ( ) {
600- guard. waker . register ( cx. waker ( ) ) ;
601- Poll :: Pending
584+ if let Some ( mut guard) = OUTPUT . try_lock ( ) {
585+ if let Some ( ( fd, data) ) = guard. data . pop_front ( ) {
586+ let obj = match fd {
587+ Descriptor :: Stdout => crate :: core_scheduler ( )
588+ . get_object ( fd:: STDOUT_FILENO )
589+ . unwrap ( ) ,
590+ Descriptor :: Stderr => crate :: core_scheduler ( )
591+ . get_object ( fd:: STDERR_FILENO )
592+ . unwrap ( ) ,
593+ Descriptor :: RawFd ( raw_fd) => {
594+ crate :: core_scheduler ( ) . get_object ( raw_fd) . unwrap ( )
595+ }
596+ _ => panic ! ( "Unsuppted {fd:?}" ) ,
597+ } ;
598+
599+ drop ( guard) ;
600+ while let Poll :: Pending = pin ! ( obj. write( & data) ) . poll ( cx) { }
601+
602+ cx. waker ( ) . wake_by_ref ( ) ;
603+ Poll :: < ( ) > :: Pending
604+ } else {
605+ guard. waker . register ( cx. waker ( ) ) ;
606+ Poll :: < ( ) > :: Pending
607+ }
602608 } else {
603- Poll :: Ready ( ( ) )
609+ cx. waker ( ) . wake_by_ref ( ) ;
610+ Poll :: < ( ) > :: Pending
604611 }
605612 } )
606613 . await ;
0 commit comments