From ee445f21976e9d40166e59ebd2866e4fa2a9ff10 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sun, 19 Mar 2023 15:54:35 +0600 Subject: [PATCH] Fixed dispatcher for macOS --- native/Avalonia.Native/src/OSX/platformthreading.mm | 4 +--- src/Avalonia.Base/Threading/Dispatcher.Queue.cs | 8 +++++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/platformthreading.mm b/native/Avalonia.Native/src/OSX/platformthreading.mm index b727b9a6cf..d2d7a365a6 100644 --- a/native/Avalonia.Native/src/OSX/platformthreading.mm +++ b/native/Avalonia.Native/src/OSX/platformthreading.mm @@ -79,13 +79,11 @@ static double distantFutureInterval = (double)50*365*24*3600; bool signaled; @synchronized (self) { signaled = self->_signaled; + self->_signaled = false; } if(signaled) { self->_events->Signaled(); - @synchronized (self) { - self->_signaled = false; - } } }); CFRunLoopAddObserver(CFRunLoopGetMain(), _observer, kCFRunLoopCommonModes); diff --git a/src/Avalonia.Base/Threading/Dispatcher.Queue.cs b/src/Avalonia.Base/Threading/Dispatcher.Queue.cs index 9db8c5e8c0..0c5414e6d1 100644 --- a/src/Avalonia.Base/Threading/Dispatcher.Queue.cs +++ b/src/Avalonia.Base/Threading/Dispatcher.Queue.cs @@ -124,7 +124,13 @@ public partial class Dispatcher else if (_pendingInputImpl?.CanQueryPendingInput == true) { if (!_pendingInputImpl.HasPendingInput) - ExecuteJob(job); + { + // On platforms like macOS HasPendingInput check might trigger a timer + // which would result in reentrancy here, so we check if the job + // hasn't been executed yet + if (job.Status == DispatcherOperationStatus.Pending) + ExecuteJob(job); + } else { RequestBackgroundProcessing();