3 namespace Friendica\Core\Lock;
5 use Friendica\Core\Cache;
7 class SemaphoreLockDriver extends AbstractLockDriver
9 private static $semaphore = [];
11 public function __construct()
13 if (!function_exists('sem_get')) {
14 throw new \Exception('Semaphore lock not supported');
21 private static function semaphoreKey($key)
23 $temp = get_temppath();
25 $file = $temp . '/' . $key . '.sem';
27 if (!file_exists($file)) {
28 file_put_contents($file, $key);
31 return ftok($file, 'f');
37 public function acquireLock($key, $timeout = 120, $ttl = Cache::FIVE_MINUTES)
39 self::$semaphore[$key] = sem_get(self::semaphoreKey($key));
40 if (self::$semaphore[$key]) {
41 if (sem_acquire(self::$semaphore[$key], ($timeout == 0))) {
42 $this->markAcquire($key);
53 public function releaseLock($key)
55 if (empty(self::$semaphore[$key])) {
58 $success = @sem_release(self::$semaphore[$key]);
59 unset(self::$semaphore[$key]);
60 $this->markRelease($key);
68 public function isLocked($key)
70 return isset(self::$semaphore[$key]);