diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index ca6a5f8c2..1ecff73c9 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -818,9 +818,7 @@ class Server{ } }catch(\Throwable $e){ $this->logger->critical($this->getLanguage()->translateString("pocketmine.data.saveError", [$name, $e->getMessage()])); - if(\pocketmine\DEBUG > 1 and $this->logger instanceof MainLogger){ - $this->logger->logException($e); - } + $this->logger->logException($e); } } @@ -1028,9 +1026,7 @@ class Server{ }catch(\Throwable $e){ $this->logger->error($this->getLanguage()->translateString("pocketmine.level.loadError", [$name, $e->getMessage()])); - if($this->logger instanceof MainLogger){ - $this->logger->logException($e); - } + $this->logger->logException($e); return false; } @@ -1087,9 +1083,7 @@ class Server{ $level->setTickRate($this->baseTickRate); }catch(\Throwable $e){ $this->logger->error($this->getLanguage()->translateString("pocketmine.level.generateError", [$name, $e->getMessage()])); - if($this->logger instanceof MainLogger){ - $this->logger->logException($e); - } + $this->logger->logException($e); return false; } @@ -2068,9 +2062,7 @@ class Server{ $errfile = cleanPath($errfile); - if($this->logger instanceof MainLogger){ - $this->logger->logException($e, $trace); - } + $this->logger->logException($e, $trace); $lastError = [ "type" => $type, @@ -2281,9 +2273,7 @@ class Server{ } }catch(\Throwable $e){ $this->logger->critical($this->getLanguage()->translateString("pocketmine.level.tickError", [$level->getName(), $e->getMessage()])); - if(\pocketmine\DEBUG > 1 and $this->logger instanceof MainLogger){ - $this->logger->logException($e); - } + $this->logger->logException($e); } } } @@ -2376,9 +2366,7 @@ class Server{ } }catch(\Throwable $e){ if(\pocketmine\DEBUG > 1){ - if($this->logger instanceof MainLogger){ - $this->logger->logException($e); - } + $this->logger->logException($e); } $this->getNetwork()->blockAddress($address, 600); @@ -2433,9 +2421,7 @@ class Server{ $this->queryHandler->regenerateInfo(); } }catch(\Throwable $e){ - if($this->logger instanceof MainLogger){ - $this->logger->logException($e); - } + $this->logger->logException($e); } } diff --git a/src/pocketmine/command/FormattedCommandAlias.php b/src/pocketmine/command/FormattedCommandAlias.php index dbbe23d77..1e448c04d 100644 --- a/src/pocketmine/command/FormattedCommandAlias.php +++ b/src/pocketmine/command/FormattedCommandAlias.php @@ -51,10 +51,7 @@ class FormattedCommandAlias extends Command{ $sender->sendMessage(TextFormat::RED . $e->getMessage()); }else{ $sender->sendMessage(new TranslationContainer(TextFormat::RED . "%commands.generic.exception")); - $logger = $sender->getServer()->getLogger(); - if($logger instanceof MainLogger){ - $logger->logException($e); - } + $sender->getServer()->getLogger()->logException($e); } return false; diff --git a/src/pocketmine/command/SimpleCommandMap.php b/src/pocketmine/command/SimpleCommandMap.php index 0e17b80fc..44a2e0030 100644 --- a/src/pocketmine/command/SimpleCommandMap.php +++ b/src/pocketmine/command/SimpleCommandMap.php @@ -196,10 +196,7 @@ class SimpleCommandMap implements CommandMap{ }catch(\Throwable $e){ $sender->sendMessage(new TranslationContainer(TextFormat::RED . "%commands.generic.exception")); $this->server->getLogger()->critical($this->server->getLanguage()->translateString("pocketmine.command.exception", [$commandLine, (string) $target, $e->getMessage()])); - $logger = $sender->getServer()->getLogger(); - if($logger instanceof MainLogger){ - $logger->logException($e); - } + $sender->getServer()->getLogger()->logException($e); } $target->timings->stopTiming(); diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index f2f48f43c..8ac8b04b2 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -2566,9 +2566,7 @@ class Level implements ChunkManager, Metadatable{ }catch(\Throwable $e){ $logger = $this->server->getLogger(); $logger->error($this->server->getLanguage()->translateString("pocketmine.level.chunkUnloadError", [$e->getMessage()])); - if($logger instanceof MainLogger){ - $logger->logException($e); - } + $logger->logException($e); } unset($this->chunks[$index]); diff --git a/src/pocketmine/level/generator/GeneratorRegisterTask.php b/src/pocketmine/level/generator/GeneratorRegisterTask.php index 38ba77404..1828787d5 100644 --- a/src/pocketmine/level/generator/GeneratorRegisterTask.php +++ b/src/pocketmine/level/generator/GeneratorRegisterTask.php @@ -39,7 +39,7 @@ class GeneratorRegisterTask extends AsyncTask{ public function __construct(Level $level, Generator $generator){ $this->generator = get_class($generator); - $this->settings = $generator->getSettings(); + $this->settings = serialize($generator->getSettings()); $this->seed = $level->getSeed(); $this->levelId = $level->getId(); } @@ -51,7 +51,7 @@ class GeneratorRegisterTask extends AsyncTask{ $this->saveToThreadStore("generation.level{$this->levelId}.manager", $manager); /** @var Generator $generator */ $generator = $this->generator; - $generator = new $generator($this->settings); + $generator = new $generator(unserialize($this->settings)); $generator->init($manager, new Random($manager->getSeed())); $this->saveToThreadStore("generation.level{$this->levelId}.generator", $generator); } diff --git a/src/pocketmine/network/Network.php b/src/pocketmine/network/Network.php index 5a6b6f38f..4e8951d6c 100644 --- a/src/pocketmine/network/Network.php +++ b/src/pocketmine/network/Network.php @@ -141,9 +141,7 @@ class Network{ }catch(\Throwable $e){ $logger = $this->server->getLogger(); if(\pocketmine\DEBUG > 1){ - if($logger instanceof MainLogger){ - $logger->logException($e); - } + $logger->logException($e); } $interface->emergencyShutdown(); @@ -237,10 +235,8 @@ class Network{ }catch(\Throwable $e){ if(\pocketmine\DEBUG > 1){ $logger = $this->server->getLogger(); - if($logger instanceof MainLogger){ - $logger->debug("BatchPacket " . " 0x" . bin2hex($packet->payload)); - $logger->logException($e); - } + $logger->debug("BatchPacket " . " 0x" . bin2hex($packet->payload)); + $logger->logException($e); } } } diff --git a/src/pocketmine/network/RakLibInterface.php b/src/pocketmine/network/RakLibInterface.php index d4907ad10..bd3cc0072 100644 --- a/src/pocketmine/network/RakLibInterface.php +++ b/src/pocketmine/network/RakLibInterface.php @@ -139,10 +139,8 @@ class RakLibInterface implements ServerInstance, AdvancedSourceInterface{ }catch(\Throwable $e){ if(\pocketmine\DEBUG > 1 and isset($pk)){ $logger = $this->server->getLogger(); - if($logger instanceof MainLogger){ - $logger->debug("Packet " . get_class($pk) . " 0x" . bin2hex($packet->buffer)); - $logger->logException($e); - } + $logger->debug("Packet " . get_class($pk) . " 0x" . bin2hex($packet->buffer)); + $logger->logException($e); } if(isset($this->players[$identifier])){ diff --git a/src/pocketmine/plugin/PluginManager.php b/src/pocketmine/plugin/PluginManager.php index e52844782..eb15baf54 100644 --- a/src/pocketmine/plugin/PluginManager.php +++ b/src/pocketmine/plugin/PluginManager.php @@ -251,10 +251,7 @@ class PluginManager{ } }catch(\Throwable $e){ $this->server->getLogger()->error($this->server->getLanguage()->translateString("pocketmine.plugin.fileError", [$file, $directory, $e->getMessage()])); - $logger = $this->server->getLogger(); - if($logger instanceof MainLogger){ - $logger->logException($e); - } + $this->server->getLogger()->logException($e); } } } @@ -564,10 +561,7 @@ class PluginManager{ } $plugin->getPluginLoader()->enablePlugin($plugin); }catch(\Throwable $e){ - $logger = Server::getInstance()->getLogger(); - if($logger instanceof MainLogger){ - $logger->logException($e); - } + $this->server->getLogger()->logException($e); $this->disablePlugin($plugin); } } @@ -638,10 +632,7 @@ class PluginManager{ try{ $plugin->getPluginLoader()->disablePlugin($plugin); }catch(\Throwable $e){ - $logger = Server::getInstance()->getLogger(); - if($logger instanceof MainLogger){ - $logger->logException($e); - } + $this->server->getLogger()->logException($e); } $this->server->getScheduler()->cancelTasks($plugin); @@ -682,10 +673,7 @@ class PluginManager{ $e->getMessage(), get_class($registration->getListener()) ])); - $logger = $this->server->getLogger(); - if($logger instanceof MainLogger){ - $logger->logException($e); - } + $this->server->getLogger()->logException($e); } } } diff --git a/src/pocketmine/scheduler/AsyncPool.php b/src/pocketmine/scheduler/AsyncPool.php index 9f288011e..50022ec97 100644 --- a/src/pocketmine/scheduler/AsyncPool.php +++ b/src/pocketmine/scheduler/AsyncPool.php @@ -47,7 +47,7 @@ class AsyncPool{ for($i = 0; $i < $this->size; ++$i){ $this->workerUsage[$i] = 0; - $this->workers[$i] = new AsyncWorker; + $this->workers[$i] = new AsyncWorker($this->server->getLogger(), $i); $this->workers[$i]->setClassLoader($this->server->getLoader()); $this->workers[$i]->start(); } @@ -62,7 +62,7 @@ class AsyncPool{ if($newSize > $this->size){ for($i = $this->size; $i < $newSize; ++$i){ $this->workerUsage[$i] = 0; - $this->workers[$i] = new AsyncWorker; + $this->workers[$i] = new AsyncWorker($this->server->getLogger(), $i); $this->workers[$i]->setClassLoader($this->server->getLoader()); $this->workers[$i]->start(); } @@ -142,16 +142,16 @@ class AsyncPool{ Timings::$schedulerAsyncTimer->startTiming(); foreach($this->tasks as $task){ - if($task->isGarbage() and !$task->isRunning()){ + if($task->isGarbage() and !$task->isRunning() and !$task->isCrashed()){ if(!$task->hasCancelledRun()){ $task->onCompletion($this->server); } $this->removeTask($task); - }elseif($task->isTerminated()){ - $this->removeTask($task, true); + }elseif($task->isTerminated() or $task->isCrashed()){ $this->server->getLogger()->critical("Could not execute asynchronous task " . (new \ReflectionClass($task))->getShortName() . ": Task crashed"); + $this->removeTask($task, true); } } diff --git a/src/pocketmine/scheduler/AsyncTask.php b/src/pocketmine/scheduler/AsyncTask.php index 1a2a24042..6f3d85a37 100644 --- a/src/pocketmine/scheduler/AsyncTask.php +++ b/src/pocketmine/scheduler/AsyncTask.php @@ -39,16 +39,27 @@ abstract class AsyncTask extends \Collectable{ /** @var int */ private $taskId = null; + private $crashed = false; + public function run(){ $this->result = null; if($this->cancelRun !== true){ - $this->onRun(); + try{ + $this->onRun(); + }catch(\Throwable $e){ + $this->crashed = true; + $this->worker->handleException($e); + } } $this->setGarbage(); } + public function isCrashed(){ + return $this->crashed; + } + /** * @return mixed */ diff --git a/src/pocketmine/scheduler/AsyncWorker.php b/src/pocketmine/scheduler/AsyncWorker.php index d9d38d6f2..0f77c96d4 100644 --- a/src/pocketmine/scheduler/AsyncWorker.php +++ b/src/pocketmine/scheduler/AsyncWorker.php @@ -25,6 +25,14 @@ use pocketmine\Worker; class AsyncWorker extends Worker{ + private $logger; + private $id; + + public function __construct(\ThreadedLogger $logger, $id){ + $this->logger = $logger; + $this->id = $id; + } + public function run(){ $this->registerClassLoader(); gc_enable(); @@ -32,14 +40,13 @@ class AsyncWorker extends Worker{ global $store; $store = []; - } - public function start(int $options = PTHREADS_INHERIT_NONE){ - parent::start(PTHREADS_INHERIT_CONSTANTS | PTHREADS_INHERIT_FUNCTIONS); + public function handleException(\Throwable $e){ + $this->logger->logException($e); } public function getThreadName(){ - return "Asynchronous Worker"; + return "Asynchronous Worker #" . $this->id; } } diff --git a/src/pocketmine/scheduler/SendUsageTask.php b/src/pocketmine/scheduler/SendUsageTask.php index 179340e38..686ba6d62 100644 --- a/src/pocketmine/scheduler/SendUsageTask.php +++ b/src/pocketmine/scheduler/SendUsageTask.php @@ -26,7 +26,6 @@ use pocketmine\Server; use pocketmine\utils\Utils; use pocketmine\utils\UUID; use pocketmine\utils\VersionString; -use pocketmine\utils\UUID; class SendUsageTask extends AsyncTask{ diff --git a/src/pocketmine/scheduler/ServerScheduler.php b/src/pocketmine/scheduler/ServerScheduler.php index 4c5503306..6d37ac088 100644 --- a/src/pocketmine/scheduler/ServerScheduler.php +++ b/src/pocketmine/scheduler/ServerScheduler.php @@ -249,10 +249,7 @@ class ServerScheduler{ $task->run($this->currentTick); }catch(\Throwable $e){ Server::getInstance()->getLogger()->critical("Could not execute task " . $task->getTaskName() . ": " . $e->getMessage()); - $logger = Server::getInstance()->getLogger(); - if($logger instanceof MainLogger){ - $logger->logException($e); - } + Server::getInstance()->getLogger()->logException($e); } $task->timings->stopTiming(); } diff --git a/src/pocketmine/utils/Config.php b/src/pocketmine/utils/Config.php index 9db96f436..8039e2a8b 100644 --- a/src/pocketmine/utils/Config.php +++ b/src/pocketmine/utils/Config.php @@ -210,7 +210,7 @@ class Config{ }catch(\Throwable $e){ $logger = Server::getInstance()->getLogger(); $logger->critical("Could not save Config " . $this->file . ": " . $e->getMessage()); - if(\pocketmine\DEBUG > 1 and $logger instanceof MainLogger){ + if(\pocketmine\DEBUG > 1){ $logger->logException($e); } } diff --git a/src/spl b/src/spl index 82034afea..3cd1f13c5 160000 --- a/src/spl +++ b/src/spl @@ -1 +1 @@ -Subproject commit 82034afea351b0dbf8b1f9ad41cde9b9de3e1da6 +Subproject commit 3cd1f13c5d4937a5de1978d1950589082df760d2