mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-05-13 09:19:42 +00:00
Implemented Threaded ClassLoader, improves class loading while on different threads (no need to synchronize states)
This commit is contained in:
parent
2cd757d80a
commit
9158cc4f19
@ -95,6 +95,7 @@ namespace pocketmine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!class_exists("ClassLoader", false)){
|
if(!class_exists("ClassLoader", false)){
|
||||||
|
require_once(\pocketmine\PATH . "src/spl/ThreadedFactory.php");
|
||||||
require_once(\pocketmine\PATH . "src/spl/ClassLoader.php");
|
require_once(\pocketmine\PATH . "src/spl/ClassLoader.php");
|
||||||
require_once(\pocketmine\PATH . "src/spl/BaseClassLoader.php");
|
require_once(\pocketmine\PATH . "src/spl/BaseClassLoader.php");
|
||||||
require_once(\pocketmine\PATH . "src/pocketmine/CompatibleClassLoader.php");
|
require_once(\pocketmine\PATH . "src/pocketmine/CompatibleClassLoader.php");
|
||||||
@ -103,7 +104,6 @@ namespace pocketmine {
|
|||||||
$autoloader = new CompatibleClassLoader();
|
$autoloader = new CompatibleClassLoader();
|
||||||
$autoloader->addPath(\pocketmine\PATH . "src");
|
$autoloader->addPath(\pocketmine\PATH . "src");
|
||||||
$autoloader->addPath(\pocketmine\PATH . "src" . DIRECTORY_SEPARATOR . "spl");
|
$autoloader->addPath(\pocketmine\PATH . "src" . DIRECTORY_SEPARATOR . "spl");
|
||||||
$autoloader->addPath(\pocketmine\PATH . "src" . DIRECTORY_SEPARATOR . "raklib");
|
|
||||||
$autoloader->register(true);
|
$autoloader->register(true);
|
||||||
|
|
||||||
|
|
||||||
|
@ -1489,8 +1489,7 @@ class Server{
|
|||||||
$this->dataPath = realpath($dataPath) . DIRECTORY_SEPARATOR;
|
$this->dataPath = realpath($dataPath) . DIRECTORY_SEPARATOR;
|
||||||
$this->pluginPath = realpath($pluginPath) . DIRECTORY_SEPARATOR;
|
$this->pluginPath = realpath($pluginPath) . DIRECTORY_SEPARATOR;
|
||||||
|
|
||||||
$this->consoleThreaded = new \Threaded();
|
$this->console = new CommandReader();
|
||||||
$this->console = new CommandReader($this->consoleThreaded);
|
|
||||||
|
|
||||||
$version = new VersionString($this->getPocketMineVersion());
|
$version = new VersionString($this->getPocketMineVersion());
|
||||||
$this->logger->info("Starting Minecraft: PE server version " . TextFormat::AQUA . $this->getVersion());
|
$this->logger->info("Starting Minecraft: PE server version " . TextFormat::AQUA . $this->getVersion());
|
||||||
|
@ -33,7 +33,7 @@ class CommandReader extends Thread{
|
|||||||
* @param \Threaded $threaded
|
* @param \Threaded $threaded
|
||||||
*/
|
*/
|
||||||
public function __construct(\Threaded $threaded){
|
public function __construct(\Threaded $threaded){
|
||||||
$this->buffer = $threaded;
|
$this->buffer = \ThreadedFactory::create();
|
||||||
$this->start();
|
$this->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,4 +86,4 @@ class CommandReader extends Thread{
|
|||||||
$lastLine = microtime(true);
|
$lastLine = microtime(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,14 +35,6 @@ class GenerationManager{
|
|||||||
* byte[] (length - 1 bytes)
|
* byte[] (length - 1 bytes)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
* Direction: Server->Thread
|
|
||||||
* byte[] payload:
|
|
||||||
* string root namespace
|
|
||||||
* byte[] path
|
|
||||||
*/
|
|
||||||
const PACKET_ADD_NAMESPACE = 0x00;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Direction: Both
|
* Direction: Both
|
||||||
* If Server->Thread, request chunk generation
|
* If Server->Thread, request chunk generation
|
||||||
@ -52,7 +44,7 @@ class GenerationManager{
|
|||||||
* int32 chunkX
|
* int32 chunkX
|
||||||
* int32 chunkZ
|
* int32 chunkZ
|
||||||
*/
|
*/
|
||||||
const PACKET_REQUEST_CHUNK = 0x01;
|
const PACKET_REQUEST_CHUNK = 0x00;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Direction: Both
|
* Direction: Both
|
||||||
@ -64,7 +56,7 @@ class GenerationManager{
|
|||||||
* byte[] className
|
* byte[] className
|
||||||
* byte[] chunk (none if generated flag is not set)
|
* byte[] chunk (none if generated flag is not set)
|
||||||
*/
|
*/
|
||||||
const PACKET_SEND_CHUNK = 0x02;
|
const PACKET_SEND_CHUNK = 0x01;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Direction: Server->Thread
|
* Direction: Server->Thread
|
||||||
@ -74,14 +66,14 @@ class GenerationManager{
|
|||||||
* string class that extends pocketmine\level\generator\Generator
|
* string class that extends pocketmine\level\generator\Generator
|
||||||
* byte[] serialized options array
|
* byte[] serialized options array
|
||||||
*/
|
*/
|
||||||
const PACKET_OPEN_LEVEL = 0x03;
|
const PACKET_OPEN_LEVEL = 0x02;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Direction: Server->Thread
|
* Direction: Server->Thread
|
||||||
* byte[] payload:
|
* byte[] payload:
|
||||||
* int32 levelID
|
* int32 levelID
|
||||||
*/
|
*/
|
||||||
const PACKET_CLOSE_LEVEL = 0x04;
|
const PACKET_CLOSE_LEVEL = 0x03;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Direction: Server->Thread
|
* Direction: Server->Thread
|
||||||
@ -256,13 +248,6 @@ class GenerationManager{
|
|||||||
}elseif($pid === self::PACKET_CLOSE_LEVEL){
|
}elseif($pid === self::PACKET_CLOSE_LEVEL){
|
||||||
$levelID = Binary::readInt(substr($packet, $offset, 4));
|
$levelID = Binary::readInt(substr($packet, $offset, 4));
|
||||||
$this->closeLevel($levelID);
|
$this->closeLevel($levelID);
|
||||||
}elseif($pid === self::PACKET_ADD_NAMESPACE){
|
|
||||||
$len = Binary::readShort(substr($packet, $offset, 2));
|
|
||||||
$offset += 2;
|
|
||||||
$namespace = substr($packet, $offset, $len);
|
|
||||||
$offset += $len;
|
|
||||||
$path = substr($packet, $offset);
|
|
||||||
$this->loader->addPath($path);
|
|
||||||
}elseif($pid === self::PACKET_SHUTDOWN){
|
}elseif($pid === self::PACKET_SHUTDOWN){
|
||||||
foreach($this->levels as $level){
|
foreach($this->levels as $level){
|
||||||
$level->shutdown();
|
$level->shutdown();
|
||||||
|
@ -34,17 +34,12 @@ class GenerationRequestManager{
|
|||||||
/** @var GenerationThread */
|
/** @var GenerationThread */
|
||||||
protected $generationThread;
|
protected $generationThread;
|
||||||
|
|
||||||
private $internalThreaded;
|
|
||||||
private $externalThreaded;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Server $server
|
* @param Server $server
|
||||||
*/
|
*/
|
||||||
public function __construct(Server $server){
|
public function __construct(Server $server){
|
||||||
$this->server = $server;
|
$this->server = $server;
|
||||||
$this->internalThreaded = new \Threaded();
|
$this->generationThread = new GenerationThread($server->getLogger(), $server->getLoader());
|
||||||
$this->externalThreaded = new \Threaded();
|
|
||||||
$this->generationThread = new GenerationThread($this->internalThreaded, $this->externalThreaded, $server->getLogger(), $server->getLoader());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -67,9 +62,11 @@ class GenerationRequestManager{
|
|||||||
$this->generationThread->pushMainToThreadPacket($buffer);
|
$this->generationThread->pushMainToThreadPacket($buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
public function addNamespace($namespace, $path){
|
public function addNamespace($namespace, $path){
|
||||||
$buffer = chr(GenerationManager::PACKET_ADD_NAMESPACE) . Binary::writeShort(strlen($namespace)) . $namespace . $path;
|
|
||||||
$this->generationThread->pushMainToThreadPacket($buffer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function sendChunk($levelID, FullChunk $chunk){
|
protected function sendChunk($levelID, FullChunk $chunk){
|
||||||
@ -143,4 +140,4 @@ class GenerationRequestManager{
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -84,8 +84,8 @@ class GenerationThread extends Thread{
|
|||||||
$this->addDependency($loadPaths, new \ReflectionClass($this->loader));
|
$this->addDependency($loadPaths, new \ReflectionClass($this->loader));
|
||||||
$this->loadPaths = array_reverse($loadPaths);
|
$this->loadPaths = array_reverse($loadPaths);
|
||||||
|
|
||||||
$this->externalQueue = $internalThreaded;
|
$this->externalQueue = \ThreadedFactory::create();
|
||||||
$this->internalQueue = $externalThreaded;
|
$this->internalQueue = \ThreadedFactory::create();
|
||||||
|
|
||||||
$this->start();
|
$this->start();
|
||||||
}
|
}
|
||||||
@ -117,4 +117,4 @@ class GenerationThread extends Thread{
|
|||||||
|
|
||||||
$generationManager = new GenerationManager($this, $this->getLogger(), $this->loader);
|
$generationManager = new GenerationManager($this, $this->getLogger(), $this->loader);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -110,9 +110,6 @@ class RakLibInterface implements ServerInstance, SourceInterface{
|
|||||||
private $upload = 0;
|
private $upload = 0;
|
||||||
private $download = 0;
|
private $download = 0;
|
||||||
|
|
||||||
private $internalThreaded;
|
|
||||||
private $externalThreaded;
|
|
||||||
|
|
||||||
public function __construct(Server $server){
|
public function __construct(Server $server){
|
||||||
|
|
||||||
$this->registerPackets();
|
$this->registerPackets();
|
||||||
@ -120,10 +117,7 @@ class RakLibInterface implements ServerInstance, SourceInterface{
|
|||||||
$this->server = $server;
|
$this->server = $server;
|
||||||
$this->identifiers = new \SplObjectStorage();
|
$this->identifiers = new \SplObjectStorage();
|
||||||
|
|
||||||
$this->internalThreaded = new \Threaded();
|
$this->rakLib = new RakLibServer($this->server->getLogger(), $this->server->getLoader(), $this->server->getPort(), $this->server->getIp() === "" ? "0.0.0.0" : $this->server->getIp());
|
||||||
$this->externalThreaded = new \Threaded();
|
|
||||||
|
|
||||||
$this->rakLib = new RakLibServer($this->internalThreaded, $this->externalThreaded, $this->server->getLogger(), $this->server->getLoader(), $this->server->getPort(), $this->server->getIp() === "" ? "0.0.0.0" : $this->server->getIp());
|
|
||||||
$this->interface = new ServerHandler($this->rakLib, $this);
|
$this->interface = new ServerHandler($this->rakLib, $this);
|
||||||
$this->setName($this->server->getMotd());
|
$this->setName($this->server->getMotd());
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ class AsyncPool{
|
|||||||
|
|
||||||
for($i = 0; $i < $this->size; ++$i){
|
for($i = 0; $i < $this->size; ++$i){
|
||||||
$this->workerUsage[$i] = 0;
|
$this->workerUsage[$i] = 0;
|
||||||
$this->workers[$i] = new AsyncWorker();
|
$this->workers[$i] = new AsyncWorker($server->getLoader());
|
||||||
$this->workers[$i]->start();
|
$this->workers[$i]->start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -110,4 +110,4 @@ class AsyncPool{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,20 +25,22 @@ use pocketmine\Worker;
|
|||||||
|
|
||||||
class AsyncWorker extends Worker{
|
class AsyncWorker extends Worker{
|
||||||
|
|
||||||
|
public $loader;
|
||||||
|
|
||||||
|
public function __construct(\ClassLoader $loader){
|
||||||
|
$this->loader = $loader;
|
||||||
|
}
|
||||||
|
|
||||||
public function run(){
|
public function run(){
|
||||||
if(!interface_exists("ClassLoader", false)){
|
if(!interface_exists("ClassLoader", false)){
|
||||||
require(\pocketmine\PATH . "src/spl/ClassLoader.php");
|
require(\pocketmine\PATH . "src/spl/ClassLoader.php");
|
||||||
}
|
|
||||||
if(!class_exists("BaseClassLoader", false)){
|
|
||||||
require(\pocketmine\PATH . "src/spl/BaseClassLoader.php");
|
require(\pocketmine\PATH . "src/spl/BaseClassLoader.php");
|
||||||
|
require(\pocketmine\PATH . "src/pocketmine/CompatibleClassLoader.php");
|
||||||
}
|
}
|
||||||
$autoloader = new \BaseClassLoader();
|
$this->loader->register(true);
|
||||||
$autoloader->addPath(\pocketmine\PATH . "src");
|
|
||||||
$autoloader->addPath(\pocketmine\PATH . "src" . DIRECTORY_SEPARATOR . "spl");
|
|
||||||
$autoloader->register(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function start($options = PTHREADS_INHERIT_NONE){
|
public function start($options = PTHREADS_INHERIT_NONE){
|
||||||
parent::start(PTHREADS_INHERIT_CONSTANTS | PTHREADS_INHERIT_FUNCTIONS);
|
parent::start(PTHREADS_INHERIT_CONSTANTS | PTHREADS_INHERIT_FUNCTIONS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 1f175c18558020477f429bb830325502ff97f10c
|
Subproject commit 7c0888f4ad51c4eb9b695c38691b16aa08522493
|
2
src/spl
2
src/spl
@ -1 +1 @@
|
|||||||
Subproject commit 178d2a38f95d552fa5d91da26edc13a86d8054c6
|
Subproject commit 695451daf403d86e9db11e6119a6c9cef7f85463
|
Loading…
x
Reference in New Issue
Block a user