Initial Commit
This commit is contained in:
31
dependencies/amphp/sync/src/LocalKeyedMutex.php
vendored
Normal file
31
dependencies/amphp/sync/src/LocalKeyedMutex.php
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace WP_Ultimo\Dependencies\Amp\Sync;
|
||||
|
||||
use WP_Ultimo\Dependencies\Amp\Promise;
|
||||
use function WP_Ultimo\Dependencies\Amp\call;
|
||||
final class LocalKeyedMutex implements KeyedMutex
|
||||
{
|
||||
/** @var LocalMutex[] */
|
||||
private $mutex = [];
|
||||
/** @var int[] */
|
||||
private $locks = [];
|
||||
public function acquire(string $key) : Promise
|
||||
{
|
||||
if (!isset($this->mutex[$key])) {
|
||||
$this->mutex[$key] = new LocalMutex();
|
||||
$this->locks[$key] = 0;
|
||||
}
|
||||
return call(function () use($key) {
|
||||
$this->locks[$key]++;
|
||||
/** @var Lock $lock */
|
||||
$lock = (yield $this->mutex[$key]->acquire());
|
||||
return new Lock(0, function () use($lock, $key) {
|
||||
if (--$this->locks[$key] === 0) {
|
||||
unset($this->mutex[$key], $this->locks[$key]);
|
||||
}
|
||||
$lock->release();
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user