From 0ea6f60ac86e3417c3c4b9b4cef9dd4b4f0f79f9 Mon Sep 17 00:00:00 2001 From: Aaron Piotrowski Date: Fri, 4 Mar 2022 14:43:03 -0600 Subject: [PATCH] Fix suspended fiber reference being null during destruction --- src/EventLoop/Internal/DriverSuspension.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/EventLoop/Internal/DriverSuspension.php b/src/EventLoop/Internal/DriverSuspension.php index b8d74ce..a004f59 100644 --- a/src/EventLoop/Internal/DriverSuspension.php +++ b/src/EventLoop/Internal/DriverSuspension.php @@ -55,8 +55,11 @@ public function resume(mixed $value = null): void $this->pending = false; - if ($this->suspendedFiber) { - ($this->queue)(\Closure::fromCallable([$this->suspendedFiber, 'resume']), $value); + /** @var \Fiber|null $fiber */ + $fiber = $this->fiberRef?->get(); + + if ($fiber) { + ($this->queue)(\Closure::fromCallable([$fiber, 'resume']), $value); } else { // Suspend event loop fiber to {main}. ($this->interrupt)(static fn () => $value); @@ -132,8 +135,11 @@ public function throw(\Throwable $throwable): void $this->pending = false; - if ($this->suspendedFiber) { - ($this->queue)(\Closure::fromCallable([$this->suspendedFiber, 'throw']), $throwable); + /** @var \Fiber|null $fiber */ + $fiber = $this->fiberRef?->get(); + + if ($fiber) { + ($this->queue)(\Closure::fromCallable([$fiber, 'throw']), $throwable); } else { // Suspend event loop fiber to {main}. ($this->interrupt)(static fn () => throw $throwable);