use concurrent dict for redraw manager
This commit is contained in:
@@ -118,7 +118,7 @@ public sealed class IpcCallerGlamourer : IIpcCaller
|
|||||||
{
|
{
|
||||||
logger.LogWarning(ex, "[{appid}] Failed to apply Glamourer data", applicationId);
|
logger.LogWarning(ex, "[{appid}] Failed to apply Glamourer data", applicationId);
|
||||||
}
|
}
|
||||||
}).ConfigureAwait(false);
|
}, token).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
@@ -168,7 +168,7 @@ public sealed class IpcCallerGlamourer : IIpcCaller
|
|||||||
{
|
{
|
||||||
logger.LogWarning(ex, "[{appid}] Error during GlamourerRevert", applicationId);
|
logger.LogWarning(ex, "[{appid}] Error during GlamourerRevert", applicationId);
|
||||||
}
|
}
|
||||||
}).ConfigureAwait(false);
|
}, token).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -244,7 +244,7 @@ public sealed class IpcCallerPenumbra : DisposableMediatorSubscriberBase, IIpcCa
|
|||||||
logger.LogDebug("[{appid}] Calling on IPC: PenumbraRedraw", applicationId);
|
logger.LogDebug("[{appid}] Calling on IPC: PenumbraRedraw", applicationId);
|
||||||
_penumbraRedraw!.Invoke(chara.ObjectIndex, setting: RedrawType.Redraw);
|
_penumbraRedraw!.Invoke(chara.ObjectIndex, setting: RedrawType.Redraw);
|
||||||
|
|
||||||
}).ConfigureAwait(false);
|
}, token).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using MareSynchronos.Services;
|
|||||||
using MareSynchronos.Services.Mediator;
|
using MareSynchronos.Services.Mediator;
|
||||||
using MareSynchronos.Utils;
|
using MareSynchronos.Utils;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
|
||||||
namespace MareSynchronos.Interop.Ipc;
|
namespace MareSynchronos.Interop.Ipc;
|
||||||
|
|
||||||
@@ -11,7 +12,7 @@ public class RedrawManager
|
|||||||
{
|
{
|
||||||
private readonly MareMediator _mareMediator;
|
private readonly MareMediator _mareMediator;
|
||||||
private readonly DalamudUtilService _dalamudUtil;
|
private readonly DalamudUtilService _dalamudUtil;
|
||||||
private readonly Dictionary<nint, bool> _penumbraRedrawRequests = [];
|
private readonly ConcurrentDictionary<nint, bool> _penumbraRedrawRequests = [];
|
||||||
private CancellationTokenSource _disposalCts = new();
|
private CancellationTokenSource _disposalCts = new();
|
||||||
|
|
||||||
public SemaphoreSlim RedrawSemaphore { get; init; } = new(2, 2);
|
public SemaphoreSlim RedrawSemaphore { get; init; } = new(2, 2);
|
||||||
@@ -22,7 +23,7 @@ public class RedrawManager
|
|||||||
_dalamudUtil = dalamudUtil;
|
_dalamudUtil = dalamudUtil;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task PenumbraRedrawInternalAsync(ILogger logger, GameObjectHandler handler, Guid applicationId, Action<ICharacter> action)
|
public async Task PenumbraRedrawInternalAsync(ILogger logger, GameObjectHandler handler, Guid applicationId, Action<ICharacter> action, CancellationToken token)
|
||||||
{
|
{
|
||||||
_mareMediator.Publish(new PenumbraStartRedrawMessage(handler.Address));
|
_mareMediator.Publish(new PenumbraStartRedrawMessage(handler.Address));
|
||||||
|
|
||||||
@@ -30,12 +31,14 @@ public class RedrawManager
|
|||||||
|
|
||||||
try
|
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));
|
cancelToken.CancelAfter(TimeSpan.FromSeconds(15));
|
||||||
await handler.ActOnFrameworkAfterEnsureNoDrawAsync(action, cancelToken.Token).ConfigureAwait(false);
|
await handler.ActOnFrameworkAfterEnsureNoDrawAsync(action, combinedToken).ConfigureAwait(false);
|
||||||
|
|
||||||
if (!_disposalCts.Token.IsCancellationRequested)
|
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
|
finally
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user