Skip to content

Commit

Permalink
Fixed a Bad, Double Disposal Issue
Browse files Browse the repository at this point in the history
  • Loading branch information
DelnarErsike committed May 15, 2024
1 parent a5f1c64 commit 187a1a1
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 45 deletions.
76 changes: 38 additions & 38 deletions Chummer/Backend/Characters/Character.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12326,43 +12326,43 @@ public async ValueTask DisposeAsync()
ImprovementManager.ClearCachedValues(this);
_lstLinkedCharacters.Clear(); // Clear this list because it relates to Contacts and Spirits disposal
await _lstMugshots.ForEachAsync(x => x.Dispose()).ConfigureAwait(false);
await _lstContacts.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstSpirits.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstArmor.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstWeapons.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstGear.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstCyberware.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstVehicles.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstLifestyles.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstSpells.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstMartialArts.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstContacts.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstSpirits.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstArmor.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstWeapons.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstGear.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstCyberware.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstVehicles.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstLifestyles.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstSpells.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstMartialArts.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstMartialArts.DisposeAsync().ConfigureAwait(false);
await _lstComplexForms.DisposeAsync().ConfigureAwait(false);
await _lstAIPrograms.DisposeAsync().ConfigureAwait(false);
await _lstPowers.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstPowers.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstPowers.DisposeAsync().ConfigureAwait(false);
await _lstCritterPowers.DisposeAsync().ConfigureAwait(false);
await _lstFoci.DisposeAsync().ConfigureAwait(false);
await _lstStackedFoci.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstStackedFoci.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstStackedFoci.DisposeAsync().ConfigureAwait(false);
await _lstMetamagics.DisposeAsync().ConfigureAwait(false);
await _lstArts.DisposeAsync().ConfigureAwait(false);
await _lstEnhancements.DisposeAsync().ConfigureAwait(false);
await _lstImprovements.DisposeAsync().ConfigureAwait(false);
await _lstInitiationGrades.DisposeAsync().ConfigureAwait(false);
await _lstQualities.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstQualities.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstQualities.DisposeAsync().ConfigureAwait(false);
await _lstCalendar.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstCalendar.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstCalendar.DisposeAsync().ConfigureAwait(false);
await _lstDrugs.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstDrugs.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstDrugs.DisposeAsync().ConfigureAwait(false);
await _lstMentorSpirits.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstMentorSpirits.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstMentorSpirits.DisposeAsync().ConfigureAwait(false);
await _lstExpenseLog.DisposeAsync().ConfigureAwait(false);
await _lstArmorLocations.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstGearLocations.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstWeaponLocations.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstVehicleLocations.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstArmorLocations.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstGearLocations.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstWeaponLocations.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstVehicleLocations.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstArmorLocations.DisposeAsync().ConfigureAwait(false);
await _lstGearLocations.DisposeAsync().ConfigureAwait(false);
await _lstWeaponLocations.DisposeAsync().ConfigureAwait(false);
Expand Down Expand Up @@ -12631,40 +12631,40 @@ public async Task ResetCharacterAsync(CancellationToken token = default)
_intMainMugshotIndex = -1;
await _lstMugshots.ForEachAsync(x => x.Dispose(), token).ConfigureAwait(false);
await _lstMugshots.ClearAsync(token).ConfigureAwait(false);
await _lstContacts.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
await _lstContacts.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
.ConfigureAwait(false);
await _lstContacts.ClearAsync(token).ConfigureAwait(false);
await _lstSpirits.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
await _lstSpirits.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
.ConfigureAwait(false);
await _lstSpirits.ClearAsync(token).ConfigureAwait(false);
await _lstArmor.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
await _lstArmor.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
.ConfigureAwait(false);
await _lstWeapons.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
await _lstWeapons.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
.ConfigureAwait(false);
await _lstGear.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
await _lstGear.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
.ConfigureAwait(false);
await _lstCyberware.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
await _lstCyberware.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
.ConfigureAwait(false);
await _lstVehicles.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
await _lstVehicles.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
.ConfigureAwait(false);
await _lstLifestyles.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
await _lstLifestyles.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
.ConfigureAwait(false);
await _lstSpells.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
await _lstSpells.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
.ConfigureAwait(false);
await _lstPowers.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
await _lstPowers.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
.ConfigureAwait(false);
await _lstMartialArts.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
await _lstMartialArts.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
.ConfigureAwait(false);
await _lstStackedFoci.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
await _lstStackedFoci.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
.ConfigureAwait(false);
await _lstDrugs.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
await _lstDrugs.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
.ConfigureAwait(false);
await _lstMentorSpirits.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
await _lstMentorSpirits.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token)
.ConfigureAwait(false);
await _lstGearLocations.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token).ConfigureAwait(false);
await _lstArmorLocations.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token).ConfigureAwait(false);
await _lstWeaponLocations.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token).ConfigureAwait(false);
await _lstVehicleLocations.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token).ConfigureAwait(false);
await _lstGearLocations.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token).ConfigureAwait(false);
await _lstArmorLocations.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token).ConfigureAwait(false);
await _lstWeaponLocations.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token).ConfigureAwait(false);
await _lstVehicleLocations.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token).ConfigureAwait(false);
// Reset all of the Lists.
// This kills the GC
ImprovementManager.ClearCachedValues(this, token);
Expand Down
4 changes: 1 addition & 3 deletions Chummer/Backend/Skills/Skill.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8032,7 +8032,7 @@ protected virtual async ValueTask DisposeAsync(bool disposing)
{
_lstSpecializations.CollectionChangedAsync -= SpecializationsOnCollectionChanged;
_lstSpecializations.BeforeClearCollectionChangedAsync -= SpecializationsOnBeforeClearCollectionChanged;
await _lstSpecializations.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstSpecializations.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
}
finally
{
Expand All @@ -8059,8 +8059,6 @@ public async ValueTask DisposeAsync()
await objLocker.DisposeAsync().ConfigureAwait(false);
}

