Fix /logout hang caused by blocking worker thread joins

unloadAll() joins worker threads which blocks if they're mid-tile
(prepareTile can take seconds for heavy ADTs). Replace with softReset()
which clears tile data, queues, and water surfaces without stopping
worker threads — workers find empty queues and idle naturally.
This commit is contained in:
Kelsi 2026-02-25 13:37:09 -08:00
parent 872b10fe68
commit 26a685187e
3 changed files with 30 additions and 2 deletions

View file

@ -1296,6 +1296,32 @@ void TerrainManager::unloadAll() {
}
}
void TerrainManager::softReset() {
// Clear queues (workers may still be running — they'll find empty queues)
{
std::lock_guard<std::mutex> lock(queueMutex);
loadQueue.clear();
while (!readyQueue.empty()) readyQueue.pop();
}
pendingTiles.clear();
finalizingTiles_.clear();
placedDoodadIds.clear();
LOG_INFO("Soft-resetting terrain (clearing tiles + water, workers stay alive)");
loadedTiles.clear();
failedTiles.clear();
currentTile = {-1, -1};
lastStreamTile = {-1, -1};
if (terrainRenderer) {
terrainRenderer->clear();
}
if (waterRenderer) {
waterRenderer->clear();
}
}
TileCoord TerrainManager::worldToTile(float glX, float glY) const {
auto [tileX, tileY] = core::coords::worldToTile(glX, glY);
return {tileX, tileY};