/
githubmirror
/
symfony
Обзор
Документация
Войти
/
githubmirror
/
symfony
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
8.2
src/Symfony/Component/Lock/Store/SemaphoreStore.php
104 строки
3 KB
Nicolas Grekas
[Lock] Various fixes and hardenings
19 май 2026, 19:02
19 май 2026, 19:02
b6450a7
Код
Авторство
О чём код?
<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Lock\Store; use Symfony\Component\Lock\BlockingStoreInterface; use Symfony\Component\Lock\Exception\InvalidArgumentException; use Symfony\Component\Lock\Exception\LockConflictedException; use Symfony\Component\Lock\Key; /** * SemaphoreStore is a PersistingStoreInterface implementation using Semaphore as store engine. * * @author Jérémy Derussé <jeremy@derusse.com> */ class SemaphoreStore implements BlockingStoreInterface { /** * Returns whether or not the store is supported. * * @internal */ public static function isSupported(): bool { return \extension_loaded('sysvsem'); } /** * @param string $projectId A scoping prefix folded into the System V key derivation to isolate one * application's semaphore namespace from another's running on the same host */ public function __construct( private readonly string $projectId = '', ) { if (!static::isSupported()) { throw new InvalidArgumentException('Semaphore extension (sysvsem) is required.'); } } public function save(Key $key): void { $this->lock($key, false); } public function waitAndSave(Key $key): void { $this->lock($key, true); } private function lock(Key $key, bool $blocking): void { if ($key->hasState(__CLASS__)) { return; } $keyId = unpack('i', hash('xxh64', $this->projectId.$key, true))[1]; $resource = @sem_get($keyId); $acquired = $resource && @sem_acquire($resource, !$blocking); while ($blocking && !$acquired) { $resource = @sem_get($keyId); $acquired = $resource && @sem_acquire($resource); } if (!$acquired) { throw new LockConflictedException(); } $key->setState(__CLASS__, $resource); $key->markUnserializable(); } public function delete(Key $key): void { // The lock is maybe not acquired. if (!$key->hasState(__CLASS__)) { return; } $resource = $key->getState(__CLASS__); sem_remove($resource); $key->removeState(__CLASS__); } public function putOffExpiration(Key $key, float $ttl): void { // do nothing, the semaphore locks forever. } public function exists(Key $key): bool { return $key->hasState(__CLASS__); } }