Files
wp-multisite-waas/dependencies/amphp/sync/src/LocalMutex.php
2024-11-30 18:24:12 -07:00

37 lines
1.0 KiB
PHP

<?php
namespace WP_Ultimo\Dependencies\Amp\Sync;
use WP_Ultimo\Dependencies\Amp\CallableMaker;
use WP_Ultimo\Dependencies\Amp\Deferred;
use WP_Ultimo\Dependencies\Amp\Promise;
use WP_Ultimo\Dependencies\Amp\Success;
class LocalMutex implements Mutex
{
use CallableMaker;
// kept for BC only
/** @var bool */
private $locked = \false;
/** @var Deferred[] */
private $queue = [];
/** {@inheritdoc} */
public function acquire() : Promise
{
if (!$this->locked) {
$this->locked = \true;
return new Success(new Lock(0, \Closure::fromCallable([$this, 'release'])));
}
$this->queue[] = $deferred = new Deferred();
return $deferred->promise();
}
private function release() : void
{
if (!empty($this->queue)) {
$deferred = \array_shift($this->queue);
$deferred->resolve(new Lock(0, \Closure::fromCallable([$this, 'release'])));
return;
}
$this->locked = \false;
}
}