use Symfony\Component\Console\Exception\LogicException;
use Symfony\Component\Console\Exception\RuntimeException;
-use Symfony\Component\Filesystem\LockHandler;
+use Symfony\Component\Lock\Factory;
+use Symfony\Component\Lock\Lock;
+use Symfony\Component\Lock\Store\FlockStore;
+use Symfony\Component\Lock\Store\SemaphoreStore;
/**
* Basic lock feature for commands.
*/
trait LockableTrait
{
- private $lockHandler;
+ /** @var Lock */
+ private $lock;
/**
* Locks a command.
*/
private function lock($name = null, $blocking = false)
{
- if (!class_exists(LockHandler::class)) {
- throw new RuntimeException('To enable the locking feature you must install the symfony/filesystem component.');
+ if (!class_exists(SemaphoreStore::class)) {
+ throw new RuntimeException('To enable the locking feature you must install the symfony/lock component.');
}
- if (null !== $this->lockHandler) {
+ if (null !== $this->lock) {
throw new LogicException('A lock is already in place.');
}
- $this->lockHandler = new LockHandler($name ?: $this->getName());
+ if (SemaphoreStore::isSupported($blocking)) {
+ $store = new SemaphoreStore();
+ } else {
+ $store = new FlockStore();
+ }
- if (!$this->lockHandler->lock($blocking)) {
- $this->lockHandler = null;
+ $this->lock = (new Factory($store))->createLock($name ?: $this->getName());
+ if (!$this->lock->acquire($blocking)) {
+ $this->lock = null;
return false;
}
*/
private function release()
{
- if ($this->lockHandler) {
- $this->lockHandler->release();
- $this->lockHandler = null;
+ if ($this->lock) {
+ $this->lock->release();
+ $this->lock = null;
}
}
}