Completed
Push — master ( 76395b...dc7112 )
by Alice
02:12
created
src/Mediator/Mediator.php 1 patch
Indentation   +49 added lines, -49 removed lines patch added patch discarded remove patch
@@ -7,64 +7,64 @@
 block discarded – undo
7 7
 
8 8
 class Mediator
9 9
 {
10
-	/** @var ListenerInterface[][] */
11
-	private $listeners = [];
10
+    /** @var ListenerInterface[][] */
11
+    private $listeners = [];
12 12
 
13
-	/**
14
-	 * @return ListenerInterface[][]
15
-	 */
16
-	public function getListeners(): array
17
-	{
18
-		return $this->listeners;
19
-	}
13
+    /**
14
+     * @return ListenerInterface[][]
15
+     */
16
+    public function getListeners(): array
17
+    {
18
+        return $this->listeners;
19
+    }
20 20
 
21
-	/**
22
-	 * @param ListenerInterface $listener
23
-	 * @return Mediator
24
-	 */
25
-	public function addListener(ListenerInterface $listener): self
26
-	{
27
-		$this->listeners[$listener->getEventName()][] = $listener;
21
+    /**
22
+     * @param ListenerInterface $listener
23
+     * @return Mediator
24
+     */
25
+    public function addListener(ListenerInterface $listener): self
26
+    {
27
+        $this->listeners[$listener->getEventName()][] = $listener;
28 28
 
29
-		return $this;
30
-	}
29
+        return $this;
30
+    }
31 31
 
32
-	/**
33
-	 * @param ListenerInterface $listener
34
-	 * @return Mediator
35
-	 */
36
-	public function removeListener(ListenerInterface $listener): self
37
-	{
38
-		if (!isset($this->listeners[$listener->getEventName()])) {
39
-			return $this;
40
-		}
32
+    /**
33
+     * @param ListenerInterface $listener
34
+     * @return Mediator
35
+     */
36
+    public function removeListener(ListenerInterface $listener): self
37
+    {
38
+        if (!isset($this->listeners[$listener->getEventName()])) {
39
+            return $this;
40
+        }
41 41
 
42
-		$key = array_search($listener, $this->listeners[$listener->getEventName()]);
42
+        $key = array_search($listener, $this->listeners[$listener->getEventName()]);
43 43
 
44
-		if (false !== $key) {
45
-			unset($this->listeners[$listener->getEventName()][$key]);
46
-		}
44
+        if (false !== $key) {
45
+            unset($this->listeners[$listener->getEventName()][$key]);
46
+        }
47 47
 
48
-		if (empty($this->listeners[$listener->getEventName()])) {
49
-			unset($this->listeners[$listener->getEventName()]);
50
-		}
48
+        if (empty($this->listeners[$listener->getEventName()])) {
49
+            unset($this->listeners[$listener->getEventName()]);
50
+        }
51 51
 
52
-		return $this;
53
-	}
52
+        return $this;
53
+    }
54 54
 
55
-	/**
56
-	 * @param string $eventName
57
-	 * @param EventInterface $event
58
-	 */
59
-	public function notify($eventName, EventInterface $event)
60
-	{
61
-		if (!isset($this->listeners[$eventName])) {
62
-			return;
63
-		}
55
+    /**
56
+     * @param string $eventName
57
+     * @param EventInterface $event
58
+     */
59
+    public function notify($eventName, EventInterface $event)
60
+    {
61
+        if (!isset($this->listeners[$eventName])) {
62
+            return;
63
+        }
64 64
 
65
-		foreach ($this->listeners[$eventName] as $listener) {
66
-			$listener->notify($event);
67
-		}
68
-	}
65
+        foreach ($this->listeners[$eventName] as $listener) {
66
+            $listener->notify($event);
67
+        }
68
+    }
69 69
 
70 70
 }
Please login to merge, or discard this patch.
src/Mediator/Listener/ListenerInterface.php 1 patch
Indentation   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -7,21 +7,21 @@
 block discarded – undo
