1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2024-12-23 05:50:54 +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 $result;
protected $exception;
private $exception;
/**
* Is this future's process complete? Specifically, can this future be
@ -37,23 +36,34 @@ abstract class Future extends Phobject {
'timeout.'));
}
$graph = new FutureIterator(array($this));
$graph->resolveAll();
if (!$this->hasResult()) {
$graph = new FutureIterator(array($this));
$graph->resolveAll();
}
if ($this->exception) {
throw $this->exception;
if ($this->hasException()) {
throw $this->getException();
}
return $this->getResult();
}
public function setException(Exception $ex) {
$this->exception = $ex;
return $this;
}
final public function updateFuture() {
if ($this->hasException()) {
return;
}
public function getException() {
return $this->exception;
if ($this->hasResult()) {
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;
}
final protected function hasResult() {
final public function 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;
$check = $this->getWorkingSet();
$resolve = null;
do {
$read_sockets = array();
@ -188,48 +189,49 @@ final class FutureIterator extends Phobject implements Iterator {
$wait_time = 1;
foreach ($check as $wait => $key) {
$future = $this->futures[$key];
try {
if ($future->getException()) {
$future->updateFuture();
if ($future->hasException()) {
if ($resolve === null) {
$resolve = $wait;
continue;
}
if ($future->isReady()) {
if ($resolve === null) {
$resolve = $wait;
}
continue;
}
continue;
}
$got_sockets = false;
$socks = $future->getReadSockets();
if ($socks) {
$got_sockets = true;
foreach ($socks as $socket) {
$read_sockets[] = $socket;
}
if ($future->hasResult()) {
if ($resolve === null) {
$resolve = $wait;
}
continue;
}
$socks = $future->getWriteSockets();
if ($socks) {
$got_sockets = true;
foreach ($socks as $socket) {
$write_sockets[] = $socket;
}
$got_sockets = false;
$socks = $future->getReadSockets();
if ($socks) {
$got_sockets = true;
foreach ($socks as $socket) {
$read_sockets[] = $socket;
}
}
// If any currently active future had neither read nor write sockets,
// 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());
$socks = $future->getWriteSockets();
if ($socks) {
$got_sockets = true;
foreach ($socks as $socket) {
$write_sockets[] = $socket;
}
} catch (Exception $ex) {
$this->futures[$key]->setException($ex);
$resolve = $wait;
break;
}
// If any currently active future had neither read nor write sockets,
// 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) {
// Check for a setUpdateInterval() timeout.
@ -253,6 +255,7 @@ final class FutureIterator extends Phobject implements Iterator {
$this->key = $this->wait[$resolve];
unset($this->wait[$resolve]);
$this->updateWorkingSet();
}

View file

@ -27,25 +27,29 @@ abstract class FutureProxy extends Future {
}
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() {
$result = $this->getProxiedFuture()->resolve();
$result = $this->didReceiveResult($result);
$this->setResult($result);
$this->getProxiedFuture()->resolve();
$this->isReady();
return $this->getResult();
}
public function setException(Exception $ex) {
$this->getProxiedFuture()->setException($ex);
return $this;
}
public function getException() {
return $this->getProxiedFuture()->getException();
}
public function getReadSockets() {
return $this->getProxiedFuture()->getReadSockets();
}