Feature: #47712 - New Locking API¶
See forge#47712
Description¶
The new Locking API follows a new approach. Due to the problem of a very scattered support of locking methods in the various operating systems, the new API introduces a locking service, which provides access to the various locking methods. Some basic methods are shipped with the Core, but the available methods may be extended by extensions.
A locking method has to implement the Locking
. Each method has a set of capabilities, which
may vary depending on the current system, and a priority.
If a function requires a lock, the locking service is asked for the best fitting mechanism matching the requested capabilities. e.g. Semaphore locking is only available on Linux systems.
Usage example¶
Acquire a simple exclusive lock:
$lockFactory = GeneralUtility::makeInstance(LockFactory::class);
$locker = $lockFactory->createLocker('someId');
$locker->acquire() || die('ups, lock couldn\'t be acquired. That should never happen.');
...
$locker->release();
Some methods also support non-blocking locks:
$lockFactory = GeneralUtility::makeInstance(LockFactory::class);
$locker = $lockFactory->createLocker(
'someId',
LockingStrategyInterface::LOCK_CAPABILITY_SHARED | LockingStrategyInterface::LOCK_CAPABILITY_NOBLOCK
);
try {
$result = $locker->acquire(LockingStrategyInterface::LOCK_CAPABILITY_SHARED | LockingStrategyInterface::LOCK_CAPABILITY_NOBLOCK);
catch (LockAcquireWouldBlockException $e) {
// some process owns the lock, let's do something else meanwhile
}
if ($result) {
$locker->release();
}