3939 Func : Send + FnOnce ( Dispatcher < T > ) -> Fut ,
4040 Fut : Future ,
4141 Fut :: Output : Send ,
42- CreateFiber : Fn ( Executor < T > ) -> tarantool:: fiber:: JoinHandle < ' a , Result < i32 , mlua :: Error > > ,
42+ CreateFiber : Fn ( Executor < T > ) -> tarantool:: fiber:: JoinHandle < ' a , ( ) > ,
4343{
4444 let ( dispatcher, executor) = channel ( config. buffer ) ?;
4545
@@ -61,37 +61,40 @@ where
6161 Ok ( rt. block_on ( module_main ( dispatcher) ) )
6262 } ,
6363 ) ?;
64+ // yield to start fibers
6465 tarantool:: fiber:: sleep ( std:: time:: Duration :: ZERO ) ;
6566
6667 for fiber in fibers {
67- let _result = fiber. join ( ) . unwrap ( ) ;
68+ fiber. join ( ) ;
6869 }
6970 module_thread. join ( ) . unwrap ( )
7071 } )
7172 . unwrap ( )
7273}
7374
75+ unsafe extern "C" {
76+ unsafe fn luaT_state ( ) -> * mut mlua:: lua_State ;
77+ }
78+
79+ unsafe fn mlua_state < ' a > ( ) -> & ' a mlua:: Lua {
80+ unsafe { mlua:: Lua :: get_or_init_from_ptr ( luaT_state ( ) . cast ( ) ) }
81+ }
82+
7483fn create_fiber (
75- lua : & Lua ,
84+ _lua : & Lua ,
7685 max_recv_retries : usize ,
7786 coio_timeout : f64 ,
7887 executor : Executor < Lua > ,
79- ) -> tarantool:: fiber:: JoinHandle < ' _ , Result < i32 , mlua:: Error > > {
80- let thread_func = move |lua, ( ) | loop {
81- match executor. exec ( lua, max_recv_retries, coio_timeout) {
82- Ok ( ( ) ) | Err ( ExecError :: ResultChannelSendError ) => continue ,
83- Err ( ExecError :: TaskChannelRecvError ) => break Ok ( 0 ) ,
88+ ) -> tarantool:: fiber:: JoinHandle < ' static , ( ) > {
89+ let func = move || {
90+ let lua = unsafe { mlua_state ( ) } ;
91+ loop {
92+ match executor. exec ( lua, max_recv_retries, coio_timeout) {
93+ Ok ( ( ) ) | Err ( ExecError :: ResultChannelSendError ) => continue ,
94+ Err ( ExecError :: TaskChannelRecvError ) => break ,
95+ }
8496 }
8597 } ;
86- let thread_func = lua. create_function ( thread_func) . unwrap ( ) ;
87- let thread = lua. create_thread ( thread_func) . unwrap ( ) ;
8898
89- Fyber :: spawn_deferred (
90- "xtm" . to_owned ( ) ,
91- move || -> std:: result:: Result < i32 , mlua:: Error > { thread. resume ( ( ) ) } ,
92- true ,
93- None ,
94- )
95- . unwrap ( )
96- . unwrap ( )
99+ Fyber :: spawn_lua ( "xtm" . to_owned ( ) , func, None ) . unwrap ( )
97100}
0 commit comments