mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-27 13:49:55 +00:00
Updated RakLib dependency
This commit is contained in:
parent
f779881b6a
commit
4e54e54421
8
composer.lock
generated
8
composer.lock
generated
@ -529,12 +529,12 @@
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/pmmp/RakLib.git",
|
||||
"reference": "76e8d9f15c5ecc0d08d39968023380a2086f0d31"
|
||||
"reference": "b049d56a3ef5c87e545882737f8e1a8e965fec1d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/pmmp/RakLib/zipball/76e8d9f15c5ecc0d08d39968023380a2086f0d31",
|
||||
"reference": "76e8d9f15c5ecc0d08d39968023380a2086f0d31",
|
||||
"url": "https://api.github.com/repos/pmmp/RakLib/zipball/b049d56a3ef5c87e545882737f8e1a8e965fec1d",
|
||||
"reference": "b049d56a3ef5c87e545882737f8e1a8e965fec1d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@ -563,7 +563,7 @@
|
||||
"GPL-3.0"
|
||||
],
|
||||
"description": "A RakNet server implementation written in PHP",
|
||||
"time": "2020-03-29T10:00:16+00:00"
|
||||
"time": "2020-03-29T17:01:59+00:00"
|
||||
},
|
||||
{
|
||||
"name": "pocketmine/snooze",
|
||||
|
@ -35,7 +35,8 @@ use pocketmine\utils\Utils;
|
||||
use raklib\protocol\EncapsulatedPacket;
|
||||
use raklib\protocol\PacketReliability;
|
||||
use raklib\RakLib;
|
||||
use raklib\server\RakLibServer;
|
||||
use raklib\server\InterThreadChannelReader;
|
||||
use raklib\server\InterThreadChannelWriter;
|
||||
use raklib\server\ServerHandler;
|
||||
use raklib\server\ServerInstance;
|
||||
use raklib\utils\InternetAddress;
|
||||
@ -82,13 +83,16 @@ class RakLibInterface implements ServerInstance, AdvancedNetworkInterface{
|
||||
|
||||
$this->rakLib = new RakLibServer(
|
||||
$this->server->getLogger(),
|
||||
\pocketmine\COMPOSER_AUTOLOADER_PATH,
|
||||
new InternetAddress($this->server->getIp(), $this->server->getPort(), 4),
|
||||
(int) $this->server->getProperty("network.max-mtu-size", 1492),
|
||||
self::MCPE_RAKNET_PROTOCOL_VERSION,
|
||||
$this->sleeper
|
||||
);
|
||||
$this->interface = new ServerHandler($this->rakLib, $this);
|
||||
$this->interface = new ServerHandler(
|
||||
$this,
|
||||
new InterThreadChannelReader($this->rakLib->getExternalQueue()),
|
||||
new InterThreadChannelWriter($this->rakLib->getInternalQueue())
|
||||
);
|
||||
}
|
||||
|
||||
public function start() : void{
|
||||
@ -132,6 +136,7 @@ class RakLibInterface implements ServerInstance, AdvancedNetworkInterface{
|
||||
public function shutdown() : void{
|
||||
$this->server->getTickSleeper()->removeNotifier($this->sleeper);
|
||||
$this->interface->shutdown();
|
||||
$this->rakLib->quit();
|
||||
}
|
||||
|
||||
public function openSession(int $sessionId, string $address, int $port, int $clientID) : void{
|
||||
|
193
src/network/mcpe/raklib/RakLibServer.php
Normal file
193
src/network/mcpe/raklib/RakLibServer.php
Normal file
@ -0,0 +1,193 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
*
|
||||
* ____ _ _ __ __ _ __ __ ____
|
||||
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
|
||||
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
|
||||
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
|
||||
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* @author PocketMine Team
|
||||
* @link http://www.pocketmine.net/
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace pocketmine\network\mcpe\raklib;
|
||||
|
||||
use pocketmine\snooze\SleeperNotifier;
|
||||
use pocketmine\thread\Thread;
|
||||
use raklib\generic\Socket;
|
||||
use raklib\RakLib;
|
||||
use raklib\server\InterThreadChannelReader;
|
||||
use raklib\server\InterThreadChannelWriter;
|
||||
use raklib\server\SessionManager;
|
||||
use raklib\utils\ExceptionTraceCleaner;
|
||||
use raklib\utils\InternetAddress;
|
||||
use function error_get_last;
|
||||
use function gc_enable;
|
||||
use function ini_set;
|
||||
use function mt_rand;
|
||||
use function register_shutdown_function;
|
||||
use const PHP_INT_MAX;
|
||||
use const PTHREADS_INHERIT_NONE;
|
||||
|
||||
class RakLibServer extends Thread{
|
||||
/** @var InternetAddress */
|
||||
private $address;
|
||||
|
||||
/** @var \ThreadedLogger */
|
||||
protected $logger;
|
||||
|
||||
/** @var bool */
|
||||
protected $cleanShutdown = false;
|
||||
/** @var bool */
|
||||
protected $ready = false;
|
||||
|
||||
/** @var \Threaded */
|
||||
protected $externalQueue;
|
||||
/** @var \Threaded */
|
||||
protected $internalQueue;
|
||||
|
||||
/** @var string */
|
||||
protected $mainPath;
|
||||
|
||||
/** @var int */
|
||||
protected $serverId = 0;
|
||||
/** @var int */
|
||||
protected $maxMtuSize;
|
||||
/** @var int */
|
||||
private $protocolVersion;
|
||||
|
||||
/** @var SleeperNotifier */
|
||||
protected $mainThreadNotifier;
|
||||
|
||||
/** @var \Throwable|null */
|
||||
public $crashInfo = null;
|
||||
|
||||
/**
|
||||
* @param \ThreadedLogger $logger
|
||||
* @param InternetAddress $address
|
||||
* @param int $maxMtuSize
|
||||
* @param int|null $overrideProtocolVersion Optional custom protocol version to use, defaults to current RakLib's protocol
|
||||
* @param SleeperNotifier|null $sleeper
|
||||
*/
|
||||
public function __construct(\ThreadedLogger $logger, InternetAddress $address, int $maxMtuSize = 1492, ?int $overrideProtocolVersion = null, ?SleeperNotifier $sleeper = null){
|
||||
$this->address = $address;
|
||||
|
||||
$this->serverId = mt_rand(0, PHP_INT_MAX);
|
||||
$this->maxMtuSize = $maxMtuSize;
|
||||
|
||||
$this->logger = $logger;
|
||||
|
||||
$this->externalQueue = new \Threaded;
|
||||
$this->internalQueue = new \Threaded;
|
||||
|
||||
$this->mainPath = \pocketmine\PATH;
|
||||
|
||||
$this->protocolVersion = $overrideProtocolVersion ?? RakLib::DEFAULT_PROTOCOL_VERSION;
|
||||
|
||||
$this->mainThreadNotifier = $sleeper;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the RakNet server ID
|
||||
* @return int
|
||||
*/
|
||||
public function getServerId() : int{
|
||||
return $this->serverId;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Threaded
|
||||
*/
|
||||
public function getExternalQueue() : \Threaded{
|
||||
return $this->externalQueue;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \Threaded
|
||||
*/
|
||||
public function getInternalQueue() : \Threaded{
|
||||
return $this->internalQueue;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function shutdownHandler(){
|
||||
if($this->cleanShutdown !== true){
|
||||
$error = error_get_last();
|
||||
|
||||
if($error !== null){
|
||||
$this->logger->emergency("Fatal error: " . $error["message"] . " in " . $error["file"] . " on line " . $error["line"]);
|
||||
$this->setCrashInfo(new \ErrorException($error['message'], 0, $error['type'], $error['file'], $error['line']));
|
||||
}else{
|
||||
$this->logger->emergency("RakLib shutdown unexpectedly");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function getCrashInfo() : ?\Throwable{
|
||||
return $this->crashInfo;
|
||||
}
|
||||
|
||||
private function setCrashInfo(\Throwable $e) : void{
|
||||
$this->synchronized(function(\Throwable $e) : void{
|
||||
$this->crashInfo = $e;
|
||||
$this->notify();
|
||||
}, $e);
|
||||
}
|
||||
|
||||
public function startAndWait(int $options = PTHREADS_INHERIT_NONE) : void{
|
||||
$this->start($options);
|
||||
$this->synchronized(function() : void{
|
||||
while(!$this->ready and $this->crashInfo === null){
|
||||
$this->wait();
|
||||
}
|
||||
if($this->crashInfo !== null){
|
||||
throw $this->crashInfo;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public function onRun() : void{
|
||||
try{
|
||||
gc_enable();
|
||||
ini_set("display_errors", '1');
|
||||
ini_set("display_startup_errors", '1');
|
||||
|
||||
register_shutdown_function([$this, "shutdownHandler"]);
|
||||
|
||||
$socket = new Socket($this->address);
|
||||
$manager = new SessionManager(
|
||||
$this->serverId,
|
||||
$this->logger,
|
||||
$socket,
|
||||
$this->maxMtuSize,
|
||||
$this->protocolVersion,
|
||||
new InterThreadChannelReader($this->internalQueue),
|
||||
new InterThreadChannelWriter($this->externalQueue, $this->mainThreadNotifier),
|
||||
new ExceptionTraceCleaner($this->mainPath)
|
||||
);
|
||||
$this->synchronized(function() : void{
|
||||
$this->ready = true;
|
||||
$this->notify();
|
||||
});
|
||||
$manager->run();
|
||||
$this->cleanShutdown = true;
|
||||
}catch(\Throwable $e){
|
||||
$this->setCrashInfo($e);
|
||||
$this->logger->logException($e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -114,7 +114,7 @@ final class Process{
|
||||
|
||||
//TODO: more OS
|
||||
|
||||
return count(ThreadManager::getInstance()->getAll()) + 3; //RakLib + MainLogger + Main Thread
|
||||
return count(ThreadManager::getInstance()->getAll()) + 2; //MainLogger + Main Thread
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user