1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2025-02-16 16:58:38 +01:00

Make "exception" on Future a private property

Summary: Depends on D21034. Ref T11968. Continue modernizing Future.

Test Plan: Ran tests, created a revision.

Maniphest Tasks: T11968

Differential Revision: https://secure.phabricator.com/D21035
This commit is contained in:
epriestley 2020-02-26 14:11:02 -08:00
parent 4d55067fd8
commit 6b75562c3e
3 changed files with 90 additions and 58 deletions

View file

@ -9,8 +9,7 @@ abstract class Future extends Phobject {
private $hasResult = false; private $hasResult = false;
private $result; private $result;
private $exception;
protected $exception;
/** /**
* Is this future's process complete? Specifically, can this future be * Is this future's process complete? Specifically, can this future be
@ -37,23 +36,34 @@ abstract class Future extends Phobject {
'timeout.')); 'timeout.'));
} }
$graph = new FutureIterator(array($this)); if (!$this->hasResult()) {
$graph->resolveAll(); $graph = new FutureIterator(array($this));
$graph->resolveAll();
}
if ($this->exception) { if ($this->hasException()) {
throw $this->exception; throw $this->getException();
} }
return $this->getResult(); return $this->getResult();
} }
public function setException(Exception $ex) { final public function updateFuture() {
$this->exception = $ex; if ($this->hasException()) {
return $this; return;
} }
public function getException() { if ($this->hasResult()) {
return $this->exception; return;
}
try {
$this->isReady();
} catch (Exception $ex) {
$this->setException($ex);
} catch (Throwable $ex) {
$this->setException($ex);
}
} }
/** /**
@ -125,8 +135,23 @@ abstract class Future extends Phobject {
return $this; return $this;
} }
final protected function hasResult() { final public function hasResult() {
return $this->hasResult; return $this->hasResult;
} }
final private function setException($exception) {
// NOTE: The parameter may be an Exception or a Throwable.
$this->exception = $exception;
return $this;
}
final private function getException() {
return $this->exception;
}
final public function hasException() {
return ($this->exception !== null);
}
} }

View file

@ -180,6 +180,7 @@ final class FutureIterator extends Phobject implements Iterator {
$this->isTimeout = false; $this->isTimeout = false;
$check = $this->getWorkingSet(); $check = $this->getWorkingSet();
$resolve = null; $resolve = null;
do { do {
$read_sockets = array(); $read_sockets = array();
@ -188,48 +189,49 @@ final class FutureIterator extends Phobject implements Iterator {
$wait_time = 1; $wait_time = 1;
foreach ($check as $wait => $key) { foreach ($check as $wait => $key) {
$future = $this->futures[$key]; $future = $this->futures[$key];
try {
if ($future->getException()) { $future->updateFuture();
if ($future->hasException()) {
if ($resolve === null) {
$resolve = $wait; $resolve = $wait;
continue;
}
if ($future->isReady()) {
if ($resolve === null) {
$resolve = $wait;
}
continue;
} }
continue;
}
$got_sockets = false; if ($future->hasResult()) {
$socks = $future->getReadSockets(); if ($resolve === null) {
if ($socks) { $resolve = $wait;
$got_sockets = true;
foreach ($socks as $socket) {
$read_sockets[] = $socket;
}
} }
continue;
}
$socks = $future->getWriteSockets(); $got_sockets = false;
if ($socks) { $socks = $future->getReadSockets();
$got_sockets = true; if ($socks) {
foreach ($socks as $socket) { $got_sockets = true;
$write_sockets[] = $socket; foreach ($socks as $socket) {
} $read_sockets[] = $socket;
} }
}
// If any currently active future had neither read nor write sockets, $socks = $future->getWriteSockets();
// we can't wait for the current batch of items using sockets. if ($socks) {
if (!$got_sockets) { $got_sockets = true;
$can_use_sockets = false; foreach ($socks as $socket) {
} else { $write_sockets[] = $socket;
$wait_time = min($wait_time, $future->getDefaultWait());
} }
} catch (Exception $ex) { }
$this->futures[$key]->setException($ex);
$resolve = $wait; // If any currently active future had neither read nor write sockets,
break; // we can't wait for the current batch of items using sockets.
if (!$got_sockets) {
$can_use_sockets = false;
} else {
$wait_time = min($wait_time, $future->getDefaultWait());
} }
} }
if ($resolve === null) { if ($resolve === null) {
// Check for a setUpdateInterval() timeout. // Check for a setUpdateInterval() timeout.
@ -253,6 +255,7 @@ final class FutureIterator extends Phobject implements Iterator {
$this->key = $this->wait[$resolve]; $this->key = $this->wait[$resolve];
unset($this->wait[$resolve]); unset($this->wait[$resolve]);
$this->updateWorkingSet(); $this->updateWorkingSet();
} }

View file

@ -27,25 +27,29 @@ abstract class FutureProxy extends Future {
} }
public function isReady() { public function isReady() {
return $this->getProxiedFuture()->isReady(); if ($this->hasResult()) {
return true;
}
$proxied = $this->getProxiedFuture();
$is_ready = $proxied->isReady();
if ($proxied->hasResult()) {
$result = $proxied->getResult();
$result = $this->didReceiveResult($result);
$this->setResult($result);
}
return $is_ready;
} }
public function resolve() { public function resolve() {
$result = $this->getProxiedFuture()->resolve(); $this->getProxiedFuture()->resolve();
$result = $this->didReceiveResult($result); $this->isReady();
$this->setResult($result);
return $this->getResult(); return $this->getResult();
} }
public function setException(Exception $ex) {
$this->getProxiedFuture()->setException($ex);
return $this;
}
public function getException() {
return $this->getProxiedFuture()->getException();
}
public function getReadSockets() { public function getReadSockets() {
return $this->getProxiedFuture()->getReadSockets(); return $this->getProxiedFuture()->getReadSockets();
} }