potentially fixes an issue with cache creation, do not remove mediator on failure

This commit is contained in:
rootdarkarchon
2023-02-28 22:45:00 +01:00
parent a37281b719
commit ebe9ea47be
10 changed files with 45 additions and 59 deletions

View File

@@ -25,7 +25,6 @@ public class CharacterDataFactory : MediatorSubscriberBase
private readonly TransientResourceManager _transientResourceManager;
private readonly FileCacheManager _fileCacheManager;
private readonly PerformanceCollector _performanceCollector;
private readonly ConcurrentQueue<Task<string>> _processingQueue = new();
public CharacterDataFactory(ILogger<CharacterDataFactory> logger, DalamudUtil dalamudUtil, IpcManager ipcManager,
TransientResourceManager transientResourceManager, FileCacheManager fileReplacementFactory, MareMediator mediator,
@@ -37,13 +36,6 @@ public class CharacterDataFactory : MediatorSubscriberBase
_transientResourceManager = transientResourceManager;
_fileCacheManager = fileReplacementFactory;
_performanceCollector = performanceCollector;
Mediator.Subscribe<FrameworkUpdateMessage>(this, (_) =>
{
while (_processingQueue.TryDequeue(out var result))
{
result.RunSynchronously();
}
});
}
private unsafe bool CheckForNullDrawObject(IntPtr playerPointer)
@@ -51,14 +43,14 @@ public class CharacterDataFactory : MediatorSubscriberBase
return ((Character*)playerPointer)->GameObject.DrawObject == null;
}
public async Task<CharacterData> BuildCharacterData(CharacterData previousData, GameObjectHandler playerRelatedObject, CancellationToken token)
public async Task BuildCharacterData(CharacterData previousData, GameObjectHandler playerRelatedObject, CancellationToken token)
{
if (!_ipcManager.Initialized)
{
throw new InvalidOperationException("Penumbra is not connected");
}
if (playerRelatedObject == null) return previousData;
if (playerRelatedObject == null) return;
bool pointerIsZero = true;
try
@@ -84,7 +76,7 @@ public class CharacterDataFactory : MediatorSubscriberBase
_logger.LogTrace("Pointer was zero for {objectKind}", playerRelatedObject.ObjectKind);
previousData.FileReplacements.Remove(playerRelatedObject.ObjectKind);
previousData.GlamourerString.Remove(playerRelatedObject.ObjectKind);
return previousData;
return;
}
var previousFileReplacements = previousData.FileReplacements.ToDictionary(d => d.Key, d => d.Value);
@@ -92,15 +84,14 @@ public class CharacterDataFactory : MediatorSubscriberBase
try
{
_processingQueue.Clear();
return await _performanceCollector.LogPerformance(this, "CreateCharacterData>" + playerRelatedObject.ObjectKind, async () =>
await _performanceCollector.LogPerformance(this, "CreateCharacterData>" + playerRelatedObject.ObjectKind, async () =>
{
return await CreateCharacterData(previousData, playerRelatedObject, token).ConfigureAwait(false);
await CreateCharacterData(previousData, playerRelatedObject, token).ConfigureAwait(false);
}).ConfigureAwait(true);
return;
}
catch (OperationCanceledException)
{
_processingQueue.Clear();
_logger.LogDebug("Cancelled creating Character data for {object}", playerRelatedObject);
throw;
}
@@ -111,7 +102,7 @@ public class CharacterDataFactory : MediatorSubscriberBase
previousData.FileReplacements = previousFileReplacements;
previousData.GlamourerString = previousGlamourerData;
return previousData;
return;
}
private async Task<CharacterData> CreateCharacterData(CharacterData previousData, GameObjectHandler playerRelatedObject, CancellationToken token)