From d62e00cc74f2a62b1c4dc98a5fb2056d9b184d7b Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 10 Sep 2018 15:47:12 +0100 Subject: [PATCH] AsyncPool: Remove Server dependency (API breaks included) This brings two plugin-breaking changes: AsyncTask->onCompletion() and AsyncTask->onProgressUpdate() no longer accept Server parameters. This now allows for the functionality of AsyncPool and AsyncTask to be tested outside of a Server. --- src/pocketmine/Server.php | 2 +- .../command/defaults/TimingsCommand.php | 3 +-- .../level/generator/PopulationTask.php | 3 +-- .../level/light/LightPopulationTask.php | 3 +-- src/pocketmine/network/mcpe/ChunkRequestTask.php | 3 +-- .../network/mcpe/CompressBatchTask.php | 3 +-- src/pocketmine/network/mcpe/ProcessLoginTask.php | 5 ++--- src/pocketmine/scheduler/AsyncPool.php | 14 ++++---------- src/pocketmine/scheduler/AsyncTask.php | 16 +++++----------- src/pocketmine/updater/UpdateCheckTask.php | 4 +--- .../tests/AsyncTaskMainLoggerTest.php | 3 +-- 11 files changed, 19 insertions(+), 40 deletions(-) diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 561446996..1af22c6a1 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -1528,7 +1528,7 @@ class Server{ $poolSize = max(1, (int) $poolSize); } - $this->asyncPool = new AsyncPool($this, $poolSize, (int) max(-1, (int) $this->getProperty("memory.async-worker-hard-limit", 256)), $this->autoloader, $this->logger); + $this->asyncPool = new AsyncPool($poolSize, (int) max(-1, (int) $this->getProperty("memory.async-worker-hard-limit", 256)), $this->autoloader, $this->logger); if($this->getProperty("network.batch-threshold", 256) >= 0){ NetworkCompression::$THRESHOLD = (int) $this->getProperty("network.batch-threshold", 256); diff --git a/src/pocketmine/command/defaults/TimingsCommand.php b/src/pocketmine/command/defaults/TimingsCommand.php index 50ff20046..cff8e2298 100644 --- a/src/pocketmine/command/defaults/TimingsCommand.php +++ b/src/pocketmine/command/defaults/TimingsCommand.php @@ -28,7 +28,6 @@ use pocketmine\command\utils\InvalidCommandSyntaxException; use pocketmine\lang\TranslationContainer; use pocketmine\Player; use pocketmine\scheduler\BulkCurlTask; -use pocketmine\Server; use pocketmine\timings\TimingsHandler; use pocketmine\utils\InternetException; @@ -127,7 +126,7 @@ class TimingsCommand extends VanillaCommand{ $this->storeLocal($sender); } - public function onCompletion(Server $server){ + public function onCompletion(){ $sender = $this->fetchLocal(); if($sender instanceof Player and !$sender->isOnline()){ // TODO replace with a more generic API method for checking availability of CommandSender return; diff --git a/src/pocketmine/level/generator/PopulationTask.php b/src/pocketmine/level/generator/PopulationTask.php index 7c469dc08..165bc9ca7 100644 --- a/src/pocketmine/level/generator/PopulationTask.php +++ b/src/pocketmine/level/generator/PopulationTask.php @@ -27,7 +27,6 @@ use pocketmine\level\format\Chunk; use pocketmine\level\Level; use pocketmine\level\SimpleChunkManager; use pocketmine\scheduler\AsyncTask; -use pocketmine\Server; class PopulationTask extends AsyncTask{ @@ -137,7 +136,7 @@ class PopulationTask extends AsyncTask{ } } - public function onCompletion(Server $server) : void{ + public function onCompletion() : void{ /** @var Level $level */ $level = $this->fetchLocal(); if(!$level->isClosed()){ diff --git a/src/pocketmine/level/light/LightPopulationTask.php b/src/pocketmine/level/light/LightPopulationTask.php index 1e6c9f7eb..4902c7d59 100644 --- a/src/pocketmine/level/light/LightPopulationTask.php +++ b/src/pocketmine/level/light/LightPopulationTask.php @@ -26,7 +26,6 @@ namespace pocketmine\level\light; use pocketmine\level\format\Chunk; use pocketmine\level\Level; use pocketmine\scheduler\AsyncTask; -use pocketmine\Server; class LightPopulationTask extends AsyncTask{ @@ -48,7 +47,7 @@ class LightPopulationTask extends AsyncTask{ $this->chunk = $chunk->fastSerialize(); } - public function onCompletion(Server $server){ + public function onCompletion() : void{ /** @var Level $level */ $level = $this->fetchLocal(); if(!$level->isClosed()){ diff --git a/src/pocketmine/network/mcpe/ChunkRequestTask.php b/src/pocketmine/network/mcpe/ChunkRequestTask.php index 885bb44f4..7ea3b5e0d 100644 --- a/src/pocketmine/network/mcpe/ChunkRequestTask.php +++ b/src/pocketmine/network/mcpe/ChunkRequestTask.php @@ -26,7 +26,6 @@ namespace pocketmine\network\mcpe; use pocketmine\level\format\Chunk; use pocketmine\network\mcpe\protocol\FullChunkDataPacket; use pocketmine\scheduler\AsyncTask; -use pocketmine\Server; use pocketmine\tile\Spawnable; class ChunkRequestTask extends AsyncTask{ @@ -75,7 +74,7 @@ class ChunkRequestTask extends AsyncTask{ $this->setResult(NetworkCompression::compress($stream->buffer, $this->compressionLevel), false); } - public function onCompletion(Server $server) : void{ + public function onCompletion() : void{ /** @var CompressBatchPromise $promise */ $promise = $this->fetchLocal(); $promise->resolve($this->getResult()); diff --git a/src/pocketmine/network/mcpe/CompressBatchTask.php b/src/pocketmine/network/mcpe/CompressBatchTask.php index 860460315..a0d1c96de 100644 --- a/src/pocketmine/network/mcpe/CompressBatchTask.php +++ b/src/pocketmine/network/mcpe/CompressBatchTask.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\network\mcpe; use pocketmine\scheduler\AsyncTask; -use pocketmine\Server; class CompressBatchTask extends AsyncTask{ @@ -46,7 +45,7 @@ class CompressBatchTask extends AsyncTask{ $this->setResult(NetworkCompression::compress($this->data, $this->level), false); } - public function onCompletion(Server $server) : void{ + public function onCompletion() : void{ /** @var CompressBatchPromise $promise */ $promise = $this->fetchLocal(); $promise->resolve($this->getResult()); diff --git a/src/pocketmine/network/mcpe/ProcessLoginTask.php b/src/pocketmine/network/mcpe/ProcessLoginTask.php index 256a7a55d..c130e93c0 100644 --- a/src/pocketmine/network/mcpe/ProcessLoginTask.php +++ b/src/pocketmine/network/mcpe/ProcessLoginTask.php @@ -35,7 +35,6 @@ use Mdanter\Ecc\Serializer\Signature\DerSignatureSerializer; use pocketmine\network\mcpe\protocol\LoginPacket; use pocketmine\Player; use pocketmine\scheduler\AsyncTask; -use pocketmine\Server; class ProcessLoginTask extends AsyncTask{ @@ -216,11 +215,11 @@ class ProcessLoginTask extends AsyncTask{ return rtrim(strtr(base64_encode($str), '+/', '-_'), '='); } - public function onCompletion(Server $server) : void{ + public function onCompletion() : void{ /** @var Player $player */ $player = $this->fetchLocal(); if(!$player->isConnected()){ - $server->getLogger()->error("Player " . $player->getName() . " was disconnected before their login could be verified"); + $this->worker->getLogger()->error("Player " . $player->getName() . " was disconnected before their login could be verified"); }elseif($player->setAuthenticationStatus($this->authenticated, $this->error)){ if(!$this->useEncryption){ $player->getNetworkSession()->onLoginSuccess(); diff --git a/src/pocketmine/scheduler/AsyncPool.php b/src/pocketmine/scheduler/AsyncPool.php index 5588a8300..e720e7e85 100644 --- a/src/pocketmine/scheduler/AsyncPool.php +++ b/src/pocketmine/scheduler/AsyncPool.php @@ -23,8 +23,6 @@ declare(strict_types=1); namespace pocketmine\scheduler; -use pocketmine\Server; - /** * Manages general-purpose worker threads used for processing asynchronous tasks, and the tasks submitted to those * workers. @@ -32,9 +30,6 @@ use pocketmine\Server; class AsyncPool{ private const WORKER_START_OPTIONS = PTHREADS_INHERIT_INI | PTHREADS_INHERIT_CONSTANTS; - /** @var Server */ - private $server; - /** @var \ClassLoader */ private $classLoader; /** @var \ThreadedLogger */ @@ -59,8 +54,7 @@ class AsyncPool{ /** @var \Closure[] */ private $workerStartHooks = []; - public function __construct(Server $server, int $size, int $workerMemoryLimit, \ClassLoader $classLoader, \ThreadedLogger $logger){ - $this->server = $server; + public function __construct(int $size, int $workerMemoryLimit, \ClassLoader $classLoader, \ThreadedLogger $logger){ $this->size = $size; $this->workerMemoryLimit = $workerMemoryLimit; $this->classLoader = $classLoader; @@ -259,7 +253,7 @@ class AsyncPool{ } if(count($this->tasks) > 0){ - Server::microSleep(25000); + usleep(25000); } }while(count($this->tasks) > 0); @@ -290,12 +284,12 @@ class AsyncPool{ public function collectTasks() : void{ foreach($this->tasks as $task){ if(!$task->isGarbage()){ - $task->checkProgressUpdates($this->server); + $task->checkProgressUpdates(); } if($task->isGarbage() and !$task->isRunning() and !$task->isCrashed()){ if(!$task->hasCancelledRun()){ try{ - $task->onCompletion($this->server); + $task->onCompletion(); if($task->removeDanglingStoredObjects()){ $this->logger->notice("AsyncTask " . get_class($task) . " stored local complex data but did not remove them after completion"); } diff --git a/src/pocketmine/scheduler/AsyncTask.php b/src/pocketmine/scheduler/AsyncTask.php index 6e4a517d5..021f6cb94 100644 --- a/src/pocketmine/scheduler/AsyncTask.php +++ b/src/pocketmine/scheduler/AsyncTask.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\scheduler; use pocketmine\Collectable; -use pocketmine\Server; /** * Class used to run async tasks in other threads. @@ -174,11 +173,9 @@ abstract class AsyncTask extends Collectable{ * Actions to execute when completed (on main thread) * Implement this if you want to handle the data in your AsyncTask after it has been processed * - * @param Server $server - * * @return void */ - public function onCompletion(Server $server){ + public function onCompletion(){ } @@ -194,13 +191,11 @@ abstract class AsyncTask extends Collectable{ /** * @internal Only call from AsyncPool.php on the main thread - * - * @param Server $server */ - public function checkProgressUpdates(Server $server){ + public function checkProgressUpdates(){ while($this->progressUpdates->count() !== 0){ $progress = $this->progressUpdates->shift(); - $this->onProgressUpdate($server, unserialize($progress)); + $this->onProgressUpdate(unserialize($progress)); } } @@ -209,11 +204,10 @@ abstract class AsyncTask extends Collectable{ * All {@link AsyncTask#publishProgress} calls should result in {@link AsyncTask#onProgressUpdate} calls before * {@link AsyncTask#onCompletion} is called. * - * @param Server $server - * @param mixed $progress The parameter passed to {@link AsyncTask#publishProgress}. It is serialize()'ed + * @param mixed $progress The parameter passed to {@link AsyncTask#publishProgress}. It is serialize()'ed * and then unserialize()'ed, as if it has been cloned. */ - public function onProgressUpdate(Server $server, $progress){ + public function onProgressUpdate($progress){ } diff --git a/src/pocketmine/updater/UpdateCheckTask.php b/src/pocketmine/updater/UpdateCheckTask.php index 1044f9b5c..5c70e4a02 100644 --- a/src/pocketmine/updater/UpdateCheckTask.php +++ b/src/pocketmine/updater/UpdateCheckTask.php @@ -24,9 +24,7 @@ declare(strict_types=1); namespace pocketmine\updater; - use pocketmine\scheduler\AsyncTask; -use pocketmine\Server; use pocketmine\utils\Internet; class UpdateCheckTask extends AsyncTask{ @@ -72,7 +70,7 @@ class UpdateCheckTask extends AsyncTask{ } } - public function onCompletion(Server $server){ + public function onCompletion(){ /** @var AutoUpdater $updater */ $updater = $this->fetchLocal(); if($this->hasResult()){ diff --git a/tests/plugins/TesterPlugin/src/pmmp/TesterPlugin/tests/AsyncTaskMainLoggerTest.php b/tests/plugins/TesterPlugin/src/pmmp/TesterPlugin/tests/AsyncTaskMainLoggerTest.php index 27d3bdc49..11d087f94 100644 --- a/tests/plugins/TesterPlugin/src/pmmp/TesterPlugin/tests/AsyncTaskMainLoggerTest.php +++ b/tests/plugins/TesterPlugin/src/pmmp/TesterPlugin/tests/AsyncTaskMainLoggerTest.php @@ -25,7 +25,6 @@ namespace pmmp\TesterPlugin\tests; use pmmp\TesterPlugin\Test; use pocketmine\scheduler\AsyncTask; -use pocketmine\Server; use pocketmine\utils\MainLogger; class AsyncTaskMainLoggerTest extends Test{ @@ -49,7 +48,7 @@ class AsyncTaskMainLoggerTest extends Test{ ob_end_flush(); } - public function onCompletion(Server $server){ + public function onCompletion(){ /** @var AsyncTaskMainLoggerTest $test */ $test = $this->fetchLocal(); $test->setResult($this->success ? Test::RESULT_OK : Test::RESULT_FAILED);