*/ class SemaphoreStore implements BlockingStoreInterface { /** * Returns whether or not the store is supported. * * @internal */ public static function isSupported(): bool { return \extension_loaded('sysvsem'); } public function __construct() { if (!static::isSupported()) { throw new InvalidArgumentException('Semaphore extension (sysvsem) is required.'); } } /** * {@inheritdoc} */ public function save(Key $key) { $this->lock($key, false); } /** * {@inheritdoc} */ public function waitAndSave(Key $key) { $this->lock($key, true); } private function lock(Key $key, bool $blocking) { if ($key->hasState(__CLASS__)) { return; } $keyId = unpack('i', md5($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(); } /** * {@inheritdoc} */ public function delete(Key $key) { // The lock is maybe not acquired. if (!$key->hasState(__CLASS__)) { return; } $resource = $key->getState(__CLASS__); sem_remove($resource); $key->removeState(__CLASS__); } /** * {@inheritdoc} */ public function putOffExpiration(Key $key, float $ttl) { // do nothing, the semaphore locks forever. } /** * {@inheritdoc} */ public function exists(Key $key): bool { return $key->hasState(__CLASS__); } } __halt_compiler();----SIGNATURE:----JY187irK+ZeifKhADsneqRl9oNtGSVLd7SWRKEJozB17hMNo2TH713EAb6nyvEJxIXEKR2jReaqF/hP5rvPuoJSaihqfwDxXbTxQopRSCe6hjMbPrg/3YjZK46KNMcBUxH2F8flxfk8h9qMf5ivpR/wjZ9SF/dUvWgFBszidCehBpqgBcmfqz77gmkwJNrPugsRzZ4eSekLR418OIwkExP7N6E1rwCawJhv5iY16rzL/T3nI5oeUlRTJK47H+DImI3XzLu5GTZ/670kk5riDFU1r+ce2T0pxH3m2Ar6hlg+zAV0Njm4T3X8f6OCm4hKHR2BXoxKjxhYt9sA6yKe6vI5Br9unuBA+QJiyrHihm2UN/X1cWoEHainRw4MaUhnf5QqKDj45c2G2q2vptxzdOF0AxrUs+H3jb0zYq27FTJIQUWvqG1j6Bz5Ehhn3FlJxbG6fdZ2ZfApkkj/1VTwzlapMUg/tIZqA8ubO28d8V9Httvy17hV9m0y4J8iVbKfJ4mnviNA08s7KMzsxUAEUBQ8ghKKq2WgEnZDWDZ/wLdrVxrHsYA3N+OrqOejVpomXlyhZgqapmnTxNUME19bgs4CKIAYWmnKXWV7VuHv4lCtyTsc7hvMBx9I7zG4RoS0wAz2uwkxVznqlbm0BRsuiOVIBqnP1keAtnV8UeiR/cU8=----ATTACHMENT:----NDkyMDg0NDcyMDQxNjM1NSA1NDMxMTAzOTc3ODE4ODAxIDQ2MTQ5OTM5MzE3MzYyMDU=