Browse Source

deadlock fix for groups and buffs against group members

Image 2 years ago
parent
commit
443bb47ed4
2 changed files with 10 additions and 2 deletions
  1. 9 1
      EQ2/source/WorldServer/PlayerGroups.cpp
  2. 1 1
      EQ2/source/WorldServer/Spawn.h

+ 9 - 1
EQ2/source/WorldServer/PlayerGroups.cpp

@@ -631,6 +631,7 @@ void PlayerGroupManager::UpdateGroupBuffs() {
 
 		/* loop through the group members and see if any of them have any maintained spells that are group buffs and friendly.
 		if so, update the list of targets and apply/remove effects as needed */
+		vector<Player*> players;
 
 		group->MGroupMembers.readlock(__FUNCTION__, __LINE__);
 		for (member_itr = group->GetMembers()->begin(); member_itr != group->GetMembers()->end(); member_itr++) {
@@ -644,6 +645,14 @@ void PlayerGroupManager::UpdateGroupBuffs() {
 			if (!caster->GetMaintainedSpellBySlot(0))
 				continue;
 
+			players.push_back(caster);
+		}
+		group->MGroupMembers.releasereadlock(__FUNCTION__, __LINE__);
+
+		vector<Player*>::iterator vitr;
+
+		for (vitr = players.begin(); vitr != players.end(); vitr++) {
+			caster = *vitr;
 			caster->GetMaintainedMutex()->readlock(__FUNCTION__, __LINE__);
 			// go through the player's maintained spells
 			me = caster->GetMaintainedSpells();
@@ -783,7 +792,6 @@ void PlayerGroupManager::UpdateGroupBuffs() {
 			}
 			caster->GetMaintainedMutex()->releasereadlock(__FUNCTION__, __LINE__);
 		}
-		group->MGroupMembers.releasereadlock(__FUNCTION__, __LINE__);
 	}
 }
 

+ 1 - 1
EQ2/source/WorldServer/Spawn.h

@@ -1230,7 +1230,7 @@ public:
 
 	void SetOmittedByDBFlag(bool val) { is_omitted_by_db_flag = val; }
 	bool IsOmittedByDBFlag() { return is_omitted_by_db_flag; }
-	
+
 protected:
 
 	bool	has_quests_required;