More lock fixes. Also fix the .character level command

This commit is contained in:
H0zen 2016-03-04 16:46:51 +02:00
parent dbc21ed903
commit b026642ce2
4 changed files with 57 additions and 73 deletions

View File

@ -171,7 +171,7 @@ bool ChatHandler::HandleGMListIngameCommand(char* /*args*/)
std::list< std::pair<std::string, bool> > names; std::list< std::pair<std::string, bool> > names;
{ {
HashMapHolder<Player>::ReadGuard g(HashMapHolder<Player>::GetLock()); ACE_READ_GUARD_RETURN(HashMapHolder<Player>::LockType, g, HashMapHolder<Player>::GetLock(), true)
HashMapHolder<Player>::MapType& m = sObjectAccessor.GetPlayers(); HashMapHolder<Player>::MapType& m = sObjectAccessor.GetPlayers();
for (HashMapHolder<Player>::MapType::const_iterator itr = m.begin(); itr != m.end(); ++itr) for (HashMapHolder<Player>::MapType::const_iterator itr = m.begin(); itr != m.end(); ++itr)
{ {

View File

@ -93,14 +93,11 @@ Player* ObjectAccessor::FindPlayer(ObjectGuid guid, bool inWorld /*= true*/)
Player* ObjectAccessor::FindPlayerByName(const char* name) Player* ObjectAccessor::FindPlayerByName(const char* name)
{ {
HashMapHolder<Player>::ReadGuard g(HashMapHolder<Player>::GetLock(), true); ACE_READ_GUARD_RETURN(HashMapHolder<Player>::LockType, guard, HashMapHolder<Player>::GetLock(), NULL)
if (g.locked()) HashMapHolder<Player>::MapType& m = sObjectAccessor.GetPlayers();
{ for (HashMapHolder<Player>::MapType::iterator iter = m.begin(); iter != m.end(); ++iter)
HashMapHolder<Player>::MapType& m = sObjectAccessor.GetPlayers(); if (iter->second->IsInWorld() && (::strcmp(name, iter->second->GetName()) == 0))
for (HashMapHolder<Player>::MapType::iterator iter = m.begin(); iter != m.end(); ++iter) { return iter->second; }
if (iter->second->IsInWorld() && (::strcmp(name, iter->second->GetName()) == 0))
{ return iter->second; }
}
return NULL; return NULL;
} }
@ -131,16 +128,15 @@ void ObjectAccessor::KickPlayer(ObjectGuid guid)
Corpse* Corpse*
ObjectAccessor::GetCorpseForPlayerGUID(ObjectGuid guid) ObjectAccessor::GetCorpseForPlayerGUID(ObjectGuid guid)
{ {
ACE_Guard<LockType> guard(i_corpseGuard, true); ACE_GUARD_RETURN(LockType, guard, i_corpseGuard, NULL)
if (guard.locked())
{ Player2CorpsesMapType::iterator iter = i_player2corpse.find(guid);
Player2CorpsesMapType::iterator iter = i_player2corpse.find(guid);
if (iter == i_player2corpse.end()) if (iter == i_player2corpse.end())
{ return NULL; } { return NULL; }
MANGOS_ASSERT(iter->second->GetType() != CORPSE_BONES);
return iter->second; MANGOS_ASSERT(iter->second->GetType() != CORPSE_BONES);
} return iter->second;
return NULL;
} }
void void
@ -148,22 +144,20 @@ ObjectAccessor::RemoveCorpse(Corpse* corpse)
{ {
MANGOS_ASSERT(corpse && corpse->GetType() != CORPSE_BONES); MANGOS_ASSERT(corpse && corpse->GetType() != CORPSE_BONES);
ACE_Guard<LockType> guard(i_corpseGuard, true); ACE_GUARD(LockType, guard, i_corpseGuard)
if (guard.locked())
{
Player2CorpsesMapType::iterator iter = i_player2corpse.find(corpse->GetOwnerGuid());
if (iter == i_player2corpse.end())
{ return; }
// build mapid*cellid -> guid_set map Player2CorpsesMapType::iterator iter = i_player2corpse.find(corpse->GetOwnerGuid());
CellPair cell_pair = MaNGOS::ComputeCellPair(corpse->GetPositionX(), corpse->GetPositionY()); if (iter == i_player2corpse.end())
uint32 cell_id = (cell_pair.y_coord * TOTAL_NUMBER_OF_CELLS_PER_MAP) + cell_pair.x_coord; { return; }
sObjectMgr.DeleteCorpseCellData(corpse->GetMapId(), cell_id, corpse->GetOwnerGuid().GetCounter()); // build mapid*cellid -> guid_set map
corpse->RemoveFromWorld(); CellPair cell_pair = MaNGOS::ComputeCellPair(corpse->GetPositionX(), corpse->GetPositionY());
uint32 cell_id = (cell_pair.y_coord * TOTAL_NUMBER_OF_CELLS_PER_MAP) + cell_pair.x_coord;
i_player2corpse.erase(iter); sObjectMgr.DeleteCorpseCellData(corpse->GetMapId(), cell_id, corpse->GetOwnerGuid().GetCounter());
} corpse->RemoveFromWorld();
i_player2corpse.erase(iter);
} }
void void
@ -171,43 +165,39 @@ ObjectAccessor::AddCorpse(Corpse* corpse)
{ {
MANGOS_ASSERT(corpse && corpse->GetType() != CORPSE_BONES); MANGOS_ASSERT(corpse && corpse->GetType() != CORPSE_BONES);
ACE_Guard<LockType> guard(i_corpseGuard, true); ACE_GUARD(LockType, guard, i_corpseGuard)
if (guard.locked())
{
MANGOS_ASSERT(i_player2corpse.find(corpse->GetOwnerGuid()) == i_player2corpse.end());
i_player2corpse[corpse->GetOwnerGuid()] = corpse;
// build mapid*cellid -> guid_set map MANGOS_ASSERT(i_player2corpse.find(corpse->GetOwnerGuid()) == i_player2corpse.end());
CellPair cell_pair = MaNGOS::ComputeCellPair(corpse->GetPositionX(), corpse->GetPositionY()); i_player2corpse[corpse->GetOwnerGuid()] = corpse;
uint32 cell_id = (cell_pair.y_coord * TOTAL_NUMBER_OF_CELLS_PER_MAP) + cell_pair.x_coord;
sObjectMgr.AddCorpseCellData(corpse->GetMapId(), cell_id, corpse->GetOwnerGuid().GetCounter(), corpse->GetInstanceId()); // build mapid*cellid -> guid_set map
} CellPair cell_pair = MaNGOS::ComputeCellPair(corpse->GetPositionX(), corpse->GetPositionY());
uint32 cell_id = (cell_pair.y_coord * TOTAL_NUMBER_OF_CELLS_PER_MAP) + cell_pair.x_coord;
sObjectMgr.AddCorpseCellData(corpse->GetMapId(), cell_id, corpse->GetOwnerGuid().GetCounter(), corpse->GetInstanceId());
} }
void void
ObjectAccessor::AddCorpsesToGrid(GridPair const& gridpair, GridType& grid, Map* map) ObjectAccessor::AddCorpsesToGrid(GridPair const& gridpair, GridType& grid, Map* map)
{ {
ACE_Guard<LockType> guard(i_corpseGuard, true); ACE_GUARD(LockType, guard, i_corpseGuard)
if (guard.locked())
{ for (Player2CorpsesMapType::iterator iter = i_player2corpse.begin(); iter != i_player2corpse.end(); ++iter)
for (Player2CorpsesMapType::iterator iter = i_player2corpse.begin(); iter != i_player2corpse.end(); ++iter) if (iter->second->GetGrid() == gridpair)
if (iter->second->GetGrid() == gridpair) {
// verify, if the corpse in our instance (add only corpses which are)
if (map->Instanceable())
{ {
// verify, if the corpse in our instance (add only corpses which are) if (iter->second->GetInstanceId() == map->GetInstanceId())
if (map->Instanceable())
{
if (iter->second->GetInstanceId() == map->GetInstanceId())
{
grid.AddWorldObject(iter->second);
}
}
else
{ {
grid.AddWorldObject(iter->second); grid.AddWorldObject(iter->second);
} }
} }
} else
{
grid.AddWorldObject(iter->second);
}
}
} }
Corpse* Corpse*

View File

@ -54,33 +54,24 @@ class HashMapHolder
typedef UNORDERED_MAP<ObjectGuid, T*> MapType; typedef UNORDERED_MAP<ObjectGuid, T*> MapType;
typedef ACE_RW_Thread_Mutex LockType; typedef ACE_RW_Thread_Mutex LockType;
typedef ACE_Read_Guard<LockType> ReadGuard;
typedef ACE_Write_Guard<LockType> WriteGuard;
static void Insert(T* o) static void Insert(T* o)
{ {
WriteGuard guard(i_lock, true); ACE_WRITE_GUARD(LockType, guard, i_lock)
if (guard.locked()) m_objectMap[o->GetObjectGuid()] = o;
m_objectMap[o->GetObjectGuid()] = o;
} }
static void Remove(T* o) static void Remove(T* o)
{ {
WriteGuard guard(i_lock, true); ACE_WRITE_GUARD(LockType, guard, i_lock)
if (guard.locked()) m_objectMap.erase(o->GetObjectGuid());
m_objectMap.erase(o->GetObjectGuid());
} }
static T* Find(ObjectGuid guid) static T* Find(ObjectGuid guid)
{ {
ReadGuard guard(i_lock, true); ACE_READ_GUARD_RETURN (LockType, guard, i_lock, NULL)
if (guard.locked()) typename MapType::iterator itr = m_objectMap.find(guid);
{ return (itr != m_objectMap.end()) ? itr->second : NULL;
typename MapType::iterator itr = m_objectMap.find(guid);
return (itr != m_objectMap.end()) ? itr->second : NULL;
}
else
return NULL;
} }
static MapType& GetContainer() { return m_objectMap; } static MapType& GetContainer() { return m_objectMap; }

View File

@ -18960,6 +18960,9 @@ void Player::_LoadSkills(QueryResult* result)
case SKILL_RANGE_MONO: // 1..1, grey monolite bar case SKILL_RANGE_MONO: // 1..1, grey monolite bar
value = max = 1; value = max = 1;
break; break;
case SKILL_RANGE_LEVEL:
max = GetMaxSkillValueForLevel(); // max value can be wrong for the actual level
break;
default: default:
break; break;
} }