master

laravel/framework

Last updated at: 29/12/2023 09:20

CacheLock.php

TLDR

This file contains the CacheLock class, which is responsible for acquiring and releasing locks in the cache. It extends the Lock class and implements methods such as acquire, release, and forceRelease.

Classes

CacheLock

The CacheLock class extends the Lock class and provides functionality for acquiring and releasing locks in the cache. It has the following methods:

  • __construct($store, $name, $seconds, $owner = null): Creates a new lock instance. It accepts a cache store implementation, a name for the lock, a duration in seconds, and an optional owner value.

  • acquire(): Attempts to acquire the lock. If the cache store's add method exists and the lock's duration is greater than 0, it adds the lock to the cache store. Otherwise, it checks if the lock already exists in the cache store. If the lock doesn't exist, it puts it in the cache store with the given duration. Returns true if the lock was acquired successfully, false otherwise.

  • release(): Releases the lock. If the lock is owned by the current process, it removes the lock from the cache store and returns true. Otherwise, it returns false.

  • forceRelease(): Releases the lock regardless of ownership. It simply removes the lock from the cache store.

  • getCurrentOwner(): Returns the owner value written into the cache store for this lock. It retrieves the value from the cache store using the lock's name.

<?php

namespace Illuminate\Cache;

class CacheLock extends Lock
{
    /**
     * The cache store implementation.
     *
     * @var \Illuminate\Contracts\Cache\Store
     */
    protected $store;

    /**
     * Create a new lock instance.
     *
     * @param  \Illuminate\Contracts\Cache\Store  $store
     * @param  string  $name
     * @param  int  $seconds
     * @param  string|null  $owner
     * @return void
     */
    public function __construct($store, $name, $seconds, $owner = null)
    {
        parent::__construct($name, $seconds, $owner);

        $this->store = $store;
    }

    /**
     * Attempt to acquire the lock.
     *
     * @return bool
     */
    public function acquire()
    {
        if (method_exists($this->store, 'add') && $this->seconds > 0) {
            return $this->store->add(
                $this->name, $this->owner, $this->seconds
            );
        }

        if (! is_null($this->store->get($this->name))) {
            return false;
        }

        return ($this->seconds > 0)
                ? $this->store->put($this->name, $this->owner, $this->seconds)
                : $this->store->forever($this->name, $this->owner);
    }

    /**
     * Release the lock.
     *
     * @return bool
     */
    public function release()
    {
        if ($this->isOwnedByCurrentProcess()) {
            return $this->store->forget($this->name);
        }

        return false;
    }

    /**
     * Releases this lock regardless of ownership.
     *
     * @return void
     */
    public function forceRelease()
    {
        $this->store->forget($this->name);
    }

    /**
     * Returns the owner value written into the driver for this lock.
     *
     * @return mixed
     */
    protected function getCurrentOwner()
    {
        return $this->store->get($this->name);
    }
}