summaryrefslogtreecommitdiff
path: root/server/vendor/guzzlehttp/promises/src/EachPromise.php
diff options
context:
space:
mode:
authorEoleDev <root@serverpc.home>2016-03-09 16:03:46 +0100
committerEoleDev <root@serverpc.home>2016-03-09 16:03:46 +0100
commit03ef74d0cfe675a6e18a91f039182ca1b248d8f5 (patch)
treeb1668c59fdbf9cb0b0a3da52bfc79e393a953573 /server/vendor/guzzlehttp/promises/src/EachPromise.php
parent1d3ed3af6d57316640c143002ddf80d61e6c098a (diff)
MAJ Librarys
Diffstat (limited to 'server/vendor/guzzlehttp/promises/src/EachPromise.php')
-rw-r--r--server/vendor/guzzlehttp/promises/src/EachPromise.php20
1 files changed, 18 insertions, 2 deletions
diff --git a/server/vendor/guzzlehttp/promises/src/EachPromise.php b/server/vendor/guzzlehttp/promises/src/EachPromise.php
index 5918429..0344686 100644
--- a/server/vendor/guzzlehttp/promises/src/EachPromise.php
+++ b/server/vendor/guzzlehttp/promises/src/EachPromise.php
@@ -24,6 +24,9 @@ class EachPromise implements PromisorInterface
/** @var Promise */
private $aggregate;
+ /** @var bool */
+ private $mutex;
+
/**
* Configuration hash can include the following key value pairs:
*
@@ -81,6 +84,7 @@ class EachPromise implements PromisorInterface
private function createPromise()
{
+ $this->mutex = false;
$this->aggregate = new Promise(function () {
reset($this->pending);
if (empty($this->pending) && !$this->iterable->valid()) {
@@ -169,11 +173,21 @@ class EachPromise implements PromisorInterface
private function advanceIterator()
{
+ // Place a lock on the iterator so that we ensure to not recurse,
+ // preventing fatal generator errors.
+ if ($this->mutex) {
+ return false;
+ }
+
+ $this->mutex = true;
+
try {
$this->iterable->next();
+ $this->mutex = false;
return true;
} catch (\Exception $e) {
$this->aggregate->reject($e);
+ $this->mutex = false;
return false;
}
}
@@ -186,9 +200,11 @@ class EachPromise implements PromisorInterface
}
unset($this->pending[$idx]);
- $this->advanceIterator();
- if (!$this->checkIfFinished()) {
+ // Only refill pending promises if we are not locked, preventing the
+ // EachPromise to recursively invoke the provided iterator, which
+ // cause a fatal error: "Cannot resume an already running generator"
+ if ($this->advanceIterator() && !$this->checkIfFinished()) {
// Add more pending promises if possible.
$this->refillPending();
}