-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathProxyThread.php
81 lines (66 loc) · 2.08 KB
/
ProxyThread.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<?php
declare(strict_types=1);
namespace libproxy;
use NetherGames\Quiche\SocketAddress;
use pmmp\thread\ThreadSafeArray;
use pocketmine\Server;
use pocketmine\snooze\SleeperHandlerEntry;
use pocketmine\thread\log\AttachableThreadSafeLogger;
use pocketmine\thread\Thread;
use Socket;
class ProxyThread extends Thread
{
private bool $ready = false;
public function __construct(
private ?string $autoloaderPath,
private string $serverIp,
private int $serverPort,
private AttachableThreadSafeLogger $logger,
private ThreadSafeArray $mainToThreadBuffer,
private ThreadSafeArray $threadToMainBuffer,
private SleeperHandlerEntry $sleeperEntry,
private Socket $notifySocket
)
{
$this->setClassLoaders([Server::getInstance()->getLoader()]);
}
public function shutdown(): void
{
$this->isKilled = true;
}
public function startAndWait(int $options): void
{
$this->start($options);
$this->synchronized(function (): void {
while (!$this->ready and $this->getCrashInfo() === null) {
$this->wait();
}
});
}
protected function onRun(): void
{
gc_enable();
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
ini_set('memory_limit', '512M');
if ($this->autoloaderPath !== null) {
require $this->autoloaderPath;
}
$proxy = new ProxyServer(
$this->logger,
new SocketAddress($this->serverIp, $this->serverPort),
$this->mainToThreadBuffer,
$this->threadToMainBuffer,
$this->sleeperEntry,
$this->notifySocket
);
$this->synchronized(function (): void {
$this->ready = true;
$this->notify();
});
while (!$this->isKilled) {
$proxy->tickProcessor();
}
$proxy->waitShutdown();
}
}