From 93b76203647e6c01e4827fc4512ef19f4007943f Mon Sep 17 00:00:00 2001 From: Emagi Date: Tue, 1 Jul 2025 07:54:58 -0400 Subject: [PATCH] Need to also track the not deleted to re-add after attempting a DeleteSpawns loop, need to also release the read lock if we continue --- source/WorldServer/zoneserver.cpp | 46 +++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/source/WorldServer/zoneserver.cpp b/source/WorldServer/zoneserver.cpp index acfbc2d..5bf54ce 100644 --- a/source/WorldServer/zoneserver.cpp +++ b/source/WorldServer/zoneserver.cpp @@ -1504,26 +1504,35 @@ void ZoneServer::AddPendingDelete(Spawn* spawn) { } void ZoneServer::DeleteSpawns(bool delete_all) { - // 1) Snapshot & clear delete‐list - MSpawnDeleteList.writelock(__FUNCTION__, __LINE__); - std::vector> to_process( - spawn_delete_list.begin(), spawn_delete_list.end() - ); - spawn_delete_list.clear(); - MSpawnDeleteList.releasewritelock(__FUNCTION__, __LINE__); + // 1) Snapshot & clear delete‐list + MSpawnDeleteList.writelock(__FUNCTION__, __LINE__); + std::vector> to_process( + spawn_delete_list.begin(), spawn_delete_list.end() + ); + spawn_delete_list.clear(); + MSpawnDeleteList.releasewritelock(__FUNCTION__, __LINE__); + // Prepare a list of entries we’ll need to keep around + std::vector> to_keep; + to_keep.reserve(to_process.size()); + MSpawnList.writelock(__FUNCTION__, __LINE__); - int32 current_time = Timer::GetCurrentTime2(); - for (auto &entry : to_process) { - Spawn* spawn = entry.first; - int32 when = entry.second; + int32 current_time = Timer::GetCurrentTime2(); + for (auto &entry : to_process) { + Spawn* spawn = entry.first; + int32 when = entry.second; - if (!delete_all && current_time < when) - continue; + if (!delete_all && current_time < when) { + to_keep.emplace_back(entry); + continue; + } MPendingSpawnRemoval.readlock(__FUNCTION__, __LINE__); - if(!delete_all && m_pendingSpawnRemove.count(spawn->GetID())) + if(!delete_all && m_pendingSpawnRemove.count(spawn->GetID())) { + to_keep.emplace_back(entry); + MPendingSpawnRemoval.releasereadlock(__FUNCTION__, __LINE__); continue; + } MPendingSpawnRemoval.releasereadlock(__FUNCTION__, __LINE__); lua_interface->SetLuaUserDataStale(spawn); @@ -1565,6 +1574,15 @@ void ZoneServer::DeleteSpawns(bool delete_all) { safe_delete(spawn); } MSpawnList.releasewritelock(__FUNCTION__, __LINE__); + + // Add all the kept entries + if (!to_keep.empty()) { + MSpawnDeleteList.writelock(__FUNCTION__, __LINE__); + for (auto &kv : to_keep) { + spawn_delete_list.emplace(kv.first, kv.second); + } + MSpawnDeleteList.releasewritelock(__FUNCTION__, __LINE__); + } } void ZoneServer::AddDamagedSpawn(Spawn* spawn){