Removed global ServerScheduler - plugins now get their own isolated schedulers

This change breaks pretty much all API pertaining to synchronous task scheduling.

Significant changes:
- Server->getScheduler() has been removed
- Plugin->getScheduler() has been added - every plugin now has its own scheduler
- Because schedulers are now per-plugin, it is now unnecessary for PluginTask to exist because stopping plugin tasks on plugin disable is as simple as destroying the plugin's scheduler. Therefore PluginTask has now been removed and it is expected for things to now use the base Task class instead.

For the most part, plugins will simply need to change Plugin->getServer()->getScheduler()->... to Plugin->getScheduler()->...
Another highlight is that plugin tasks now no longer have global IDs - they are unique to each scheduler.
This commit is contained in:
Dylan K. Taylor
2018-05-30 14:11:11 +01:00
parent 132746aa3d
commit 51f43fb375
9 changed files with 61 additions and 118 deletions

View File

@ -27,6 +27,7 @@ declare(strict_types=1);
namespace pocketmine\plugin;
use pocketmine\command\CommandExecutor;
use pocketmine\scheduler\TaskScheduler;
use pocketmine\Server;
use pocketmine\utils\Config;
@ -136,4 +137,9 @@ interface Plugin extends CommandExecutor{
*/
public function getPluginLoader();
/**
* @return TaskScheduler
*/
public function getScheduler() : TaskScheduler;
}

View File

@ -26,6 +26,7 @@ namespace pocketmine\plugin;
use pocketmine\command\Command;
use pocketmine\command\CommandSender;
use pocketmine\command\PluginIdentifiableCommand;
use pocketmine\scheduler\TaskScheduler;
use pocketmine\Server;
use pocketmine\utils\Config;
@ -58,6 +59,9 @@ abstract class PluginBase implements Plugin{
/** @var PluginLogger */
private $logger;
/** @var TaskScheduler */
private $scheduler;
/**
* Called when the plugin is loaded, before calling onEnable()
*/
@ -119,6 +123,7 @@ abstract class PluginBase implements Plugin{
$this->file = rtrim($file, "\\/") . "/";
$this->configFile = $this->dataFolder . "config.yml";
$this->logger = new PluginLogger($this);
$this->scheduler = new TaskScheduler($this->logger);
}
}
@ -305,4 +310,10 @@ abstract class PluginBase implements Plugin{
return $this->loader;
}
/**
* @return TaskScheduler
*/
public function getScheduler() : TaskScheduler{
return $this->scheduler;
}
}

View File

@ -657,7 +657,7 @@ class PluginManager{
$this->server->getLogger()->logException($e);
}
$this->server->getScheduler()->cancelTasks($plugin);
$plugin->getScheduler()->shutdown();
HandlerList::unregisterAll($plugin);
foreach($plugin->getDescription()->getPermissions() as $perm){
$this->removePermission($perm);
@ -665,6 +665,14 @@ class PluginManager{
}
}
public function tickSchedulers(int $currentTick) : void{
foreach($this->plugins as $p){
if($p->isEnabled()){
$p->getScheduler()->mainThreadHeartbeat($currentTick);
}
}
}
public function clearPlugins(){
$this->disablePlugins();
$this->plugins = [];