You are here

function lock_may_be_available in Drupal 6

Same name in this branch
  1. 6 includes/lock.inc \lock_may_be_available()
  2. 6 includes/lock-install.inc \lock_may_be_available()
Same name and namespace in other branches
  1. 7 includes/lock.inc \lock_may_be_available()

Check if lock acquired by a different process may be available.

If an existing lock has expired, it is removed.

Parameters

$name: The name of the lock.

Return value

TRUE if there is no lock or it was removed, FALSE otherwise.

Related topics

2 calls to lock_may_be_available()
lock_acquire in includes/lock.inc
Acquire (or renew) a lock, but do not block if it fails.
lock_wait in includes/lock.inc
Wait for a lock to be available.

File

includes/lock.inc, line 148
A database-mediated implementation of a locking mechanism.

Code

function lock_may_be_available($name) {
  $lock = db_fetch_array(db_query("SELECT expire, value FROM {semaphore} WHERE name = '%s'", $name));
  if (!$lock) {
    return TRUE;
  }
  $expire = (double) $lock['expire'];
  list($usec, $sec) = explode(' ', microtime());
  $now = (double) $usec + (double) $sec;
  if ($now > $lock['expire']) {

    // We check two conditions to prevent a race condition where another
    // request acquired the lock and set a new expire time.  We add a small
    // number to $expire to avoid errors with float to string conversion.
    db_query("DELETE FROM {semaphore} WHERE name = '%s' AND value = '%s' AND expire <= %f", $name, $lock['value'], 0.0001 + $expire);
    return (bool) db_affected_rows();
  }
  return FALSE;
}