From 79fc42aa3b10899acb6df4fde54a21ca14783b86 Mon Sep 17 00:00:00 2001 From: DismissedLight <1686188646@qq.com> Date: Tue, 2 Jan 2024 18:45:35 +0800 Subject: [PATCH] fix spinwait --- .../Snap.Hutao/Core/Threading/SpinWaitPolyfill.cs | 6 ++++-- .../Snap.Hutao/Service/Discord/DiscordController.cs | 11 ++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/Snap.Hutao/Snap.Hutao/Core/Threading/SpinWaitPolyfill.cs b/src/Snap.Hutao/Snap.Hutao/Core/Threading/SpinWaitPolyfill.cs index 32265943..ef91c554 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/Threading/SpinWaitPolyfill.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/Threading/SpinWaitPolyfill.cs @@ -3,12 +3,14 @@ namespace Snap.Hutao.Core.Threading; +internal delegate bool SpinWaitPredicate(ref readonly T state); + internal static class SpinWaitPolyfill { - public static void SpinUntil(T state, Func condition) + public static unsafe void SpinUntil(ref T state, delegate* condition) { SpinWait spinner = default; - while (!condition(state)) + while (!condition(ref state)) { spinner.SpinOnce(); } diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordController.cs b/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordController.cs index 70340061..3ae882fa 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordController.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Discord/DiscordController.cs @@ -238,10 +238,10 @@ internal static class DiscordController public bool IsCompleted; } - private unsafe readonly struct DiscordUpdateActivityAsyncAction + private unsafe struct DiscordUpdateActivityAsyncAction { - private readonly DiscordAsyncAction discordAsyncAction; private readonly IDiscordActivityManager* activityManagerPtr; + private DiscordAsyncAction discordAsyncAction; public DiscordUpdateActivityAsyncAction(IDiscordActivityManager* activityManagerPtr) { @@ -255,7 +255,7 @@ internal static class DiscordController activityManagerPtr->update_activity(activityManagerPtr, &activity, actionPtr, &HandleResult); } - SpinWaitPolyfill.SpinUntil(discordAsyncAction, (state) => state.IsCompleted); + SpinWaitPolyfill.SpinUntil(ref discordAsyncAction, &CheckActionCompleted); return discordAsyncAction.Result; } @@ -266,5 +266,10 @@ internal static class DiscordController action->Result = result; action->IsCompleted = true; } + + private static bool CheckActionCompleted(ref readonly DiscordAsyncAction state) + { + return state.IsCompleted; + } } } \ No newline at end of file