diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/database/Database/Transaction.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/Globals/ObjectAccessor.cpp | 8 | ||||
| -rw-r--r-- | src/server/game/Instances/InstanceLockMgr.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Loot/LootItemStorage.cpp | 12 | ||||
| -rw-r--r-- | src/server/game/Maps/DynamicMMapTileBuilder.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/Maps/MapManager.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Maps/MapUpdater.cpp | 25 | ||||
| -rw-r--r-- | src/server/game/Maps/MapUpdater.h | 7 | ||||
| -rw-r--r-- | src/server/game/Maps/TerrainMgr.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/PacketLog.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.cpp | 17 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSocket.cpp | 8 | ||||
| -rw-r--r-- | src/server/game/World/World.cpp | 4 | ||||
| -rw-r--r-- | src/server/shared/Realm/RealmList.cpp | 8 | ||||
| -rw-r--r-- | src/server/shared/Secrets/SecretMgr.cpp | 6 | ||||
| -rw-r--r-- | src/server/shared/Secrets/SecretMgr.h | 2 |
16 files changed, 55 insertions, 66 deletions
diff --git a/src/server/database/Database/Transaction.cpp b/src/server/database/Database/Transaction.cpp index addab661df0..565fe20c7db 100644 --- a/src/server/database/Database/Transaction.cpp +++ b/src/server/database/Database/Transaction.cpp @@ -24,7 +24,7 @@ #include <mysqld_error.h> #include <sstream> #include <thread> -#include <cstring> +#include <utility> std::mutex TransactionTask::_deadlockLock; @@ -73,7 +73,7 @@ bool TransactionTask::Execute(MySQLConnection* conn, std::shared_ptr<Transaction }(); // Make sure only 1 async thread retries a transaction so they don't keep dead-locking each other - std::lock_guard<std::mutex> lock(_deadlockLock); + std::scoped_lock lock(_deadlockLock); for (uint32 loopDuration = 0, startMSTime = getMSTime(); loopDuration <= DEADLOCK_MAX_RETRY_TIME_MS; loopDuration = GetMSTimeDiffToNow(startMSTime)) { @@ -94,7 +94,7 @@ bool TransactionTask::Execute(MySQLConnection* conn, std::shared_ptr<Transaction int TransactionTask::TryExecute(MySQLConnection* conn, std::shared_ptr<TransactionBase> trans) { - return conn->ExecuteTransaction(trans); + return conn->ExecuteTransaction(std::move(trans)); } bool TransactionCallback::InvokeIfReady() diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp index 520d52b65cf..46ec6c5e75a 100644 --- a/src/server/game/Globals/ObjectAccessor.cpp +++ b/src/server/game/Globals/ObjectAccessor.cpp @@ -35,7 +35,7 @@ void HashMapHolder<T>::Insert(T* o) static_assert(std::is_same<Player, T>::value, "Only Player can be registered in global HashMapHolder"); - std::unique_lock<std::shared_mutex> lock(*GetLock()); + std::scoped_lock lock(*GetLock()); GetContainer()[o->GetGUID()] = o; } @@ -43,7 +43,7 @@ void HashMapHolder<T>::Insert(T* o) template<class T> void HashMapHolder<T>::Remove(T* o) { - std::unique_lock<std::shared_mutex> lock(*GetLock()); + std::scoped_lock lock(*GetLock()); GetContainer().erase(o->GetGUID()); } @@ -51,7 +51,7 @@ void HashMapHolder<T>::Remove(T* o) template<class T> T* HashMapHolder<T>::Find(ObjectGuid guid) { - std::shared_lock<std::shared_mutex> lock(*GetLock()); + std::shared_lock lock(*GetLock()); typename MapType::iterator itr = GetContainer().find(guid); return (itr != GetContainer().end()) ? itr->second : nullptr; @@ -290,7 +290,7 @@ HashMapHolder<Player>::MapType const& ObjectAccessor::GetPlayers() void ObjectAccessor::SaveAllPlayers() { - std::shared_lock<std::shared_mutex> lock(*HashMapHolder<Player>::GetLock()); + std::shared_lock lock(*HashMapHolder<Player>::GetLock()); HashMapHolder<Player>::MapType const& m = GetPlayers(); for (HashMapHolder<Player>::MapType::const_iterator itr = m.begin(); itr != m.end(); ++itr) diff --git a/src/server/game/Instances/InstanceLockMgr.cpp b/src/server/game/Instances/InstanceLockMgr.cpp index bf84985bdea..98398d3989c 100644 --- a/src/server/game/Instances/InstanceLockMgr.cpp +++ b/src/server/game/Instances/InstanceLockMgr.cpp @@ -280,7 +280,7 @@ InstanceLock* InstanceLockMgr::UpdateInstanceLockForPlayer(CharacterDatabaseTran InstanceLock* instanceLock = FindActiveInstanceLock(playerGuid, entries, true, true); if (!instanceLock) { - std::unique_lock<std::shared_mutex> guard(_locksMutex); + std::scoped_lock guard(_locksMutex); // Move lock from temporary storage if it exists there // This is to avoid destroying expired locks before any boss is killed in a fresh lock @@ -323,7 +323,7 @@ InstanceLock* InstanceLockMgr::UpdateInstanceLockForPlayer(CharacterDatabaseTran GetNextResetTime(entries), updateEvent.InstanceId); { - std::unique_lock<std::shared_mutex> guard(_locksMutex); + std::scoped_lock guard(_locksMutex); _instanceLocksByPlayer[playerGuid][entries.GetKey()].reset(instanceLock); } diff --git a/src/server/game/Loot/LootItemStorage.cpp b/src/server/game/Loot/LootItemStorage.cpp index c0362ea093b..939ff3695a0 100644 --- a/src/server/game/Loot/LootItemStorage.cpp +++ b/src/server/game/Loot/LootItemStorage.cpp @@ -125,7 +125,7 @@ bool LootItemStorage::LoadStoredLoot(Item* item, Player* player) // read { - std::shared_lock<std::shared_mutex> lock(*GetLock()); + std::shared_lock lock(*GetLock()); auto itr = _lootItemStore.find(item->GetGUID().GetCounter()); if (itr == _lootItemStore.end()) @@ -199,7 +199,7 @@ bool LootItemStorage::LoadStoredLoot(Item* item, Player* player) void LootItemStorage::RemoveStoredMoneyForContainer(uint64 containerId) { // write - std::unique_lock<std::shared_mutex> lock(*GetLock()); + std::scoped_lock lock(*GetLock()); auto itr = _lootItemStore.find(containerId); if (itr == _lootItemStore.end()) @@ -212,7 +212,7 @@ void LootItemStorage::RemoveStoredLootForContainer(uint64 containerId) { // write { - std::unique_lock<std::shared_mutex> lock(*GetLock()); + std::scoped_lock lock(*GetLock()); _lootItemStore.erase(containerId); } @@ -231,7 +231,7 @@ void LootItemStorage::RemoveStoredLootForContainer(uint64 containerId) void LootItemStorage::RemoveStoredLootItemForContainer(uint64 containerId, LootItemType type, uint32 itemId, uint32 count, uint32 itemIndex) { // write - std::unique_lock<std::shared_mutex> lock(*GetLock()); + std::scoped_lock lock(*GetLock()); auto itr = _lootItemStore.find(containerId); if (itr == _lootItemStore.end()) @@ -248,7 +248,7 @@ void LootItemStorage::AddNewStoredLoot(uint64 containerId, Loot* loot, Player* p // read { - std::shared_lock<std::shared_mutex> lock(*GetLock()); + std::shared_lock lock(*GetLock()); auto itr = _lootItemStore.find(containerId); if (itr != _lootItemStore.end()) @@ -290,7 +290,7 @@ void LootItemStorage::AddNewStoredLoot(uint64 containerId, Loot* loot, Player* p // write { - std::unique_lock<std::shared_mutex> lock(*GetLock()); + std::scoped_lock lock(*GetLock()); _lootItemStore.emplace(containerId, std::move(container)); } } diff --git a/src/server/game/Maps/DynamicMMapTileBuilder.cpp b/src/server/game/Maps/DynamicMMapTileBuilder.cpp index 49205597853..984dc4a7edc 100644 --- a/src/server/game/Maps/DynamicMMapTileBuilder.cpp +++ b/src/server/game/Maps/DynamicMMapTileBuilder.cpp @@ -165,7 +165,7 @@ struct TileCache private: void OnCacheCleanupTimerTick(boost::system::error_code const& error) { - if (error) + if (error || !_builderThread.joinable() /*shutting down*/) return; TimePoint now = GameTime::Now(); @@ -176,7 +176,7 @@ private: void RemoveOldCacheEntries(TimePoint oldestPreservedEntryTimestamp) { - std::lock_guard lock(TilesMutex); + std::scoped_lock lock(TilesMutex); Trinity::Containers::EraseIf(Tiles, [=](std::unordered_map<TileCacheKey, Tile>::value_type const& kv) { return kv.second.LastAccessed < oldestPreservedEntryTimestamp; @@ -306,7 +306,7 @@ std::weak_ptr<DynamicTileBuilder::AsyncTileResult> DynamicTileBuilder::BuildTile cacheKey.CachedHash = std::hash<TileCacheKey>::Compute(cacheKey); TileCache* tileCache = TileCache::Instance(); - std::lock_guard lock(tileCache->TilesMutex); + std::scoped_lock lock(tileCache->TilesMutex); auto [itr, isNew] = tileCache->Tiles.try_emplace(std::move(cacheKey)); itr->second.LastAccessed = GameTime::Now(); if (!isNew) diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp index bc3a8c1c154..d363349febe 100644 --- a/src/server/game/Maps/MapManager.cpp +++ b/src/server/game/Maps/MapManager.cpp @@ -163,7 +163,7 @@ Map* MapManager::CreateMap(uint32 mapId, Player* player, Optional<uint32> lfgDun if (!entry) return nullptr; - std::unique_lock<std::shared_mutex> lock(_mapsLock); + std::scoped_lock lock(_mapsLock); Map* map = nullptr; uint32 newInstanceId = 0; // instanceId of the resulting map diff --git a/src/server/game/Maps/MapUpdater.cpp b/src/server/game/Maps/MapUpdater.cpp index 33d36126b6d..7a2c9a5afb9 100644 --- a/src/server/game/Maps/MapUpdater.cpp +++ b/src/server/game/Maps/MapUpdater.cpp @@ -20,8 +20,6 @@ #include "Map.h" #include "Metric.h" -#include <mutex> - class MapUpdateRequest { private: @@ -48,9 +46,7 @@ class MapUpdateRequest void MapUpdater::activate(size_t num_threads) { for (size_t i = 0; i < num_threads; ++i) - { - _workerThreads.push_back(std::thread(&MapUpdater::WorkerThread, this)); - } + _workerThreads.emplace_back(&MapUpdater::WorkerThread, this); } void MapUpdater::deactivate() @@ -62,38 +58,33 @@ void MapUpdater::deactivate() _queue.Cancel(); for (auto& thread : _workerThreads) - { thread.join(); - } } void MapUpdater::wait() { - std::unique_lock<std::mutex> lock(_lock); - - while (pending_requests > 0) - _condition.wait(lock); + std::unique_lock lock(_lock); - lock.unlock(); + _condition.wait(lock, [&] { return pending_requests == 0; }); } void MapUpdater::schedule_update(Map& map, uint32 diff) { - std::lock_guard<std::mutex> lock(_lock); + std::scoped_lock lock(_lock); ++pending_requests; _queue.Push(new MapUpdateRequest(map, *this, diff)); } -bool MapUpdater::activated() +bool MapUpdater::activated() const { - return _workerThreads.size() > 0; + return !_workerThreads.empty(); } void MapUpdater::update_finished() { - std::lock_guard<std::mutex> lock(_lock); + std::scoped_lock lock(_lock); --pending_requests; @@ -107,7 +98,7 @@ void MapUpdater::WorkerThread() WorldDatabase.WarnAboutSyncQueries(true); HotfixDatabase.WarnAboutSyncQueries(true); - while (1) + while (true) { MapUpdateRequest* request = nullptr; diff --git a/src/server/game/Maps/MapUpdater.h b/src/server/game/Maps/MapUpdater.h index 33858bb8ea1..14afdf63974 100644 --- a/src/server/game/Maps/MapUpdater.h +++ b/src/server/game/Maps/MapUpdater.h @@ -19,10 +19,11 @@ #define _MAP_UPDATER_H_INCLUDED #include "Define.h" +#include "ProducerConsumerQueue.h" +#include <condition_variable> #include <mutex> #include <thread> -#include <condition_variable> -#include "ProducerConsumerQueue.h" +#include <vector> class MapUpdateRequest; class Map; @@ -44,7 +45,7 @@ class TC_GAME_API MapUpdater void deactivate(); - bool activated(); + bool activated() const; private: diff --git a/src/server/game/Maps/TerrainMgr.cpp b/src/server/game/Maps/TerrainMgr.cpp index 4233f08e072..b0afc102fa4 100644 --- a/src/server/game/Maps/TerrainMgr.cpp +++ b/src/server/game/Maps/TerrainMgr.cpp @@ -158,7 +158,7 @@ void TerrainInfo::LoadMapAndVMap(int32 gx, int32 gy) if (++_referenceCountFromMap[gx][gy] != 1) // check if already loaded return; - std::lock_guard<std::mutex> lock(_loadMutex); + std::scoped_lock lock(_loadMutex); LoadMapAndVMapImpl(gx, gy); } @@ -301,7 +301,7 @@ GridMap* TerrainInfo::GetGrid(uint32 mapId, float x, float y, bool loadIfMissing // ensure GridMap is loaded if (!(_loadedGrids[gx] & (UI64LIT(1) << gy)) && loadIfMissing) { - std::lock_guard<std::mutex> lock(_loadMutex); + std::scoped_lock lock(_loadMutex); LoadMapAndVMapImpl(gx, gy); } diff --git a/src/server/game/Server/Protocol/PacketLog.cpp b/src/server/game/Server/Protocol/PacketLog.cpp index cc948cd04a1..3b9080a7b56 100644 --- a/src/server/game/Server/Protocol/PacketLog.cpp +++ b/src/server/game/Server/Protocol/PacketLog.cpp @@ -114,7 +114,7 @@ void PacketLog::Initialize() void PacketLog::LogPacket(WorldPacket const& packet, Direction direction, boost::asio::ip::address const& addr, uint16 port, ConnectionType connectionType) { - std::lock_guard<std::mutex> lock(_logPacketLock); + std::scoped_lock lock(_logPacketLock); PacketHeader header; header.Direction = direction == CLIENT_TO_SERVER ? 0x47534d43 : 0x47534d53; diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index dcdd982d79e..95a34c24adc 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -522,21 +522,18 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater) LogoutPlayer(true); ///- Cleanup socket pointer if need - if ((m_Socket[CONNECTION_TYPE_REALM] && !m_Socket[CONNECTION_TYPE_REALM]->IsOpen()) || - (m_Socket[CONNECTION_TYPE_INSTANCE] && !m_Socket[CONNECTION_TYPE_INSTANCE]->IsOpen())) + if (std::ranges::any_of(m_Socket, [](std::shared_ptr<WorldSocket> const& s) { return s && !s->IsOpen(); })) { expireTime -= expireTime > diff ? diff : expireTime; if (expireTime < diff || forceExit || !GetPlayer()) { - if (m_Socket[CONNECTION_TYPE_REALM]) + for (std::shared_ptr<WorldSocket>& socket : m_Socket) { - m_Socket[CONNECTION_TYPE_REALM]->CloseSocket(); - m_Socket[CONNECTION_TYPE_REALM].reset(); - } - if (m_Socket[CONNECTION_TYPE_INSTANCE]) - { - m_Socket[CONNECTION_TYPE_INSTANCE]->CloseSocket(); - m_Socket[CONNECTION_TYPE_INSTANCE].reset(); + if (socket) + { + socket->CloseSocket(); + socket.reset(); + } } } } diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index f8af2f512a7..a701939c313 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -253,7 +253,7 @@ void WorldSocket::SendAuthSession() void WorldSocket::OnClose() { { - std::lock_guard<std::mutex> sessionGuard(_worldSessionLock); + std::scoped_lock sessionGuard(_worldSessionLock); _worldSession = nullptr; } } @@ -323,7 +323,7 @@ void WorldSocket::QueueQuery(QueryCallback&& queryCallback) void WorldSocket::SetWorldSession(WorldSession* session) { - std::lock_guard<std::mutex> sessionGuard(_worldSessionLock); + std::scoped_lock sessionGuard(_worldSessionLock); _worldSession = session; _authed = true; } @@ -1053,7 +1053,7 @@ bool WorldSocket::HandlePing(WorldPackets::Auth::Ping& ping) { bool ignoresOverspeedPingsLimit = [&] { - std::lock_guard<std::mutex> sessionGuard(_worldSessionLock); + std::scoped_lock sessionGuard(_worldSessionLock); return _worldSession && _worldSession->HasPermission(rbac::RBAC_PERM_SKIP_CHECK_OVERSPEED_PING); }(); @@ -1072,7 +1072,7 @@ bool WorldSocket::HandlePing(WorldPackets::Auth::Ping& ping) bool success = [&] { - std::lock_guard<std::mutex> sessionGuard(_worldSessionLock); + std::scoped_lock sessionGuard(_worldSessionLock); if (_worldSession) { _worldSession->SetLatency(ping.Latency); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 2b18038f213..149c063bf6a 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -268,7 +268,7 @@ std::vector<std::string> const& World::GetMotd() const void World::TriggerGuidWarning() { // Lock this only to prevent multiple maps triggering at the same time - std::lock_guard<std::mutex> lock(_guidAlertLock); + std::scoped_lock lock(_guidAlertLock); time_t gameTime = GameTime::GetGameTime(); time_t today = (gameTime / DAY) * DAY; @@ -287,7 +287,7 @@ void World::TriggerGuidWarning() void World::TriggerGuidAlert() { // Lock this only to prevent multiple maps triggering at the same time - std::lock_guard<std::mutex> lock(_guidAlertLock); + std::scoped_lock lock(_guidAlertLock); DoGuidAlertRestart(); _guidAlert = true; diff --git a/src/server/shared/Realm/RealmList.cpp b/src/server/shared/Realm/RealmList.cpp index c8b4926ced6..56bef36217a 100644 --- a/src/server/shared/Realm/RealmList.cpp +++ b/src/server/shared/Realm/RealmList.cpp @@ -187,7 +187,7 @@ void RealmList::UpdateRealms() TC_LOG_INFO("realmlist", "Removed realm \"{}\".", itr->second); { - std::unique_lock<std::shared_mutex> lock(_realmsMutex); + std::scoped_lock lock(_realmsMutex); _subRegions.swap(newSubRegions); _realms.swap(newRealms); @@ -213,7 +213,7 @@ void RealmList::UpdateRealms() std::shared_ptr<Realm const> RealmList::GetRealm(Battlenet::RealmHandle const& id) const { - std::shared_lock<std::shared_mutex> lock(_realmsMutex); + std::shared_lock lock(_realmsMutex); return Trinity::Containers::MapGetValuePtr(_realms, id); } @@ -236,7 +236,7 @@ std::shared_ptr<Realm const> RealmList::GetCurrentRealm() const void RealmList::WriteSubRegions(bgs::protocol::game_utilities::v1::GetAllValuesForAttributeResponse* response) const { - std::shared_lock<std::shared_mutex> lock(_realmsMutex); + std::shared_lock lock(_realmsMutex); for (std::string const& subRegion : _subRegions) response->add_attribute_value()->set_string_value(subRegion); } @@ -301,7 +301,7 @@ std::vector<uint8> RealmList::GetRealmList(uint32 build, AccountTypes accountSec { JSON::RealmList::RealmListUpdates realmList; { - std::shared_lock<std::shared_mutex> lock(_realmsMutex); + std::shared_lock lock(_realmsMutex); for (auto const& [_, realm] : _realms) { if (realm->Id.GetSubRegionAddress() != subRegion) diff --git a/src/server/shared/Secrets/SecretMgr.cpp b/src/server/shared/Secrets/SecretMgr.cpp index b0ade7be0fe..08adaa5797e 100644 --- a/src/server/shared/Secrets/SecretMgr.cpp +++ b/src/server/shared/Secrets/SecretMgr.cpp @@ -93,7 +93,7 @@ void SecretMgr::Initialize(SecretOwner owner) { if (secret_info[i].flags() & SECRET_FLAG_DEFER_LOAD) continue; - std::unique_lock<std::mutex> lock(_secrets[i].lock); + std::scoped_lock lock(_secrets[i].lock); AttemptLoad(Secrets(i), LOG_LEVEL_FATAL, lock); if (!_secrets[i].IsAvailable()) ABORT(); // load failed @@ -102,14 +102,14 @@ void SecretMgr::Initialize(SecretOwner owner) SecretMgr::Secret const& SecretMgr::GetSecret(Secrets i) { - std::unique_lock<std::mutex> lock(_secrets[i].lock); + std::scoped_lock lock(_secrets[i].lock); if (_secrets[i].state == Secret::NOT_LOADED_YET) AttemptLoad(i, LOG_LEVEL_ERROR, lock); return _secrets[i]; } -void SecretMgr::AttemptLoad(Secrets i, LogLevel errorLevel, std::unique_lock<std::mutex> const&) +void SecretMgr::AttemptLoad(Secrets i, LogLevel errorLevel, std::scoped_lock<std::mutex> const&) { auto const& info = secret_info[i]; Optional<std::string> oldDigest; diff --git a/src/server/shared/Secrets/SecretMgr.h b/src/server/shared/Secrets/SecretMgr.h index ba9a870f83f..e77fe2d9c1f 100644 --- a/src/server/shared/Secrets/SecretMgr.h +++ b/src/server/shared/Secrets/SecretMgr.h @@ -78,7 +78,7 @@ class TC_SHARED_API SecretMgr Secret const& GetSecret(Secrets i); private: - void AttemptLoad(Secrets i, LogLevel errorLevel, std::unique_lock<std::mutex> const&); + void AttemptLoad(Secrets i, LogLevel errorLevel, std::scoped_lock<std::mutex> const&); Optional<std::string> AttemptTransition(Secrets i, Optional<BigNumber> const& newSecret, Optional<BigNumber> const& oldSecret, bool hadOldSecret) const; std::array<Secret, NUM_SECRETS> _secrets; |