await objLocker.DisposeAsync().ConfigureAwait(false);

GC.SuppressFinalize(this);
}
}
Expand Down
8 changes: 4 additions & 4 deletions Chummer/Backend/Skills/SkillsSection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2583,7 +2583,7 @@ internal async Task ResetAsync(bool blnFirstTime = false, CancellationToken toke
objSkill.MultiplePropertiesChangedAsync -= OnKnowledgeSkillPropertyChanged;
return objSkill.RemoveAsync(token);
}, token).ConfigureAwait(false);
await SkillGroups.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token).ConfigureAwait(false);
await SkillGroups.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false), token).ConfigureAwait(false);
_dicSkillBackups.Clear();
_dicSkills.Clear();
await _lstSkills.ClearAsync(token).ConfigureAwait(false);
Expand Down Expand Up @@ -4144,13 +4144,13 @@ public async ValueTask DisposeAsync()
{
//swallow this
}
await _lstSkillGroups.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstSkillGroups.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
foreach (Skill objSkill in _dicSkillBackups.Values)
await objSkill.DisposeAsync().ConfigureAwait(false);
_dicSkillBackups.Clear();
await _lstSkills.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstSkills.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstSkills.DisposeAsync().ConfigureAwait(false);
await _lstKnowledgeSkills.ForEachAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstKnowledgeSkills.ForEachWithSideEffectsAsync(async x => await x.DisposeAsync().ConfigureAwait(false)).ConfigureAwait(false);
await _lstKnowledgeSkills.DisposeAsync().ConfigureAwait(false);
await _lstKnowsoftSkills.ClearAsync().ConfigureAwait(false);
await _lstKnowsoftSkills.DisposeAsync().ConfigureAwait(false);
Expand Down

0 comments on commit 187a1a1

Please sign in to comment.