From e0d5c79848335ae9335686fd896e593324f2b191 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 27 Feb 2018 11:33:16 +0000 Subject: [PATCH] Scheduler: Catch exceptions thrown from AsyncTask->onCompletion() --- src/pocketmine/scheduler/AsyncPool.php | 13 +++++++++++-- src/pocketmine/scheduler/ServerScheduler.php | 3 ++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/pocketmine/scheduler/AsyncPool.php b/src/pocketmine/scheduler/AsyncPool.php index b13a687a2..15e115297 100644 --- a/src/pocketmine/scheduler/AsyncPool.php +++ b/src/pocketmine/scheduler/AsyncPool.php @@ -159,8 +159,17 @@ class AsyncPool{ } if($task->isGarbage() and !$task->isRunning() and !$task->isCrashed()){ if(!$task->hasCancelledRun()){ - $task->onCompletion($this->server); - $this->server->getScheduler()->removeLocalComplex($task); + try{ + $task->onCompletion($this->server); + if(!$this->server->getScheduler()->removeLocalComplex($task)){ + $this->server->getLogger()->notice("AsyncTask " . get_class($task) . " stored local complex data but did not remove them after completion"); + } + }catch(\Throwable $e){ + $this->server->getLogger()->critical("Could not execute completion of asychronous task " . (new \ReflectionClass($task))->getShortName() . ": " . $e->getMessage()); + $this->server->getLogger()->logException($e); + + $this->server->getScheduler()->removeLocalComplex($task); //silent + } } $this->removeTask($task); diff --git a/src/pocketmine/scheduler/ServerScheduler.php b/src/pocketmine/scheduler/ServerScheduler.php index 15932a010..103824bee 100644 --- a/src/pocketmine/scheduler/ServerScheduler.php +++ b/src/pocketmine/scheduler/ServerScheduler.php @@ -174,10 +174,11 @@ class ServerScheduler{ */ public function removeLocalComplex(AsyncTask $for) : bool{ if(isset($this->objectStore[$for])){ - Server::getInstance()->getLogger()->notice("AsyncTask " . get_class($for) . " stored local complex data but did not remove them after completion"); unset($this->objectStore[$for]); + return false; } + return true; }