22Fiber operations on a bound fiber: direct inside the scheduler, routed outside
33--FILE--
44<?php
5- $ queue = new SplQueue ();
6- $ log = [] ;
7-
8- Async \SchedulerHook:: register ( ' test ' , [
9- Async \SchedulerHook:: INTERCEPT_FIBER => fn (Fiber $ fiber ): object
10- => new class ($ fiber ) {
5+ $ scheduler = new class extends Async \AbstractScheduler {
6+ public SplQueue $ queue ;
7+ public array $ log = [];
8+ public function __construct () { $ this -> queue = new SplQueue (); }
9+ public function interceptFiber (Fiber $ fiber ): ? object {
10+ return new class ($ fiber ) {
1111 public function __construct (public readonly Fiber $ fiber ) {}
12- },
13- Async \SchedulerHook::ENQUEUE => function (object $ coroutine ) use ($ queue , &$ log ): bool {
14- $ log [] = 'enqueue ' ;
15- $ queue ->enqueue ($ coroutine );
12+ };
13+ }
14+ public function enqueue (object $ coroutine ): bool {
15+ $ this ->log [] = 'enqueue ' ;
16+ $ this ->queue ->enqueue ($ coroutine );
1617 return true ;
17- },
18- Async \SchedulerHook:: RESUME => function (object $ coroutine , ?Throwable $ error) use ( $ queue , & $ log ): bool {
19- $ log [] = 'resume-hook ' ;
20- $ queue ->enqueue ($ coroutine );
18+ }
19+ public function resume (object $ coroutine , ?Throwable $ error = null ): bool {
20+ $ this -> log [] = 'resume-hook ' ;
21+ $ this -> queue ->enqueue ($ coroutine );
2122 return true ;
22- },
23- Async \SchedulerHook:: SUSPEND => function (bool $ fromMain , bool $ isBailout) use ( $ queue , & $ log ): bool {
24- while (!$ queue ->isEmpty ()) {
25- $ fiber = $ queue ->dequeue ()->fiber ;
23+ }
24+ public function suspend (bool $ fromMain , bool $ isBailout ): bool {
25+ while (!$ this -> queue ->isEmpty ()) {
26+ $ fiber = $ this -> queue ->dequeue ()->fiber ;
2627
2728 // Inside a hook this is a DIRECT switch: no hooks re-enter.
2829 $ fiber ->isStarted () ? $ fiber ->resume () : $ fiber ->start ();
@@ -31,10 +32,11 @@ Async\SchedulerHook::register('test', [
3132 return true ;
3233 }
3334 }
34-
3535 return true ;
36- },
37- ]);
36+ }
37+ };
38+
39+ Async \SchedulerHook::register ('test ' , $ scheduler );
3840
3941$ fiber = new Fiber (function (): string {
4042 Fiber::suspend ('first ' );
@@ -47,7 +49,7 @@ var_dump($fiber->resume());
4749var_dump ($ fiber ->getReturn ());
4850
4951// The scheduler's direct switches fired no extra hook calls:
50- echo implode (', ' , $ log ), "\n" ;
52+ echo implode (', ' , $ scheduler -> log ), "\n" ;
5153
5254// A finished bound fiber cannot be resumed, same rule as classic fibers.
5355try {
0 commit comments