From dde2e7e66faa16ace79af9aec6488b64f1d8d0b5 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Thu, 3 Dec 2020 19:28:22 +0000 Subject: [PATCH] generation: drop AsyncWorker thread-local storage in favour of a more specialized storage --- src/world/generator/GeneratorRegisterTask.php | 4 +- .../generator/GeneratorUnregisterTask.php | 3 +- src/world/generator/PopulationTask.php | 7 ++- .../generator/ThreadLocalGeneratorContext.php | 63 +++++++++++++++++++ 4 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 src/world/generator/ThreadLocalGeneratorContext.php diff --git a/src/world/generator/GeneratorRegisterTask.php b/src/world/generator/GeneratorRegisterTask.php index 31b038791..62958b60d 100644 --- a/src/world/generator/GeneratorRegisterTask.php +++ b/src/world/generator/GeneratorRegisterTask.php @@ -60,13 +60,11 @@ class GeneratorRegisterTask extends AsyncTask{ public function onRun() : void{ $manager = new SimpleChunkManager($this->worldHeight); - $this->worker->saveToThreadStore("generation.world{$this->worldId}.manager", $manager); - /** * @var Generator $generator * @see Generator::__construct() */ $generator = new $this->generatorClass($this->seed, igbinary_unserialize($this->settings)); - $this->worker->saveToThreadStore("generation.world{$this->worldId}.generator", $generator); + ThreadLocalGeneratorContext::register(new ThreadLocalGeneratorContext($generator, $manager), $this->worldId); } } diff --git a/src/world/generator/GeneratorUnregisterTask.php b/src/world/generator/GeneratorUnregisterTask.php index 5a4d91387..c9022e9e2 100644 --- a/src/world/generator/GeneratorUnregisterTask.php +++ b/src/world/generator/GeneratorUnregisterTask.php @@ -36,7 +36,6 @@ class GeneratorUnregisterTask extends AsyncTask{ } public function onRun() : void{ - $this->worker->removeFromThreadStore("generation.world{$this->worldId}.manager"); - $this->worker->removeFromThreadStore("generation.world{$this->worldId}.generator"); + ThreadLocalGeneratorContext::unregister($this->worldId); } } diff --git a/src/world/generator/PopulationTask.php b/src/world/generator/PopulationTask.php index 9b5d107ce..8c6c22dc6 100644 --- a/src/world/generator/PopulationTask.php +++ b/src/world/generator/PopulationTask.php @@ -72,12 +72,13 @@ class PopulationTask extends AsyncTask{ } public function onRun() : void{ - $manager = $this->worker->getFromThreadStore("generation.world{$this->worldId}.manager"); - $generator = $this->worker->getFromThreadStore("generation.world{$this->worldId}.generator"); - if(!($manager instanceof SimpleChunkManager) or !($generator instanceof Generator)){ + $context = ThreadLocalGeneratorContext::fetch($this->worldId); + if($context === null){ $this->state = false; return; } + $generator = $context->getGenerator(); + $manager = $context->getChunkManager(); /** @var Chunk[] $chunks */ $chunks = []; diff --git a/src/world/generator/ThreadLocalGeneratorContext.php b/src/world/generator/ThreadLocalGeneratorContext.php new file mode 100644 index 000000000..9a240f501 --- /dev/null +++ b/src/world/generator/ThreadLocalGeneratorContext.php @@ -0,0 +1,63 @@ + + */ + private static $contexts = []; + + public static function register(self $context, int $worldId) : void{ + self::$contexts[$worldId] = $context; + } + + public static function unregister(int $worldId) : void{ + unset(self::$contexts[$worldId]); + } + + public static function fetch(int $worldId) : ?self{ + return self::$contexts[$worldId] ?? null; + } + + /** @var Generator */ + private $generator; + /** @var SimpleChunkManager */ + private $chunkManager; + + public function __construct(Generator $generator, SimpleChunkManager $chunkManager){ + $this->generator = $generator; + $this->chunkManager = $chunkManager; + } + + public function getGenerator() : Generator{ return $this->generator; } + + public function getChunkManager() : SimpleChunkManager{ return $this->chunkManager; } +}