X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCore%2FLock%2FSemaphoreLock.php;h=d5153d432e46b0ccf68a27f6e18e02c1429fcb48;hb=c803dcb6c5f808ac8f962e9bd5e631a91655cbc7;hp=789c9e8ecac2527c853d6cb1b131dcb4d73757be;hpb=6b7dfd0c712bc89de955a735fcbca60dc973d71d;p=friendica.git diff --git a/src/Core/Lock/SemaphoreLock.php b/src/Core/Lock/SemaphoreLock.php index 789c9e8eca..d5153d432e 100644 --- a/src/Core/Lock/SemaphoreLock.php +++ b/src/Core/Lock/SemaphoreLock.php @@ -20,21 +20,23 @@ class SemaphoreLock extends Lock */ private static function semaphoreKey($key) { + $success = true; + $temp = get_temppath(); $file = $temp . '/' . $key . '.sem'; if (!file_exists($file)) { - file_put_contents($file, $key); + $success = !empty(file_put_contents($file, $key)); } - return ftok($file, 'f'); + return $success ? ftok($file, 'f') : false; } /** * (@inheritdoc) */ - public function acquireLock($key, $timeout = 120, $ttl = Cache::FIVE_MINUTES) + public function acquireLock($key, $timeout = 120, $ttl = Cache\Cache::FIVE_MINUTES) { self::$semaphore[$key] = sem_get(self::semaphoreKey($key)); if (self::$semaphore[$key]) { @@ -49,17 +51,25 @@ class SemaphoreLock extends Lock /** * (@inheritdoc) + * + * @param bool $override not necessary parameter for semaphore locks since the lock lives as long as the execution + * of the using function */ public function releaseLock($key, $override = false) { - if (empty(self::$semaphore[$key])) { - return false; - } else { - $success = @sem_release(self::$semaphore[$key]); - unset(self::$semaphore[$key]); - $this->markRelease($key); - return $success; + $success = false; + + if (!empty(self::$semaphore[$key])) { + try { + $success = @sem_release(self::$semaphore[$key]); + unset(self::$semaphore[$key]); + $this->markRelease($key); + } catch (\Exception $exception) { + $success = false; + } } + + return $success; } /** @@ -69,4 +79,46 @@ class SemaphoreLock extends Lock { return isset(self::$semaphore[$key]); } + + /** + * {@inheritDoc} + */ + public function getName() + { + return self::TYPE_SEMAPHORE; + } + + /** + * {@inheritDoc} + */ + public function getLocks(string $prefix = '') + { + // We can just return our own semaphore keys, since we don't know + // the state of other semaphores, even if the .sem files exists + $keys = array_keys(self::$semaphore); + + if (empty($prefix)) { + return $keys; + } else { + $result = []; + + foreach ($keys as $key) { + if (strpos($key, $prefix) === 0) { + array_push($result, $key); + } + } + + return $result; + } + } + + /** + * {@inheritDoc} + */ + public function releaseAll($override = false) + { + // Semaphores are just alive during a run, so there is no need to release + // You can just release your own locks + return parent::releaseAll($override); + } }