7 7
 interface ListenerInterface
8 8
 {
9 9
 
10
-	/**
11
-	 * @return string
12
-	 */
13
-	public function getEventName(): string;
10
+    /**
11
+     * @return string
12
+     */
13
+    public function getEventName(): string;
14 14
 
15
-	/**
16
-	 * @param callable $callback
17
-	 * @return $this
18
-	 */
19
-	public function setCallback(callable $callback): self;
15
+    /**
16
+     * @param callable $callback
17
+     * @return $this
18
+     */
19
+    public function setCallback(callable $callback): self;
20 20
 
21
-	/**
22
-	 * @param EventInterface $event
23
-	 * @return void
24
-	 */
25
-	public function notify(EventInterface $event);
21
+    /**
22
+     * @param EventInterface $event
23
+     * @return void
24
+     */
25
+    public function notify(EventInterface $event);
26 26
 
27 27
 }
Please login to merge, or discard this patch.
src/Mediator/Listener/Listener.php 1 patch
Indentation   +52 added lines, -52 removed lines patch added patch discarded remove patch
@@ -6,57 +6,57 @@
 block discarded – undo
6 6
 
7 7
 class Listener implements ListenerInterface
8 8
 {
9
-	/** @var string $eventName */
10
-	private $eventName;
11
-
12
-	/** @var callable $callback */
13
-	private $callback;
14
-
15
-	/**
16
-	 * Listener constructor.
17
-	 * @param string $eventName
18
-	 * @param callable|null $callback
19
-	 */
20
-	public function __construct(string $eventName, callable $callback = null)
21
-	{
22
-		$this->eventName = $eventName;
23
-		$this->callback = $callback;
24
-	}
25
-
26
-	/**
27
-	 * @inheritDoc
28
-	 */
29
-	public function getEventName(): string
30
-	{
31
-		return $this->eventName;
32
-	}
33
-
34
-	/**
35
-	 * @inheritDoc
36
-	 */
37
-	public function setEventName(string $eventName): self
38
-	{
39
-		$this->eventName = $eventName;
40
-
41
-		return $this;
42
-	}
43
-
44
-	/**
45
-	 * @inheritDoc
46
-	 */
47
-	public function setCallback(callable $callback): ListenerInterface
48
-	{
49
-		$this->callback = $callback;
50
-
51
-		return $this;
52
-	}
53
-
54
-	/**
55
-	 * @inheritDoc
56
-	 */
57
-	public function notify(EventInterface $event)
58
-	{
59
-		($this->callback)($event);
60
-	}
9
+    /** @var string $eventName */
10
+    private $eventName;
11
+
12
+    /** @var callable $callback */
13
+    private $callback;
14
+
15
+    /**
16
+     * Listener constructor.
17
+     * @param string $eventName
18
+     * @param callable|null $callback
19
+     */
20
+    public function __construct(string $eventName, callable $callback = null)
21
+    {
22
+        $this->eventName = $eventName;
23
+        $this->callback = $callback;
24
+    }
25
+
26
+    /**
27
+     * @inheritDoc
28
+     */
29
+    public function getEventName(): string
30
+    {
31
+        return $this->eventName;
32
+    }
33
+
34
+    /**
35
+     * @inheritDoc
36
+     */
37
+    public function setEventName(string $eventName): self
38
+    {
39
+        $this->eventName = $eventName;
40
+
41
+        return $this;
42
+    }
43
+
44
+    /**
45
+     * @inheritDoc
46
+     */
47
+    public function setCallback(callable $callback): ListenerInterface
48
+    {
49
+        $this->callback = $callback;
50
+
51
+        return $this;
52
+    }
53
+
54
+    /**
55
+     * @inheritDoc
56
+     */
57
+    public function notify(EventInterface $event)
58
+    {
59
+        ($this->callback)($event);
60
+    }
61 61
 
62 62
 }
Please login to merge, or discard this patch.
src/Mediator/Event/EventInterface.php 1 patch
Indentation   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -5,9 +5,9 @@
 block discarded – undo
