@@ -23,25 +23,15 @@ final class DriverSuspension implements Suspension
2323
2424 private bool $ pending = false ;
2525
26- private readonly \WeakReference $ suspensions ;
27-
28- /**
29- * @param \Closure $run
30- * @param \Closure $queue
31- * @param \Closure $interrupt
32- *
33- * @internal
34- */
3526 public function __construct (
3627 private readonly \Closure $ run ,
3728 private readonly \Closure $ queue ,
3829 private readonly \Closure $ interrupt ,
39- \WeakMap $ suspensions
30+ private readonly \WeakMap $ suspensions,
4031 ) {
4132 $ fiber = \Fiber::getCurrent ();
4233
4334 $ this ->fiberRef = $ fiber ? \WeakReference::create ($ fiber ) : null ;
44- $ this ->suspensions = \WeakReference::create ($ suspensions );
4535 }
4636
4737 public function resume (mixed $ value = null ): void
@@ -101,13 +91,12 @@ public function suspend(): mixed
10191 $ this ->pending = false ;
10292 $ result && $ result (); // Unwrap any uncaught exceptions from the event loop
10393
104- $ info = '' ;
105- $ suspensions = $ this ->suspensions ->get ();
106- if ($ suspensions ) {
107- \gc_collect_cycles ();
94+ \gc_collect_cycles (); // Collect any circular references before dumping pending suspensions.
10895
109- /** @var self $suspension */
110- foreach ($ suspensions as $ suspension ) {
96+ $ info = '' ;
97+ foreach ($ this ->suspensions as $ suspensionRef ) {
98+ if ($ suspension = $ suspensionRef ->get ()) {
99+ \assert ($ suspension instanceof self);
111100 $ fiber = $ suspension ->fiberRef ?->get();
112101 if ($ fiber === null ) {
113102 continue ;
0 commit comments