@@ -2,7 +2,6 @@ use crate::Timer;
22use crate :: { bindings:: wasi:: io:: poll:: Pollable , poll_tasks:: PollTasks } ;
33use crate :: { io:: timer:: TIMERS , poll_tasks:: EventWithWaker } ;
44use dashmap:: DashMap ;
5- use futures:: pin_mut;
65use lazy_static:: lazy_static;
76use std:: {
87 future:: Future ,
@@ -13,9 +12,10 @@ use std::{
1312 } ,
1413 task:: { Context , Wake , Waker } ,
1514} ;
15+ use uuid:: Uuid ;
1616lazy_static ! {
1717 /// The global reactor for this runtime
18- pub static ref REACTOR : Mutex < Reactor <' static >> = Mutex :: new ( Reactor :: default ( ) ) ;
18+ pub static ref REACTOR : Reactor <' static > = Reactor :: default ( ) ;
1919
2020}
2121/// The async engine instance
@@ -35,19 +35,19 @@ impl<'a> Task<'a> {
3535}
3636#[ derive( Default ) ]
3737pub struct Reactor < ' a > {
38- events : PollTasks ,
39- future_tasks : Vec < Task < ' a > > , //right now the engine holds the tasks but depending
38+ events : Mutex < PollTasks > ,
39+ future_tasks : DashMap < Uuid , Mutex < Task < ' a > > > , //right now the engine holds the tasks but depending
4040 timers : DashMap < String , EventWithWaker < Timer > > ,
4141}
4242
4343impl < ' a > Reactor < ' a > {
4444 //adds event to the queue
45- pub fn register ( & mut self , event_name : String , pollable : EventWithWaker < Arc < Pollable > > ) {
46- self . events . push ( event_name, pollable) ;
45+ pub fn register ( & self , event_name : String , pollable : EventWithWaker < Arc < Pollable > > ) {
46+ self . events . lock ( ) . unwrap ( ) . push ( event_name, pollable) ;
4747 }
4848 //checks if descriptor has been added to the polling queue
4949 pub fn is_pollable ( & self , key : & str ) -> bool {
50- self . events . contains ( key)
50+ self . events . lock ( ) . unwrap ( ) . contains ( key)
5151 }
5252
5353 //checks if timer is pollable
@@ -56,17 +56,17 @@ impl<'a> Reactor<'a> {
5656 }
5757
5858 //polls event queue to see if any of the events are readycar
59- pub fn wait_for_io ( & mut self ) {
60- self . events . wait_for_pollables ( ) ;
59+ pub fn wait_for_io ( & self ) {
60+ self . events . lock ( ) . unwrap ( ) . wait_for_pollables ( ) ;
6161 }
6262
6363 //checks if event is ready
64- pub fn check_ready ( & mut self , event_name : & str ) -> bool {
65- self . events . check_if_ready ( event_name)
64+ pub fn check_ready ( & self , event_name : & str ) -> bool {
65+ self . events . lock ( ) . unwrap ( ) . check_if_ready ( event_name)
6666 }
6767
6868 pub fn is_empty ( & self ) -> bool {
69- self . events . is_empty ( ) && self . future_tasks . is_empty ( )
69+ self . events . lock ( ) . unwrap ( ) . is_empty ( ) && self . future_tasks . is_empty ( )
7070 }
7171
7272 pub ( crate ) fn update_timers ( & self ) {
@@ -85,47 +85,58 @@ impl<'a> Reactor<'a> {
8585 . unwrap_or_default ( )
8686 }
8787
88- pub ( crate ) fn register_timer ( & mut self , timer_name : String , event : EventWithWaker < Timer > ) {
88+ pub ( crate ) fn register_timer ( & self , timer_name : String , event : EventWithWaker < Timer > ) {
8989 self . timers . insert ( timer_name, event) ;
9090 }
91- }
9291
93- impl WasmRuntimeAsyncEngine {
94- /// function to execute futures
95- pub fn block_on < K , F : Future < Output = K > + Send , Fun : FnOnce ( ) -> F > ( async_closure : Fun ) {
96- let future = async_closure ( ) ;
97- pin_mut ! ( future) ;
92+ pub ( crate ) fn push_task < K , F : Future < Output = K > + Send + ' static > ( & self , future : F ) -> Uuid {
9893 let task = Task :: new ( Box :: pin ( async move {
9994 let _result = future. await ;
10095 } ) ) ;
101- let mut future_tasks = Vec :: new ( ) ;
102- future_tasks. push ( task) ;
96+ let id = Uuid :: new_v4 ( ) ;
97+ self . future_tasks . insert ( id, Mutex :: new ( task) ) ;
98+ id
99+ }
100+ }
101+
102+ impl WasmRuntimeAsyncEngine {
103+ /// function to execute futures
104+ pub fn block_on < K , F : Future < Output = K > + Send + ' static > ( future : F ) {
105+ let reactor = & REACTOR ;
106+ reactor. push_task ( future) ;
103107 loop {
104- let mut reactor = REACTOR . lock ( ) . unwrap ( ) ;
105108 reactor. update_timers ( ) ;
106109 reactor. wait_for_io ( ) ;
107- reactor. future_tasks . retain_mut ( |task_info| {
108- if task_info. waker . should_wake ( ) {
109- task_info. waker . reset ( ) ;
110- let waker: Waker = task_info. waker . clone ( ) . into ( ) ;
110+
111+ reactor. future_tasks . retain ( |_, task_info| {
112+ let waker = task_info. get_mut ( ) . unwrap ( ) . waker . clone ( ) ;
113+ if waker. should_wake ( ) {
114+ waker. reset ( ) ;
115+ let waker: Waker = waker. into ( ) ;
111116 let mut context = Context :: from_waker ( & waker) ;
112- if task_info. task . as_mut ( ) . poll ( & mut context) . is_ready ( ) {
117+
118+ if task_info
119+ . get_mut ( )
120+ . unwrap ( )
121+ . task
122+ . as_mut ( )
123+ . poll ( & mut context)
124+ . is_ready ( )
125+ {
113126 return false ;
114127 }
115128 }
116129 true
117130 } ) ;
131+
118132 if TIMERS . is_empty ( ) && reactor. is_empty ( ) {
119133 break ;
120134 }
121135 }
122136 }
123137
124138 pub fn spawn < K , F : Future < Output = ( ) > + Send + ' static > ( future : F ) {
125- let task = Task :: new ( Box :: pin ( async move {
126- let _result = future. await ;
127- } ) ) ;
128- REACTOR . lock ( ) . unwrap ( ) . future_tasks . push ( task) ;
139+ REACTOR . push_task ( future) ;
129140 }
130141}
131142
@@ -188,14 +199,15 @@ mod test {
188199 #[ test]
189200 fn test_enqueue ( ) {
190201 let count_future = CountFuture { max : 3 , min : 0 } ;
191- let mut reactor = Reactor :: default ( ) ;
192- reactor. future_tasks . push ( Task :: new ( Box :: pin ( async move {
202+ let reactor = Reactor :: default ( ) ;
203+ let id = reactor. push_task ( async move {
193204 count_future. await ;
194- } ) ) ) ;
195- let task = reactor. future_tasks . first_mut ( ) . unwrap ( ) ;
196- let fut_waker = task. waker . clone ( ) ;
205+ } ) ;
206+ let mut future_task = reactor. future_tasks . get_mut ( & id) . unwrap ( ) ;
207+ let task = future_task. value_mut ( ) ;
208+ let fut_waker = task. lock ( ) . unwrap ( ) . waker . clone ( ) ;
197209 let waker: Waker = fut_waker. into ( ) ;
198- let count_future = & mut task. task ;
210+ let count_future = & mut task. lock ( ) . unwrap ( ) . task ;
199211 let mut context = Context :: from_waker ( & waker) ;
200212 futures:: pin_mut!( count_future) ;
201213 let _ = count_future. as_mut ( ) . poll ( & mut context) ;
@@ -205,6 +217,6 @@ mod test {
205217 fn test_block_on ( ) {
206218 let count_future = CountFuture { max : 3 , min : 0 } ;
207219
208- WasmRuntimeAsyncEngine :: block_on ( || async move { assert_eq ! ( count_future. await , 3 ) } ) ;
220+ WasmRuntimeAsyncEngine :: block_on ( async move { assert_eq ! ( count_future. await , 3 ) } ) ;
209221 }
210222}
0 commit comments