5 5
 interface EventInterface
6 6
 {
7 7
 
8
-	/**
9
-	 * @return string
10
-	 */
11
-	public function getEventName(): string;
8
+    /**
9
+     * @return string
10
+     */
11
+    public function getEventName(): string;
12 12
 
13 13
 }
Please login to merge, or discard this patch.
src/AbstractThreadPoolMediator.php 1 patch
Indentation   +49 added lines, -49 removed lines patch added patch discarded remove patch
@@ -8,54 +8,54 @@
 block discarded – undo
8 8
 
9 9
 abstract class AbstractThreadPoolMediator
10 10
 {
11
-	/** @var Mediator */
12
-	private $mediator;
13
-
14
-	/**
15
-	 * @return Mediator
16
-	 */
17
-	public function getMediator()
18
-	{
19
-		return $this->mediator;
20
-	}
21
-
22
-	/**
23
-	 * ThreadPoolMediator constructor.
24
-	 */
25
-	public function __construct()
26
-	{
27
-		$this->mediator = new Mediator();
28
-	}
29
-
30
-	/**
31
-	 * @param ListenerInterface $listener
32
-	 * @return AbstractThreadPoolMediator
33
-	 */
34
-	public function addListener(ListenerInterface $listener): self
35
-	{
36
-		$this->mediator->addListener($listener);
37
-
38
-		return $this;
39
-	}
40
-
41
-	/**
42
-	 * @param ListenerInterface $listener
43
-	 * @return AbstractThreadPoolMediator
44
-	 */
45
-	public function removeListener(ListenerInterface $listener): self
46
-	{
47
-		$this->mediator->removeListener($listener);
48
-
49
-		return $this;
50
-	}
51
-
52
-	/**
53
-	 * @param string $eventName
54
-	 * @param Thread|null $thread
55
-	 */
56
-	public function notify(string $eventName, ?Thread $thread = null)
57
-	{
58
-		$this->getMediator()->notify($eventName, EventFactory::create($eventName, $this, $thread));
59
-	}
11
+    /** @var Mediator */
12
+    private $mediator;
13
+
14
+    /**
15
+     * @return Mediator
16
+     */
17
+    public function getMediator()
18
+    {
19
+        return $this->mediator;
20
+    }
21
+
22
+    /**
23
+     * ThreadPoolMediator constructor.
24
+     */
25
+    public function __construct()
26
+    {
27
+        $this->mediator = new Mediator();
28
+    }
29
+
30
+    /**
31
+     * @param ListenerInterface $listener
32
+     * @return AbstractThreadPoolMediator
33
+     */
34
+    public function addListener(ListenerInterface $listener): self
35
+    {
36
+        $this->mediator->addListener($listener);
37
+
38
+        return $this;
39
+    }
40
+
41
+    /**
42
+     * @param ListenerInterface $listener
43
+     * @return AbstractThreadPoolMediator
44
+     */
45
+    public function removeListener(ListenerInterface $listener): self
46
+    {
47
+        $this->mediator->removeListener($listener);
48
+
49
+        return $this;
50
+    }
51
+
52
+    /**
53
+     * @param string $eventName
54
+     * @param Thread|null $thread
55
+     */
56
+    public function notify(string $eventName, ?Thread $thread = null)
57
+    {
58
+        $this->getMediator()->notify($eventName, EventFactory::create($eventName, $this, $thread));
59
+    }
60 60
 
61 61
 }
Please login to merge, or discard this patch.
src/Exception/ThreadException.php 1 patch
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -2,5 +2,5 @@
 block discarded – undo
2 2
 
3 3
 namespace Wonderland\Thread\Exception;
4 4
 
