summaryrefslogtreecommitdiff
path: root/vendor/symfony/console/Command/LockableTrait.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/symfony/console/Command/LockableTrait.php')
-rw-r--r--vendor/symfony/console/Command/LockableTrait.php74
1 files changed, 74 insertions, 0 deletions
diff --git a/vendor/symfony/console/Command/LockableTrait.php b/vendor/symfony/console/Command/LockableTrait.php
new file mode 100644
index 0000000..f0001cc
--- /dev/null
+++ b/vendor/symfony/console/Command/LockableTrait.php
@@ -0,0 +1,74 @@
1<?php
2
3/*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12namespace Symfony\Component\Console\Command;
13
14use Symfony\Component\Console\Exception\LogicException;
15use Symfony\Component\Lock\LockFactory;
16use Symfony\Component\Lock\LockInterface;
17use Symfony\Component\Lock\Store\FlockStore;
18use Symfony\Component\Lock\Store\SemaphoreStore;
19
20/**
21 * Basic lock feature for commands.
22 *
23 * @author Geoffrey Brier <geoffrey.brier@gmail.com>
24 */
25trait LockableTrait
26{
27 private ?LockInterface $lock = null;
28
29 private ?LockFactory $lockFactory = null;
30
31 /**
32 * Locks a command.
33 */
34 private function lock(?string $name = null, bool $blocking = false): bool
35 {
36 if (!class_exists(SemaphoreStore::class)) {
37 throw new LogicException('To enable the locking feature you must install the symfony/lock component. Try running "composer require symfony/lock".');
38 }
39
40 if (null !== $this->lock) {
41 throw new LogicException('A lock is already in place.');
42 }
43
44 if (null === $this->lockFactory) {
45 if (SemaphoreStore::isSupported()) {
46 $store = new SemaphoreStore();
47 } else {
48 $store = new FlockStore();
49 }
50
51 $this->lockFactory = (new LockFactory($store));
52 }
53
54 $this->lock = $this->lockFactory->createLock($name ?: $this->getName());
55 if (!$this->lock->acquire($blocking)) {
56 $this->lock = null;
57
58 return false;
59 }
60
61 return true;
62 }
63
64 /**
65 * Releases the command lock if there is one.
66 */
67 private function release(): void
68 {
69 if ($this->lock) {
70 $this->lock->release();
71 $this->lock = null;
72 }
73 }
74}