From 813345234db22243fb878886b3c273aaeb85479e Mon Sep 17 00:00:00 2001 From: Cees-Jan Kiewiet Date: Sat, 26 Jan 2019 13:15:27 +0100 Subject: [PATCH 1/2] Race condition test --- tests/RaceConditionTest.php | 52 +++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 tests/RaceConditionTest.php diff --git a/tests/RaceConditionTest.php b/tests/RaceConditionTest.php new file mode 100644 index 0000000..68b8514 --- /dev/null +++ b/tests/RaceConditionTest.php @@ -0,0 +1,52 @@ +setExceptionHandler(function (Throwable $error): void { + echo (string)$error; + }); + $recoil->execute(function () use ($subject, &$output, $loop) { + $observableWhile = observableWhile($subject); + while ($i = (yield $observableWhile->get())) { + $i = $i(); + $output[] = $i; + } + }); + $loop->addTimer(0.5, function () use ($loop, $subject): void { + $loop->futureTick(function () use ($subject): void { + $subject->onNext(function () use ($subject) { + $subject->onNext(function () { + return 2; + }); + + return 1; + }); + }); + }); + $loop->addTimer(1, function () use ($subject): void { + $subject->onCompleted(); + }); + $loop->run(); + + self::assertSame([1,2], $output); + } +} From 10af1eb090b359d74367d9555320daa48a64fe5c Mon Sep 17 00:00:00 2001 From: Cees-Jan Kiewiet Date: Sat, 26 Jan 2019 13:28:13 +0100 Subject: [PATCH 2/2] Fix race condition --- src/ObservableWhile.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ObservableWhile.php b/src/ObservableWhile.php index 3eae3e3..633bdb7 100644 --- a/src/ObservableWhile.php +++ b/src/ObservableWhile.php @@ -31,8 +31,9 @@ public function __construct(ObservableInterface $observable) { $observable->subscribe(function ($item): void { if ($this->deferred instanceof Deferred) { - $this->deferred->resolve($item); + $deferred = $this->deferred; $this->deferred = null; + $deferred->resolve($item); return; }