X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FUtil%2FLock.php;h=66a568811d62c80ee093ff6e3a889915dd95f015;hb=1bce1b57eb296ffbf199d6cfa5a963098e953381;hp=6d7952ffa914524b0a40f738af91a3ceccf2a3df;hpb=16df7715b96b436ac3133a92830b37a2673633de;p=friendica.git diff --git a/src/Util/Lock.php b/src/Util/Lock.php index 6d7952ffa9..66a568811d 100644 --- a/src/Util/Lock.php +++ b/src/Util/Lock.php @@ -1,28 +1,35 @@ =')) { + self::$semaphore[$fn_name] = sem_get(self::semaphoreKey($fn_name)); + if (self::$semaphore[$fn_name]) { + return sem_acquire(self::$semaphore[$fn_name], ($timeout == 0)); + } + } + $memcache = self::connectMemcache(); if (is_object($memcache)) { - $wait_sec = 0.2; $cachekey = get_app()->get_hostname().";lock:".$fn_name; do { @@ -82,20 +117,18 @@ class Lock { dba::unlock(); if (!$got_lock && ($timeout > 0)) { - usleep($wait_sec * 1000000); + usleep(rand(10000, 200000)); } } while (!$got_lock && ((time() - $start) < $timeout)); return $got_lock; } - $wait_sec = 2; - do { dba::lock('locks'); - $lock = dba::select('locks', array('locked', 'pid'), array('name' => $fn_name), array('limit' => 1)); + $lock = dba::selectFirst('locks', ['locked', 'pid'], ['name' => $fn_name]); - if (dbm::is_result($lock)) { + if (DBM::is_result($lock)) { if ($lock['locked']) { // When the process id isn't used anymore, we can safely claim the lock for us. if (!posix_kill($lock['pid'], 0)) { @@ -110,7 +143,7 @@ class Lock { dba::update('locks', array('locked' => true, 'pid' => getmypid()), array('name' => $fn_name)); $got_lock = true; } - } elseif (!dbm::is_result($lock)) { + } elseif (!DBM::is_result($lock)) { dba::insert('locks', array('name' => $fn_name, 'locked' => true, 'pid' => getmypid())); $got_lock = true; } @@ -118,7 +151,7 @@ class Lock { dba::unlock(); if (!$got_lock && ($timeout > 0)) { - sleep($wait_sec); + usleep(rand(100000, 2000000)); } } while (!$got_lock && ((time() - $start) < $timeout)); @@ -129,8 +162,20 @@ class Lock { * @brief Removes a lock if it was set by us * * @param string $fn_name Name of the lock + * @return mixed */ - public static function remove($fn_name) { + public static function remove($fn_name) + { + if (function_exists('sem_get') && version_compare(PHP_VERSION, '5.6.1', '>=')) { + if (empty(self::$semaphore[$fn_name])) { + return false; + } else { + $success = @sem_release(self::$semaphore[$fn_name]); + unset(self::$semaphore[$fn_name]); + return $success; + } + } + $memcache = self::connectMemcache(); if (is_object($memcache)) { $cachekey = get_app()->get_hostname().";lock:".$fn_name; @@ -150,8 +195,10 @@ class Lock { /** * @brief Removes all lock that were set by us + * @return void */ - public static function removeAll() { + public static function removeAll() + { $memcache = self::connectMemcache(); if (is_object($memcache)) { // We cannot delete all cache entries, but this doesn't matter with memcache