@@ -464,7 +464,7 @@ function testNoMemoryLeak($type, $args)
464
464
465
465
function testExecutionOrderGuarantees ()
466
466
{
467
- $ this ->expectOutputString ("01 02 03 04 05 05 10 11 12 13 13 20 21 22 23 " );
467
+ $ this ->expectOutputString ("01 02 03 04 " . str_repeat ( " 05 " , 8 ). " 10 11 12 " . str_repeat ( " 13 " , 4 ). " 20 21 22 23 24 25 30 31 " );
468
468
$ this ->start (function (Driver $ loop ) use (&$ ticks ) {
469
469
$ f = function () use ($ loop ) {
470
470
$ args = func_get_args ();
@@ -476,31 +476,20 @@ function testExecutionOrderGuarantees()
476
476
echo array_shift ($ args ) . array_shift ($ args ), " " ;
477
477
};
478
478
};
479
- $ dep = function ($ i , $ fn ) use ($ loop , &$ max , &$ cur ) {
480
- $ max || $ max = new \SplObjectStorage ;
481
- $ cur || $ cur = new \SplObjectStorage ;
482
- $ max [$ fn ] = max (isset ($ max [$ fn ]) ? $ max [$ fn ] : 0 , $ i );
483
- $ cur [$ fn ] = 0 ;
484
- return function ($ watcherId ) use ($ loop , $ i , $ fn , &$ max , &$ cur ) {
485
- $ this ->assertSame ($ i , $ cur [$ fn ]);
486
- if ($ cur [$ fn ] == $ max [$ fn ]) {
487
- $ fn ($ watcherId );
488
- } else {
489
- $ loop ->cancel ($ watcherId );
490
- }
491
- $ cur [$ fn ] = $ cur [$ fn ] + 1 ;
492
- };
493
- };
494
479
495
- $ loop ->onWritable (STDIN , $ dep ( 0 , $ writ = $ f (0 , 5 ) ));
496
- $ writ1 = $ loop ->onWritable (STDIN , $ dep ( 1 , $ writ ));
497
- $ writ2 = $ loop ->onWritable (STDIN , $ dep ( 3 , $ writ ));
480
+ $ loop ->onWritable (STDIN , $ f (0 , 5 ));
481
+ $ writ1 = $ loop ->onWritable (STDIN , $ f ( 0 , 5 ));
482
+ $ writ2 = $ loop ->onWritable (STDIN , $ f ( 0 , 5 ));
498
483
499
- $ loop ->delay ($ msDelay = 0 , $ dep ( 0 , $ del = $ f (0 , 5 ) ));
500
- $ del1 = $ loop ->delay ($ msDelay = 0 , $ dep ( 1 , $ del ));
501
- $ del2 = $ loop ->delay ($ msDelay = 0 , $ dep ( 3 , $ del ));
484
+ $ loop ->delay ($ msDelay = 0 , $ f (0 , 5 ));
485
+ $ del1 = $ loop ->delay ($ msDelay = 0 , $ f ( 0 , 5 ));
486
+ $ del2 = $ loop ->delay ($ msDelay = 0 , $ f ( 0 , 5 ));
502
487
$ del3 = $ loop ->delay ($ msDelay = 0 , $ f ());
503
- $ del4 = $ loop ->delay ($ msDelay = 0 , $ dep (1 , $ defdel = $ f (1 , 3 )));
488
+ $ del4 = $ loop ->delay ($ msDelay = 0 , $ f (1 , 3 ));
489
+ $ del5 = $ loop ->delay ($ msDelay = 0 , $ f (2 , 0 ));
490
+ $ loop ->defer (function () use ($ loop , $ del5 ) {
491
+ $ loop ->disable ($ del5 );
492
+ });
504
493
$ loop ->cancel ($ del3 );
505
494
$ loop ->disable ($ del1 );
506
495
$ loop ->disable ($ del2 );
@@ -510,29 +499,31 @@ function testExecutionOrderGuarantees()
510
499
$ loop ->disable ($ writ1 );
511
500
$ loop ->disable ($ writ2 );
512
501
$ loop ->enable ($ writ1 );
513
- $ writ4 = $ loop ->onWritable (STDIN , $ dep ( 1 , $ defwrit = $ f (1 , 3 ) ));
514
- $ loop ->onWritable (STDIN , $ dep ( 2 , $ writ ));
502
+ $ writ4 = $ loop ->onWritable (STDIN , $ f (1 , 3 ));
503
+ $ loop ->onWritable (STDIN , $ f ( 0 , 5 ));
515
504
$ loop ->enable ($ writ2 );
516
505
$ loop ->disable ($ writ4 );
517
- $ loop ->defer (function () use ($ loop , $ writ4 , $ dep , $ defwrit ) {
518
- $ loop ->onWritable (STDIN , $ dep (0 , $ defwrit ));
506
+ $ loop ->defer (function () use ($ loop , $ writ4 , $ f ) {
519
507
$ loop ->enable ($ writ4 );
508
+ $ loop ->onWritable (STDIN , $ f (1 , 3 ));
520
509
});
521
510
522
511
$ loop ->enable ($ del1 );
523
- $ loop ->delay ($ msDelay = 0 , $ dep ( 2 , $ del ));
512
+ $ loop ->delay ($ msDelay = 0 , $ f ( 0 , 5 ));
524
513
$ loop ->enable ($ del2 );
525
514
$ loop ->disable ($ del4 );
526
- $ loop ->defer (function () use ($ loop , $ del4 , $ dep , $ defdel ) {
527
- $ loop ->onWritable (STDIN , $ dep (0 , $ defdel ));
515
+ $ loop ->defer (function () use ($ loop , $ del4 , $ f ) {
528
516
$ loop ->enable ($ del4 );
517
+ $ loop ->onWritable (STDIN , $ f (1 , 3 ));
529
518
});
530
519
531
- $ loop ->delay ($ msDelay = 5 , $ f (2 , 0 ));
532
- $ loop ->repeat ($ msDelay = 5 , $ f (2 , 1 ));
533
- $ rep1 = $ loop ->repeat ($ msDelay = 5 , $ f (2 , 3 ));
520
+ $ loop ->delay ($ msDelay = 15 , $ f (3 , 1 ));
521
+ $ loop ->delay ($ msDelay = 6 , $ f (2 , 5 ));
522
+ $ loop ->delay ($ msDelay = 5 , $ f (2 , 1 ));
523
+ $ loop ->repeat ($ msDelay = 5 , $ f (2 , 2 ));
524
+ $ rep1 = $ loop ->repeat ($ msDelay = 5 , $ f (2 , 4 ));
534
525
$ loop ->disable ($ rep1 );
535
- $ loop ->delay ($ msDelay = 5 , $ f (2 , 2 ));
526
+ $ loop ->delay ($ msDelay = 5 , $ f (2 , 3 ));
536
527
$ loop ->enable ($ rep1 );
537
528
538
529
$ loop ->defer ($ f (0 , 1 ));
@@ -543,12 +534,21 @@ function testExecutionOrderGuarantees()
543
534
$ loop ->disable ($ def1 );
544
535
$ loop ->cancel ($ def3 );
545
536
$ loop ->enable ($ def1 );
546
- $ loop ->defer (function () use ($ loop , $ def2 , $ del4 , $ f ) {
537
+ $ loop ->defer (function () use ($ loop , $ def2 , $ del4 , $ del5 , $ f ) {
547
538
$ tick = $ f (0 , 4 );
548
539
$ tick ("invalid " );
549
540
$ loop ->defer ($ f (1 , 0 ));
550
541
$ loop ->enable ($ def2 );
551
542
$ loop ->defer ($ f (1 , 2 ));
543
+ $ loop ->defer (function () use ($ loop , $ del5 , $ f ) {
544
+ $ loop ->enable ($ del5 );
545
+ $ loop ->defer (function () use ($ loop , $ f ) {
546
+ usleep (7000 ); // to have $msDelay == 5 and $msDelay == 6 run at the same tick (but not $msDelay == 15)
547
+ $ loop ->defer (function () use ($ loop , $ f ) {
548
+ $ loop ->defer ($ f (3 , 0 ));
549
+ });
550
+ });
551
+ });
552
552
});
553
553
$ loop ->disable ($ def2 );
554
554
});
@@ -920,16 +920,61 @@ function testInitiallyDisabledOnSignalWatcher()
920
920
921
921
$ this ->expectOutputString ("caught SIGUSR1 " );
922
922
$ this ->start (function (Driver $ loop ) {
923
- $ sigWatcherId = $ loop ->onSignal (SIGUSR1 , function () use ($ loop ) {
923
+ $ stop = $ loop ->delay ($ msDelay = 10 , function () use ($ loop ) {
924
+ echo "ERROR: manual stop " ;
925
+ $ loop ->stop ();
926
+ });
927
+ $ watcherId = $ loop ->onSignal (SIGUSR1 , function ($ watcherId ) use ($ loop , $ stop ) {
924
928
echo "caught SIGUSR1 " ;
929
+ $ loop ->disable ($ stop );
930
+ $ loop ->disable ($ watcherId );
931
+ });
932
+ $ loop ->disable ($ watcherId );
933
+
934
+ $ loop ->delay ($ msDelay = 1 , function () use ($ loop , $ watcherId ) {
935
+ $ loop ->enable ($ watcherId );
936
+ $ loop ->delay ($ msDelay = 1 , function () {
937
+ \posix_kill (\getmypid (), \SIGUSR1 );
938
+ });
939
+ });
940
+ });
941
+ }
942
+
943
+ /** @depends testSignalCapability */
944
+ function testNestedLoopSignalDispatch ()
945
+ {
946
+ if (!\extension_loaded ("posix " )) {
947
+ $ this ->markTestSkipped ("ext/posix required to test signal handlers " );
948
+ }
949
+
950
+ $ this ->expectOutputString ("inner SIGUSR1 \nouter SIGUSR1 \n" );
951
+ $ this ->start (function (Driver $ loop ) {
952
+ $ loop ->delay ($ msDelay = 30 , function () use ($ loop ) {
953
+ $ loop ->stop ();
954
+ });
955
+ $ loop ->onSignal (SIGUSR1 , function () use ($ loop ) {
956
+ echo "outer SIGUSR1 \n" ;
925
957
$ loop ->stop ();
926
- }, $ options = [ " enable " => false ] );
958
+ });
927
959
928
- $ loop ->delay ($ msDelay = 10 , function () use ($ loop , $ sigWatcherId ) {
929
- $ loop ->enable ($ sigWatcherId );
930
- $ loop ->delay ($ msDelay = 10 , function () use ($ sigWatcherId ) {
960
+ $ loop ->delay ($ msDelay = 1 , function () {
961
+ $ loop = $ this ->getFactory ()->create ();
962
+ $ stop = $ loop ->delay ($ msDelay = 10 , function () use ($ loop ) {
963
+ echo "ERROR: manual stop " ;
964
+ $ loop ->stop ();
965
+ });
966
+ $ loop ->onSignal (SIGUSR1 , function ($ watcherId ) use ($ loop , $ stop ) {
967
+ echo "inner SIGUSR1 \n" ;
968
+ $ loop ->cancel ($ stop );
969
+ $ loop ->cancel ($ watcherId );
970
+ });
971
+ $ loop ->delay ($ msDelay = 1 , function () {
931
972
\posix_kill (\getmypid (), \SIGUSR1 );
932
973
});
974
+ $ loop ->run ();
975
+ });
976
+ $ loop ->delay ($ msDelay = 20 , function () {
977
+ \posix_kill (\getmypid (), \SIGUSR1 );
933
978
});
934
979
});
935
980
}
0 commit comments