From 037c22ecdbcac11c2c45e5f5aacc1781e7a515e2 Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Tue, 29 Oct 2024 20:54:32 +0100 Subject: [PATCH] use concurrent dict for redraw manager --- MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs | 4 ++-- MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs | 2 +- MareSynchronos/Interop/Ipc/RedrawManager.cs | 13 ++++++++----- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs b/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs index 94adb8a..848e7f1 100644 --- a/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs +++ b/MareSynchronos/Interop/Ipc/IpcCallerGlamourer.cs @@ -118,7 +118,7 @@ public sealed class IpcCallerGlamourer : IIpcCaller { logger.LogWarning(ex, "[{appid}] Failed to apply Glamourer data", applicationId); } - }).ConfigureAwait(false); + }, token).ConfigureAwait(false); } finally { @@ -168,7 +168,7 @@ public sealed class IpcCallerGlamourer : IIpcCaller { logger.LogWarning(ex, "[{appid}] Error during GlamourerRevert", applicationId); } - }).ConfigureAwait(false); + }, token).ConfigureAwait(false); } finally { diff --git a/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs b/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs index 5a9cd67..d9c05d2 100644 --- a/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs +++ b/MareSynchronos/Interop/Ipc/IpcCallerPenumbra.cs @@ -244,7 +244,7 @@ public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCa logger.LogDebug("[{appid}] Calling on IPC: PenumbraRedraw", applicationId); _penumbraRedraw!.Invoke(chara.ObjectIndex, setting: RedrawType.Redraw); - }).ConfigureAwait(false); + }, token).ConfigureAwait(false); } finally { diff --git a/MareSynchronos/Interop/Ipc/RedrawManager.cs b/MareSynchronos/Interop/Ipc/RedrawManager.cs index 153a44a..e8240fc 100644 --- a/MareSynchronos/Interop/Ipc/RedrawManager.cs +++ b/MareSynchronos/Interop/Ipc/RedrawManager.cs @@ -4,6 +4,7 @@ using MareSynchronos.Services; using MareSynchronos.Services.Mediator; using MareSynchronos.Utils; using Microsoft.Extensions.Logging; +using System.Collections.Concurrent; namespace MareSynchronos.Interop.Ipc; @@ -11,7 +12,7 @@ public class RedrawManager { private readonly MareMediator _mareMediator; private readonly DalamudUtilService _dalamudUtil; - private readonly Dictionary _penumbraRedrawRequests = []; + private readonly ConcurrentDictionary _penumbraRedrawRequests = []; private CancellationTokenSource _disposalCts = new(); public SemaphoreSlim RedrawSemaphore { get; init; } = new(2, 2); @@ -22,7 +23,7 @@ public class RedrawManager _dalamudUtil = dalamudUtil; } - public async Task PenumbraRedrawInternalAsync(ILogger logger, GameObjectHandler handler, Guid applicationId, Action action) + public async Task PenumbraRedrawInternalAsync(ILogger logger, GameObjectHandler handler, Guid applicationId, Action action, CancellationToken token) { _mareMediator.Publish(new PenumbraStartRedrawMessage(handler.Address)); @@ -30,12 +31,14 @@ public class RedrawManager try { - CancellationTokenSource cancelToken = new CancellationTokenSource(); + using CancellationTokenSource cancelToken = new CancellationTokenSource(); + using CancellationTokenSource combinedCts = CancellationTokenSource.CreateLinkedTokenSource(cancelToken.Token, token, _disposalCts.Token); + var combinedToken = combinedCts.Token; cancelToken.CancelAfter(TimeSpan.FromSeconds(15)); - await handler.ActOnFrameworkAfterEnsureNoDrawAsync(action, cancelToken.Token).ConfigureAwait(false); + await handler.ActOnFrameworkAfterEnsureNoDrawAsync(action, combinedToken).ConfigureAwait(false); if (!_disposalCts.Token.IsCancellationRequested) - await _dalamudUtil.WaitWhileCharacterIsDrawing(logger, handler, applicationId, 30000, _disposalCts.Token).ConfigureAwait(false); + await _dalamudUtil.WaitWhileCharacterIsDrawing(logger, handler, applicationId, 30000, combinedToken).ConfigureAwait(false); } finally {