1
0

Fixed hangup with remove spell due to remove target list lock

This commit is contained in:
Emagi 2025-01-16 12:51:09 -05:00
parent 3efce0abd6
commit c300a5b066

View File

@ -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();