function 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 166

Code

function lock_may_be_available($name) {
    $lock = db_query('SELECT expire, value FROM {semaphore} WHERE name = :name', array(
        ':name' => $name,
    ))->fetchAssoc();
    if (!$lock) {
        return TRUE;
    }
    $expire = (double) $lock['expire'];
    $now = microtime(TRUE);
    if ($now > $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.
        return (bool) db_delete('semaphore')->condition('name', $name)
            ->condition('value', $lock['value'])
            ->condition('expire', 0.0001 + $expire, '<=')
            ->execute();
    }
    return FALSE;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.