diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index f0e367c01..38cadbb81 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -2269,6 +2269,8 @@ class Level implements ChunkManager, Metadatable{ } } + $this->provider->doGarbageCollection(); + $this->timings->doChunkGC->stopTiming(); } diff --git a/src/pocketmine/level/format/LevelProvider.php b/src/pocketmine/level/format/LevelProvider.php index f61e86431..2c0b1300f 100644 --- a/src/pocketmine/level/format/LevelProvider.php +++ b/src/pocketmine/level/format/LevelProvider.php @@ -218,6 +218,8 @@ interface LevelProvider{ */ public function getLoadedChunks(); + public function doGarbageCollection(); + /** * @return Level */ diff --git a/src/pocketmine/level/format/anvil/RegionLoader.php b/src/pocketmine/level/format/anvil/RegionLoader.php index 215ccdd24..90a368417 100644 --- a/src/pocketmine/level/format/anvil/RegionLoader.php +++ b/src/pocketmine/level/format/anvil/RegionLoader.php @@ -50,6 +50,8 @@ class RegionLoader extends \pocketmine\level\format\mcregion\RegionLoader{ }else{ $this->loadLocationTable(); } + + $this->lastUsed = time(); } public function readChunk($x, $z, $generate = true, $forward = false){ @@ -58,6 +60,8 @@ class RegionLoader extends \pocketmine\level\format\mcregion\RegionLoader{ return null; } + $this->lastUsed = time(); + if(!$this->isChunkGenerated($index)){ if($generate === true){ //Allocate space diff --git a/src/pocketmine/level/format/generic/BaseLevelProvider.php b/src/pocketmine/level/format/generic/BaseLevelProvider.php index ac46e8f28..b77878f3f 100644 --- a/src/pocketmine/level/format/generic/BaseLevelProvider.php +++ b/src/pocketmine/level/format/generic/BaseLevelProvider.php @@ -105,6 +105,10 @@ abstract class BaseLevelProvider implements LevelProvider{ $this->levelData->SpawnZ = new Int("SpawnZ", (int) $pos->z); } + public function doGarbageCollection(){ + + } + /** * @return Compound */ diff --git a/src/pocketmine/level/format/mcregion/McRegion.php b/src/pocketmine/level/format/mcregion/McRegion.php index 40217493c..9ce75338e 100644 --- a/src/pocketmine/level/format/mcregion/McRegion.php +++ b/src/pocketmine/level/format/mcregion/McRegion.php @@ -174,6 +174,16 @@ class McRegion extends BaseLevelProvider{ } } + public function doGarbageCollection(){ + $limit = time() - 300; + foreach($this->regions as $index => $region){ + if($region->lastUsed <= $limit){ + $region->close(); + unset($this->regions[$index]); + } + } + } + public function loadChunk($chunkX, $chunkZ, $create = false){ $index = Level::chunkHash($chunkX, $chunkZ); if(isset($this->chunks[$index])){ diff --git a/src/pocketmine/level/format/mcregion/RegionLoader.php b/src/pocketmine/level/format/mcregion/RegionLoader.php index feec6fb61..7745dbb13 100644 --- a/src/pocketmine/level/format/mcregion/RegionLoader.php +++ b/src/pocketmine/level/format/mcregion/RegionLoader.php @@ -50,6 +50,8 @@ class RegionLoader{ protected $levelProvider; protected $locationTable = []; + public $lastUsed; + public function __construct(LevelProvider $level, $regionX, $regionZ){ $this->x = $regionX; $this->z = $regionZ; @@ -65,6 +67,8 @@ class RegionLoader{ }else{ $this->loadLocationTable(); } + + $this->lastUsed = time(); } public function __destruct(){ @@ -84,6 +88,8 @@ class RegionLoader{ return null; } + $this->lastUsed = time(); + if(!$this->isChunkGenerated($index)){ if($generate === true){ //Allocate space @@ -197,6 +203,7 @@ class RegionLoader{ } public function writeChunk(FullChunk $chunk){ + $this->lastUsed = time(); $chunkData = $chunk->toBinary(); if($chunkData !== false){ $this->saveChunk($chunk->getX() - ($this->getX() * 32), $chunk->getZ() - ($this->getZ() * 32), $chunkData);