class LockBackendAbstract
Non backend related common methods implementation for lock backends.
Hierarchy
- class \Drupal\Core\Lock\LockBackendAbstract implements \Drupal\Core\Lock\LockBackendInterface
Expanded class hierarchy of LockBackendAbstract
Related topics
File
- 
              core/lib/ Drupal/ Core/ Lock/ LockBackendAbstract.php, line 10 
Namespace
Drupal\Core\LockView source
abstract class LockBackendAbstract implements LockBackendInterface {
  
  /**
   * Current page lock token identifier.
   *
   * @var string
   */
  protected $lockId;
  
  /**
   * Existing locks for this page.
   *
   * @var array
   */
  protected $locks = [];
  
  /**
   * {@inheritdoc}
   */
  public function wait($name, $delay = 30) {
    // Pause the process for short periods between calling
    // lock_may_be_available(). This prevents hitting the database with constant
    // database queries while waiting, which could lead to performance issues.
    // However, if the wait period is too long, there is the potential for a
    // large number of processes to be blocked waiting for a lock, especially
    // if the item being rebuilt is commonly requested. To address both of these
    // concerns, begin waiting for 25ms, then add 25ms to the wait period each
    // time until it reaches 500ms. After this point polling will continue every
    // 500ms until $delay is reached.
    // $delay is passed in seconds, but we will be using usleep(), which takes
    // microseconds as a parameter. Multiply it by 1 million so that all
    // further numbers are equivalent.
    $delay = (int) $delay * 1000000;
    // Begin sleeping at 25ms.
    $sleep = 25000;
    while ($delay > 0) {
      // This function should only be called by a request that failed to get a
      // lock, so we sleep first to give the parallel request a chance to finish
      // and release the lock.
      usleep($sleep);
      // After each sleep, increase the value of $sleep until it reaches
      // 500ms, to reduce the potential for a lock stampede.
      $delay = $delay - $sleep;
      $sleep = min(500000, $sleep + 25000, $delay);
      if ($this->lockMayBeAvailable($name)) {
        // No longer need to wait.
        return FALSE;
      }
    }
    // The caller must still wait longer to get the lock.
    return TRUE;
  }
  
  /**
   * {@inheritdoc}
   */
  public function getLockId() {
    if (!isset($this->lockId)) {
      $this->lockId = uniqid(mt_rand(), TRUE);
    }
    return $this->lockId;
  }
}Members
| Title Sort descending | Modifiers | Object type | Summary | Overriden Title | Overrides | 
|---|---|---|---|---|---|
| LockBackendAbstract::$lockId | protected | property | Current page lock token identifier. | ||
| LockBackendAbstract::$locks | protected | property | Existing locks for this page. | ||
| LockBackendAbstract::getLockId | public | function | Gets the unique page token for locks. | Overrides LockBackendInterface::getLockId | |
| LockBackendAbstract::wait | public | function | Waits a short amount of time before a second lock acquire attempt. | Overrides LockBackendInterface::wait | |
| LockBackendInterface::acquire | public | function | Acquires a lock. | 4 | |
| LockBackendInterface::lockMayBeAvailable | public | function | Checks if a lock is available for acquiring. | 4 | |
| LockBackendInterface::release | public | function | Releases the given lock. | 4 | |
| LockBackendInterface::releaseAll | public | function | Releases all locks for the given lock token identifier. | 4 | 
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.
