Fixed hangup with remove spell due to remove target list lock
This commit is contained in:
parent
3efce0abd6
commit
c300a5b066
@ -2820,7 +2820,7 @@ void SpellProcess::CheckRemoveTargetFromSpell(LuaSpell* spell, bool allow_delete
|
|||||||
vector<int32>* remove_targets = 0;
|
vector<int32>* remove_targets = 0;
|
||||||
Spawn* remove_spawn = 0;
|
Spawn* remove_spawn = 0;
|
||||||
bool should_delete = false;
|
bool should_delete = false;
|
||||||
|
bool dropped_lock = false;
|
||||||
for (remove_itr = remove_target_list.begin(); remove_itr != remove_target_list.end(); remove_itr++){
|
for (remove_itr = remove_target_list.begin(); remove_itr != remove_target_list.end(); remove_itr++){
|
||||||
if (remove_itr->first == spell){
|
if (remove_itr->first == spell){
|
||||||
targets = &spell->targets;
|
targets = &spell->targets;
|
||||||
@ -2856,17 +2856,25 @@ void SpellProcess::CheckRemoveTargetFromSpell(LuaSpell* spell, bool allow_delete
|
|||||||
}
|
}
|
||||||
if (targets->size() == 0 && spell->char_id_targets.size() == 0 && allow_delete) {
|
if (targets->size() == 0 && spell->char_id_targets.size() == 0 && allow_delete) {
|
||||||
spell->MSpellTargets.releasewritelock(__FUNCTION__, __LINE__);
|
spell->MSpellTargets.releasewritelock(__FUNCTION__, __LINE__);
|
||||||
|
if(!dropped_lock) {
|
||||||
|
MRemoveTargetList.releasewritelock(__FUNCTION__, __LINE__);
|
||||||
|
}
|
||||||
if(found_target)
|
if(found_target)
|
||||||
lua_interface->RemoveSpell(spell, true, false, !remove_spawn->Alive() ? "target_dead" : "target_removed", false, true, remove_spawn);
|
lua_interface->RemoveSpell(spell, true, false, !remove_spawn->Alive() ? "target_dead" : "target_removed", false, true, remove_spawn);
|
||||||
should_delete = true;
|
should_delete = true;
|
||||||
|
dropped_lock = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
spell->MSpellTargets.releasewritelock(__FUNCTION__, __LINE__);
|
spell->MSpellTargets.releasewritelock(__FUNCTION__, __LINE__);
|
||||||
|
if(!dropped_lock) {
|
||||||
|
MRemoveTargetList.releasewritelock(__FUNCTION__, __LINE__);
|
||||||
|
}
|
||||||
// call remove function "on death"
|
// call remove function "on death"
|
||||||
if(found_target)
|
if(found_target)
|
||||||
lua_interface->RemoveSpell(spell, true, false, !remove_spawn->Alive() ? "target_dead" : "target_removed", false, true, remove_spawn);
|
lua_interface->RemoveSpell(spell, true, false, !remove_spawn->Alive() ? "target_dead" : "target_removed", false, true, remove_spawn);
|
||||||
spell->MSpellTargets.writelock(__FUNCTION__, __LINE__);
|
spell->MSpellTargets.writelock(__FUNCTION__, __LINE__);
|
||||||
|
dropped_lock = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2875,6 +2883,11 @@ void SpellProcess::CheckRemoveTargetFromSpell(LuaSpell* spell, bool allow_delete
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(dropped_lock) {
|
||||||
|
MRemoveTargetList.writelock(__FUNCTION__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
remove_target_list.erase(spell);
|
remove_target_list.erase(spell);
|
||||||
if (remove_targets)
|
if (remove_targets)
|
||||||
remove_targets->clear();
|
remove_targets->clear();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user