X-Git-Url: http://git.cyclocoop.org/%7B%24www_url%7Dadmin/compta/pie.php?a=blobdiff_plain;f=includes%2Ffilebackend%2Flockmanager%2FLockManager.php;h=eff031b58b5333e9b56036e1f56a4a3ea1c34c8e;hb=d48c33e89835b1dcf8b8d50f473778c5ee3bbd54;hp=567a29892ebe4e89b66429d89fd8023800fed61b;hpb=734ca2b4d2a1246fb0ea1e54b861ab423ab5e257;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/filebackend/lockmanager/LockManager.php b/includes/filebackend/lockmanager/LockManager.php index 567a29892e..eff031b58b 100644 --- a/includes/filebackend/lockmanager/LockManager.php +++ b/includes/filebackend/lockmanager/LockManager.php @@ -87,7 +87,7 @@ abstract class LockManager { * @param array $paths List of resource names * @param int $type LockManager::LOCK_* constant * @param int $timeout Timeout in seconds (0 means non-blocking) (since 1.21) - * @return Status + * @return StatusValue */ final public function lock( array $paths, $type = self::LOCK_EX, $timeout = 0 ) { return $this->lockByType( [ $type => $paths ], $timeout ); @@ -98,22 +98,22 @@ abstract class LockManager { * * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths * @param int $timeout Timeout in seconds (0 means non-blocking) (since 1.21) - * @return Status + * @return StatusValue * @since 1.22 */ final public function lockByType( array $pathsByType, $timeout = 0 ) { $pathsByType = $this->normalizePathsByType( $pathsByType ); - $msleep = [ 0, 50, 100, 300, 500 ]; // retry backoff times - $start = microtime( true ); - do { - $status = $this->doLockByType( $pathsByType ); - $elapsed = microtime( true ) - $start; - if ( $status->isOK() || $elapsed >= $timeout || $elapsed < 0 ) { - break; // success, timeout, or clock set back - } - usleep( 1e3 * ( next( $msleep ) ?: 1000 ) ); // use 1 sec after enough times - $elapsed = microtime( true ) - $start; - } while ( $elapsed < $timeout && $elapsed >= 0 ); + + $status = null; + $loop = new WaitConditionLoop( + function () use ( &$status, $pathsByType ) { + $status = $this->doLockByType( $pathsByType ); + + return $status->isOK() ?: WaitConditionLoop::CONDITION_CONTINUE; + }, + $timeout + ); + $loop->invoke(); return $status; } @@ -123,7 +123,7 @@ abstract class LockManager { * * @param array $paths List of paths * @param int $type LockManager::LOCK_* constant - * @return Status + * @return StatusValue */ final public function unlock( array $paths, $type = self::LOCK_EX ) { return $this->unlockByType( [ $type => $paths ] ); @@ -133,7 +133,7 @@ abstract class LockManager { * Unlock the resources at the given abstract paths * * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths - * @return Status + * @return StatusValue * @since 1.22 */ final public function unlockByType( array $pathsByType ) { @@ -187,7 +187,7 @@ abstract class LockManager { /** * @see LockManager::lockByType() * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths - * @return Status + * @return StatusValue * @since 1.22 */ protected function doLockByType( array $pathsByType ) { @@ -214,14 +214,14 @@ abstract class LockManager { * * @param array $paths List of paths * @param int $type LockManager::LOCK_* constant - * @return Status + * @return StatusValue */ abstract protected function doLock( array $paths, $type ); /** * @see LockManager::unlockByType() * @param array $pathsByType Map of LockManager::LOCK_* constants to lists of paths - * @return Status + * @return StatusValue * @since 1.22 */ protected function doUnlockByType( array $pathsByType ) { @@ -238,7 +238,7 @@ abstract class LockManager { * * @param array $paths List of paths * @param int $type LockManager::LOCK_* constant - * @return Status + * @return StatusValue */ abstract protected function doUnlock( array $paths, $type ); }