@@ -438,4 +438,60 @@ mod tests {
438438 assert ! ( FiberStack :: new( usize :: MAX , true ) . is_err( ) ) ;
439439 assert ! ( FiberStack :: new( usize :: MAX , false ) . is_err( ) ) ;
440440 }
441+
442+ #[ test]
443+ fn cross_thread_fiber ( ) {
444+ let fiber = Fiber :: < ( ) , ( ) , ( ) > :: new ( fiber_stack ( 1024 * 1024 ) , move |_, s| {
445+ s. suspend ( ( ) ) ;
446+ } )
447+ . unwrap ( ) ;
448+ assert ! ( fiber. resume( ( ) ) . is_err( ) ) ;
449+ std:: thread:: spawn ( move || {
450+ assert ! ( fiber. resume( ( ) ) . is_ok( ) ) ;
451+ } )
452+ . join ( )
453+ . unwrap ( ) ;
454+ }
455+
456+ #[ test]
457+ fn what ( ) {
458+ let a = 3 ;
459+ let b = 3 ;
460+ let a = & a as * const _ as usize ;
461+ let b = & b as * const _ as usize ;
462+ eprintln ! ( ) ;
463+ eprintln ! ( "pacia1716({a:#x}, {b:#x}) = {:#x}" , pacia1716( a, b) ) ;
464+ std:: thread:: scope ( |s| {
465+ s. spawn ( move || {
466+ eprintln ! ( "pacia1716({a:#x}, {b:#x}) = {:#x}" , pacia1716( a, b) ) ;
467+ } ) ;
468+ } ) ;
469+ eprintln ! ( "pacib1716({a:#x}, {b:#x}) = {:#x}" , pacib1716( a, b) ) ;
470+ std:: thread:: scope ( |s| {
471+ s. spawn ( move || {
472+ eprintln ! ( "pacib1716({a:#x}, {b:#x}) = {:#x}" , pacib1716( a, b) ) ;
473+ } ) ;
474+ } ) ;
475+ }
476+
477+ fn pacia1716 ( mut r17 : usize , r16 : usize ) -> usize {
478+ unsafe {
479+ core:: arch:: asm!(
480+ "pacia1716\n " ,
481+ inout( "x17" ) r17,
482+ in( "x16" ) r16,
483+ ) ;
484+ r17
485+ }
486+ }
487+ fn pacib1716 ( mut r17 : usize , r16 : usize ) -> usize {
488+ unsafe {
489+ core:: arch:: asm!(
490+ "pacib1716\n " ,
491+ inout( "x17" ) r17,
492+ in( "x16" ) r16,
493+ ) ;
494+ r17
495+ }
496+ }
441497}
0 commit comments