5
-class ThreadException extends \Exception{
5
+class ThreadException extends \Exception {
6 6
 }
Please login to merge, or discard this patch.
src/ThreadPool.php 1 patch
Indentation   +265 added lines, -265 removed lines patch added patch discarded remove patch
@@ -7,270 +7,270 @@
 block discarded – undo
7 7
 
8 8
 class ThreadPool extends AbstractThreadPoolMediator
9 9
 {
10
-	// 0.2s
11
-	private const SLEEP_TIME_MS = 50000;
12
-
13
-	/** @var Thread[] $childs */
14
-	private $threads;
15
-
16
-	/** @var Thread[] $toRunThreads */
17
-	private $toRunThreads;
18
-
19
-	/** @var Thread[] $runningChilds */
20
-	private $runningThreads;
21
-
22
-	/** @var bool $isRunning */
23
-	private $isRunning;
24
-
25
-	/** @var int $maxRunningThreadNb */
26
-	private $maxRunningThreadNb;
27
-
28
-	/**
29
-	 * ThreadPool constructor.
30
-	 */
31
-	public function __construct()
32
-	{
33
-		parent::__construct();
34
-		$this->threads = [];
35
-		$this->runningThreads = [];
36
-		$this->toRunThreads = [];
37
-		$this->isRunning = false;
38
-		$this->maxRunningThreadNb = 0;
39
-	}
40
-
41
-	/**
42
-	 *
43
-	 */
44
-	public function __destruct()
45
-	{
46
-		pcntl_waitpid(-1, $status, WNOHANG);
47
-	}
48
-
49
-	/**
50
-	 * @return Thread[]
51
-	 */
52
-	public function getThreads(): array
53
-	{
54
-		return $this->threads;
55
-	}
56
-
57
-	/**
58
-	 * @param Thread[] $threads
59
-	 * @return ThreadPool
60
-	 */
61
-	public function setThreads(array $threads): self
62
-	{
63
-		$this->threads = $threads;
64
-
65
-		return $this;
66
-	}
67
-
68
-	/**
69
-	 * @param Thread $thread
70
-	 * @return ThreadPool
71
-	 */
72
-	public function addThread(Thread $thread): self
73
-	{
74
-		$this->threads[] = $thread;
75
-
76
-		return $this;
77
-	}
78
-
79
-	/**
80
-	 * @return int
81
-	 */
82
-	public function getMaxRunningThreadNb(): int
83
-	{
84
-		return $this->maxRunningThreadNb;
85
-	}
86
-
87
-	/**
88
-	 * @param int $maxRunningThreadNb
89
-	 * @return ThreadPool
90
-	 */
91
-	public function setMaxRunningThreadNb(int $maxRunningThreadNb): self
92
-	{
93
-		$this->maxRunningThreadNb = $maxRunningThreadNb;
94
-
95
-		return $this;
96
-	}
97
-
98
-	/**
99
-	 * @return Thread[]
100
-	 */
101
-	public function getToRunThreads(): array
102
-	{
103
-		return $this->toRunThreads;
104
-	}
105
-
106
-	/**
107
-	 * @return Thread[]
108
-	 */
109
-	public function getRunningThreads(): array
110
-	{
111
-		return $this->runningThreads;
112
-	}
113
-
114
-	/**
115
-	 * @throws ThreadException
116
-	 */
117
-	public function run()
118
-	{
119
-		$this->checkEnv();
120
-		$this->initRun();
121
-
122
-		while ($this->isRunningThreads()) {
123
-			$this->waitOnThreads();
124
-		}
125
-
126
-		$this->resetRun();
127
-	}
128
-
129
-	/**
130
-	 * @return bool
131
-	 * @throws ThreadException
132
-	 */
133
-	private function isRunningThreads(): bool
134
-	{
135
-		if (count($this->toRunThreads) > 0) {
136
-			while (count($this->runningThreads) < $this->maxRunningThreadNb && count($this->toRunThreads) > 0) {
137
-				$this->createThreadProcess(array_shift($this->toRunThreads));
138
-			}
139
-		}
140
-
141
-		return count($this->runningThreads) > 0;
142
-	}
143
-
144
-	/**
145
-	 * can't test some part of it this since we can't unit-test in web and we're never in a child
146
-	 * process when pid 0 when unit-testing since the coverage is done by the parent thread
147
-	 * @param Thread $thread
148
-	 * @throws ThreadException
149
-	 */
150
-	private function createThreadProcess(Thread $thread)
151
-	{
152
-		$pid = pcntl_fork();
153
-
154
-		switch ($pid) {
155
-			case -1: //error forking
156
-				// @codeCoverageIgnoreStart
157
-				throw new ThreadException('Error while trying to fork. Check your server installation');
158
-				// @codeCoverageIgnoreEnd
159
-			case 0: // child
160
-				// @codeCoverageIgnoreStart
161
-				$this->processThread($thread);
162
-				break;
163
-				// @codeCoverageIgnoreEnd
164
-			default: //parent
165
-				$thread->setPid($pid);
166
-				$this->runningThreads[] = $thread;
167
-				$this->notify(Event::POOL_NEW_THREAD, $thread);
168
-				$this->startRunStatus();
169
-		}
170
-	}
171
-
172
-	/**
173
-	 *
174
-	 */
175
-	private function waitOnThreads()
176
-	{
177
-		$this->notify(Event::POOL_PRE_WAIT_TICK);
178
-		foreach ($this->runningThreads as $k => $thread) {
179
-
180
-			$res = pcntl_waitpid($thread->getPid(), $status, WNOHANG);
181
-			$this->notify(Event::POOL_WAIT_TICK_PID);
182
-
183
-			if ($res === -1 || $res > 0) {
184
-				$this->notify(Event::POOL_WAIT_TICK_PID_REMOVED, $thread);
185
-				unset($this->runningThreads[$k]);
186
-			}
187
-
188
-		}
189
-		$this->notify(Event::POOL_POST_WAIT_TICK);
190
-
191
-		usleep(self::SLEEP_TIME_MS);
192
-	}
193
-
194
-	/**
195
-	 * @codeCoverageIgnore Can't test since this is only run in a child thread.. which doesnt' go throug the
196
-	 * unit-test coverage which is only done in the main process
197
-	 * @param Thread $thread
198
-	 * @throws ThreadException
199
-	 */
200
-	private function processThread(Thread $thread)
201
-	{
202
-		$this->notify(Event::THREAD_PRE_PROCESS, $thread);
203
-		$response = $thread->run($thread->getProcessName());
204
-		$this->notify(Event::THREAD_POST_PROCESS, $thread);
205
-
206
-		switch ($response) {
207
-			case Thread::EXIT_STATUS_SUCCESS:
208
-				$this->notify(Event::THREAD_EXIT_SUCCESS, $thread);
209
-				break;
210
-			case Thread::EXIT_STATUS_ERROR:
211
-				$this->notify(Event::THREAD_EXIT_ERROR, $thread);
212
-				break;
213
-			default:
214
-				$this->notify(Event::THREAD_EXIT_UNKNOWN, $thread);
215
-		}
216
-
217
-		exit($response);
218
-	}
219
-
220
-	/**
221
-	 * Can't test the exception is not in cli since php-unit is only run in cli environment
222
-	 * @throws ThreadException
223
-	 */
224
-	private function checkEnv()
225
-	{
226
-		if (false === $this->isCli()) {
227
-			// @codeCoverageIgnoreStart
228
-			throw new ThreadException('Error. It is not safe to use process forking in other way than php-cli');
229
-			// @codeCoverageIgnoreEnd
230
-		}
231
-		if (0 === count($this->threads)) {
232
-			throw new ThreadException('Error. Can\'t run child threads processes without any added in the Pool');
233
-		}
234
-	}
235
-
236
-	/**
237
-	 *
238
-	 */
239
-	private function initRun()
240
-	{
241
-		$this->resetRun();
242
-	}
243
-
244
-	/**
245
-	 * @return bool
246
-	 */
247
-	private function isCli(): bool
248
-	{
249
-		return PHP_SAPI === 'cli';
250
-	}
251
-
252
-	/**
253
-	 *
254
-	 */
255
-	private function startRunStatus()
256
-	{
257
-		if (false === $this->isRunning) {
258
-			$this->notify(Event::POOL_RUN_START);
259
-			$this->isRunning = true;
260
-		}
261
-	}
262
-
263
-	/**
264
-	 *
265
-	 */
266
-	private function resetRun()
267
-	{
268
-		if (true === $this->isRunning) {
269
-			$this->notify(Event::POOL_RUN_STOP);
270
-		}
271
-		$this->isRunning = false;
272
-		$this->toRunThreads = $this->threads;
273
-		$this->runningThreads = [];
274
-	}
10
+    // 0.2s
11
+    private const SLEEP_TIME_MS = 50000;
12
+
13
+    /** @var Thread[] $childs */
14
+    private $threads;
15
+
16
+    /** @var Thread[] $toRunThreads */
17
+    private $toRunThreads;
18
+
19
+    /** @var Thread[] $runningChilds */
20
+    private $runningThreads;
21
+
22
+    /** @var bool $isRunning */
23
+    private $isRunning;
24
+
25
+    /** @var int $maxRunningThreadNb */
26
+    private $maxRunningThreadNb;
27
+
28
+    /**
29
+     * ThreadPool constructor.
30
+     */
31
+    public function __construct()
32
+    {
33
+        parent::__construct();
34
+        $this->threads = [];
35
+        $this->runningThreads = [];
36
+        $this->toRunThreads = [];
37
+        $this->isRunning = false;
38
+        $this->maxRunningThreadNb = 0;
39
+    }
40
+
41
+    /**
42
+     *
43
+     */
44
+    public function __destruct()
45
+    {
46
+        pcntl_waitpid(-1, $status, WNOHANG);
47
+    }
48
+
49
+    /**
50
+     * @return Thread[]
51
+     */
52
+    public function getThreads(): array
53
+    {
54
+        return $this->threads;
55
+    }
56
+
57
+    /**
58
+     * @param Thread[] $threads
59
+     * @return ThreadPool
60
+     */
61
+    public function setThreads(array $threads): self
62
+    {
63
+        $this->threads = $threads;
64
+
65
+        return $this;
66
+    }
67
+
68
+    /**
69
+     * @param Thread $thread
70
+     * @return ThreadPool
71
+     */
72
+    public function addThread(Thread $thread): self
73
+    {
74
+        $this->threads[] = $thread;
75
+
76
+        return $this;
77
+    }
78
+
79
+    /**
80
+     * @return int
81
+     */
82
+    public function getMaxRunningThreadNb(): int
83
+    {
84
+        return $this->maxRunningThreadNb;
85
+    }
86
+
87
+    /**
88
+     * @param int $maxRunningThreadNb
89
+     * @return ThreadPool
90
+     */
91
+    public function setMaxRunningThreadNb(int $maxRunningThreadNb): self
92
+    {
93
+        $this->maxRunningThreadNb = $maxRunningThreadNb;
94
+
95
+        return $this;
96
+    }
97
+
98
+    /**
99
+     * @return Thread[]
100
+     */
101
+    public function getToRunThreads(): array
102
+    {
103
+        return $this->toRunThreads;
104
+    }
105
+
106
+    /**
107
+     * @return Thread[]
108
+     */
109
+    public function getRunningThreads(): array
110
+    {
111
+        return $this->runningThreads;
112
+    }
113
+
114
+    /**
115
+     * @throws ThreadException
116
+     */
117
+    public function run()
118
+    {
119
+        $this->checkEnv();
120
+        $this->initRun();
121
+
122
+        while ($this->isRunningThreads()) {
123
+            $this->waitOnThreads();
124
+        }
125
+
126
+        $this->resetRun();
127
+    }
128
+
129
+    /**
130
+     * @return bool
131
+     * @throws ThreadException
132
+     */
133
+    private function isRunningThreads(): bool
134
+    {
135
+        if (count($this->toRunThreads) > 0) {
136
+            while (count($this->runningThreads) < $this->maxRunningThreadNb && count($this->toRunThreads) > 0) {
137
+                $this->createThreadProcess(array_shift($this->toRunThreads));
138
+            }
139
+        }
140
+
141
+        return count($this->runningThreads) > 0;
142
+    }
143
+
144
+    /**
145
+     * can't test some part of it this since we can't unit-test in web and we're never in a child
146
+     * process when pid 0 when unit-testing since the coverage is done by the parent thread
147
+     * @param Thread $thread
148
+     * @throws ThreadException
149
+     */
150
+    private function createThreadProcess(Thread $thread)
151
+    {
152
+        $pid = pcntl_fork();
153
+
154
+        switch ($pid) {
155
+            case -1: //error forking
156
+                // @codeCoverageIgnoreStart
157
+                throw new ThreadException('Error while trying to fork. Check your server installation');
158
+                // @codeCoverageIgnoreEnd
159
+            case 0: // child
160
+                // @codeCoverageIgnoreStart
161
+                $this->processThread($thread);
162
+                break;
163
+                // @codeCoverageIgnoreEnd
164
+            default: //parent
165
+                $thread->setPid($pid);
166
+                $this->runningThreads[] = $thread;
167
+                $this->notify(Event::POOL_NEW_THREAD, $thread);
168
+                $this->startRunStatus();
169
+        }
170
+    }
171
+
172
+    /**
173
+     *
174
+     */
175
+    private function waitOnThreads()
176
+    {
177
+        $this->notify(Event::POOL_PRE_WAIT_TICK);
178
+        foreach ($this->runningThreads as $k => $thread) {
179
+
180
+            $res = pcntl_waitpid($thread->getPid(), $status, WNOHANG);
181
+            $this->notify(Event::POOL_WAIT_TICK_PID);
182
+
183
+            if ($res === -1 || $res > 0) {
184
+                $this->notify(Event::POOL_WAIT_TICK_PID_REMOVED, $thread);
185
+                unset($this->runningThreads[$k]);
186
+            }
187
+
188
+        }
189
+        $this->notify(Event::POOL_POST_WAIT_TICK);
190
+
191
+        usleep(self::SLEEP_TIME_MS);
192
+    }
193
+
194
+    /**
195
+     * @codeCoverageIgnore Can't test since this is only run in a child thread.. which doesnt' go throug the
196
+     * unit-test coverage which is only done in the main process
197
+     * @param Thread $thread
198
+     * @throws ThreadException
199
+     */
200
+    private function processThread(Thread $thread)
201
+    {
202
+        $this->notify(Event::THREAD_PRE_PROCESS, $thread);
203
+        $response = $thread->run($thread->getProcessName());
204
+        $this->notify(Event::THREAD_POST_PROCESS, $thread);
205
+
206
+        switch ($response) {
207
+            case Thread::EXIT_STATUS_SUCCESS:
208
+                $this->notify(Event::THREAD_EXIT_SUCCESS, $thread);
209
+                break;
210
+            case Thread::EXIT_STATUS_ERROR:
211
+                $this->notify(Event::THREAD_EXIT_ERROR, $thread);
212
+                break;
213
+            default:
214
+                $this->notify(Event::THREAD_EXIT_UNKNOWN, $thread);
215
+        }
216
+
217
+        exit($response);
218
+    }
219
+
220
+    /**
221
+     * Can't test the exception is not in cli since php-unit is only run in cli environment
222
+     * @throws ThreadException
223
+     */
224
+    private function checkEnv()
225
+    {
226
+        if (false === $this->isCli()) {
227
+            // @codeCoverageIgnoreStart
228
+            throw new ThreadException('Error. It is not safe to use process forking in other way than php-cli');
229
+            // @codeCoverageIgnoreEnd
230
+        }
231
+        if (0 === count($this->threads)) {
232
+            throw new ThreadException('Error. Can\'t run child threads processes without any added in the Pool');
233
+        }
234
+    }
235
+
236
+    /**
237
+     *
238
+     */
239
+    private function initRun()
240
+    {
241
+        $this->resetRun();
242
+    }
243
+
244
+    /**
245
+     * @return bool
246
+     */
247
+    private function isCli(): bool
248
+    {
249
+        return PHP_SAPI === 'cli';
250
+    }
251
+
252
+    /**
253
+     *
254
+     */
255
+    private function startRunStatus()
256
+    {
257
+        if (false === $this->isRunning) {
258
+            $this->notify(Event::POOL_RUN_START);
259
+            $this->isRunning = true;
260
+        }
261
+    }
262
+
263
+    /**
264
+     *
265
+     */
266
+    private function resetRun()
267
+    {
268
+        if (true === $this->isRunning) {
269
+            $this->notify(Event::POOL_RUN_STOP);
270
+        }
271
+        $this->isRunning = false;
272
+        $this->toRunThreads = $this->threads;
273
+        $this->runningThreads = [];
274
+    }
275 275
 
276 276
 }
Please login to merge, or discard this patch.
src/Factory/EventFactory.php 1 patch
Indentation   +17 added lines, -17 removed lines patch added patch discarded remove patch
@@ -10,23 +10,23 @@
 block discarded – undo
10 10
 class EventFactory
11 11
 {
12 12
 
13
-	/**
14
-	 * @param string $eventName
15
-	 * @param ThreadPool|AbstractThreadPoolMediator $pool
16
-	 * @param Thread|null $thread
17
-	 * @return Event
18
-	 */
19
-	public static function create(string $eventName, AbstractThreadPoolMediator $pool, ?Thread $thread = null): Event
20
-	{
21
-		$event = new Event($eventName);
22
-		$event->setThreadNb(count($pool->getThreads()));
23
-		$event->setThreadDoneNb(count($pool->getThreads()) - count($pool->getToRunThreads()));
24
-		$event->setMaxRunningThreadNb($pool->getMaxRunningThreadNb());
25
-		$event->setThreadLeftNb(count($pool->getToRunThreads()));
26
-		$event->setRunningThreadNb(count($pool->getRunningThreads()));
27
-		$event->setThread($thread);
13
+    /**
14
+     * @param string $eventName
15
+     * @param ThreadPool|AbstractThreadPoolMediator $pool
16
+     * @param Thread|null $thread
17
+     * @return Event
18
+     */
19
+    public static function create(string $eventName, AbstractThreadPoolMediator $pool, ?Thread $thread = null): Event
20
+    {
21
+        $event = new Event($eventName);
22
+        $event->setThreadNb(count($pool->getThreads()));
23
+        $event->setThreadDoneNb(count($pool->getThreads()) - count($pool->getToRunThreads()));
24
+        $event->setMaxRunningThreadNb($pool->getMaxRunningThreadNb());
25
+        $event->setThreadLeftNb(count($pool->getToRunThreads()));
26
+        $event->setRunningThreadNb(count($pool->getRunningThreads()));
27
+        $event->setThread($thread);
28 28
 
29
-		return $event;
30
-	}
29
+        return $event;
30
+    }
31 31
 
32 32
 }
Please login to merge, or discard this patch.
src/Factory/ThreadFactory.php 1 patch
Indentation   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -7,18 +7,18 @@
 block discarded – undo
7 7
 class ThreadFactory
8 8
 {
9 9
 
10
-	/**
11
-	 * @param $processName
12
-	 * @param callable $function
13
-	 * @return Thread
14
-	 */
15
-	public static function create(string $processName, callable $function): Thread
16
-	{
17
-		$thread = new Thread();
18
-		$thread->setCallback($function);
19
-		$thread->setProcessName($processName);
10
+    /**
11
+     * @param $processName
12
+     * @param callable $function
13
+     * @return Thread
14
+     */
15
+    public static function create(string $processName, callable $function): Thread
16
+    {
17
+        $thread = new Thread();
18
+        $thread->setCallback($function);
19
+        $thread->setProcessName($processName);
20 20
 
21
-		return $thread;
22
-	}
21
+        return $thread;
22
+    }
23 23
 
24 24
 }
Please login to merge, or discard this patch.