@@ -7,7 +7,10 @@ use std::{
7
7
use tarantool:: fiber:: {
8
8
self , fiber_yield, is_cancelled, sleep, Cond , Fiber , FiberAttr
9
9
} ;
10
- use tarantool:: { space, transaction, error:: { Error , TransactionError } } ;
10
+ use tarantool:: hlua:: {
11
+ Lua ,
12
+ LuaFunction
13
+ } ;
11
14
12
15
pub fn test_fiber_new ( ) {
13
16
let mut fiber = Fiber :: new ( "test_fiber" , & mut |_| 0 ) ;
@@ -329,40 +332,43 @@ pub fn test_multiple_unit_deferred() {
329
332
assert_eq ! ( res, vec![ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ] ) ;
330
333
}
331
334
332
- pub fn immediate_yields ( ) {
333
- let mut space = space:: Space :: find ( "test_s1" ) . unwrap ( ) ;
334
- space. truncate ( ) . unwrap ( ) ;
335
-
336
- let mut fib = None ;
335
+ fn fiber_csw ( ) -> i32 {
336
+ static mut FLAG : bool = false ;
337
+ let mut lua: Lua = crate :: hlua:: global ( ) ;
338
+
339
+ if unsafe { !FLAG } {
340
+ lua. execute :: < ( ) > ( r#"
341
+ function fiber_csw()
342
+ local fiber = require('fiber')
343
+ return fiber.info()[fiber.id()].csw
344
+ end
345
+ "# ) . unwrap ( ) ;
346
+ unsafe { FLAG = true ; }
347
+ }
337
348
338
- let result = transaction:: start_transaction ( || -> Result < ( ) , Error > {
339
- space. insert ( & ( 1 , "test" . to_string ( ) ) ) ?;
340
- fib = Some ( fiber:: start ( || 69 ) ) ;
341
- Ok ( ( ) )
342
- } ) ;
349
+ return lua. get :: < LuaFunction < _ > , _ > ( "fiber_csw" ) . unwrap ( ) . call ( ) . unwrap ( ) ;
350
+ }
343
351
344
- assert ! ( matches!(
345
- result,
346
- Err ( Error :: Transaction ( TransactionError :: FailedToCommit ) ) ,
347
- ) ) ;
352
+ pub fn immediate_yields ( ) {
353
+ let mut upvalue = 0 ;
354
+ let csw1 = fiber_csw ( ) ;
355
+ fiber:: start ( || upvalue = 69 ) ;
356
+ let csw2 = fiber_csw ( ) ;
348
357
349
- assert_eq ! ( fib. map( |f| f. join( ) ) , Some ( 69 ) )
358
+ assert_eq ! ( upvalue, 69 ) ;
359
+ assert_eq ! ( csw2, csw1+1 ) ;
350
360
}
351
361
352
362
pub fn deferred_doesnt_yield ( ) {
353
- let mut space = space:: Space :: find ( "test_s1" ) . unwrap ( ) ;
354
- space. truncate ( ) . unwrap ( ) ;
355
-
356
- let mut fib = None ;
357
-
358
- let result = transaction:: start_transaction ( || -> Result < ( ) , Error > {
359
- space. insert ( & ( 1 , "test" . to_string ( ) ) ) ?;
360
- fib = Some ( fiber:: defer ( || 69 ) ) ;
361
- Ok ( ( ) )
362
- } ) ;
363
+ let mut upvalue = 0 ;
364
+ let csw1 = fiber_csw ( ) ;
365
+ fiber:: defer ( || upvalue = 96 ) ;
366
+ let csw2 = fiber_csw ( ) ;
363
367
364
- assert ! ( result. is_ok( ) ) ;
368
+ assert_eq ! ( upvalue, 0 ) ;
369
+ assert_eq ! ( csw2, csw1) ;
365
370
366
- assert ! ( matches!( fib. map( |f| f. join( ) ) , Some ( Ok ( 69 ) ) ) )
371
+ fiber:: sleep ( 0. ) ;
372
+ assert_eq ! ( upvalue, 96 ) ;
367
373
}
368
374
0 commit comments