diff --git a/src/pocketmine/PocketMine.php b/src/pocketmine/PocketMine.php index 212da78d8..a03c1004f 100644 --- a/src/pocketmine/PocketMine.php +++ b/src/pocketmine/PocketMine.php @@ -174,6 +174,7 @@ namespace pocketmine { date_default_timezone_set("UTC"); $logger = new MainLogger(\pocketmine\DATA . "server.log"); + $logger->registerStatic(); if(!ini_get("date.timezone")){ if(($timezone = detect_system_timezone()) and date_default_timezone_set($timezone)){ diff --git a/src/pocketmine/scheduler/AsyncTask.php b/src/pocketmine/scheduler/AsyncTask.php index 8a66fd412..49321666d 100644 --- a/src/pocketmine/scheduler/AsyncTask.php +++ b/src/pocketmine/scheduler/AsyncTask.php @@ -25,6 +25,7 @@ namespace pocketmine\scheduler; use pocketmine\Collectable; use pocketmine\Server; +use pocketmine\utils\MainLogger; /** * Class used to run async tasks in other threads. diff --git a/src/pocketmine/scheduler/AsyncWorker.php b/src/pocketmine/scheduler/AsyncWorker.php index e6e2c2037..5339c84e5 100644 --- a/src/pocketmine/scheduler/AsyncWorker.php +++ b/src/pocketmine/scheduler/AsyncWorker.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace pocketmine\scheduler; +use pocketmine\utils\MainLogger; use pocketmine\Worker; class AsyncWorker extends Worker{ @@ -30,13 +31,17 @@ class AsyncWorker extends Worker{ private $logger; private $id; - public function __construct(\ThreadedLogger $logger, $id){ + public function __construct(MainLogger $logger, $id){ $this->logger = $logger; $this->id = $id; } public function run(){ $this->registerClassLoader(); + if(MainLogger::getLogger() === null){ + $this->logger->registerStatic(); + } + gc_enable(); ini_set("memory_limit", '-1'); diff --git a/src/pocketmine/utils/MainLogger.php b/src/pocketmine/utils/MainLogger.php index 3019be4eb..3cad79782 100644 --- a/src/pocketmine/utils/MainLogger.php +++ b/src/pocketmine/utils/MainLogger.php @@ -46,7 +46,6 @@ class MainLogger extends \AttachableThreadedLogger{ if(static::$logger instanceof MainLogger){ throw new \RuntimeException("MainLogger has been already created"); } - static::$logger = $this; touch($logFile); $this->logFile = $logFile; $this->logDebug = (bool) $logDebug; @@ -55,12 +54,24 @@ class MainLogger extends \AttachableThreadedLogger{ } /** - * @return MainLogger + * @return MainLogger|null */ public static function getLogger(){ return static::$logger; } + /** + * Assigns the MainLogger instance to the {@link MainLogger#logger} static property. Because static properties are + * thread-local, this must be called from the body of every Thread if you want the logger to be accessible via + * {@link MainLogger#getLogger}. + */ + public function registerStatic(){ + if(static::$logger instanceof MainLogger){ + throw new \RuntimeException("MainLogger has been already registered"); + } + static::$logger = $this; + } + public function emergency($message){ $this->send($message, \LogLevel::EMERGENCY, "EMERGENCY", TextFormat::RED); }