From 9df55b02d4c8d525dac0c6b9cb991e3f048fa0d4 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Mon, 20 Jan 2020 09:40:48 -0300 Subject: [PATCH] Use loopcancellation instead of adding a seperate api. --- native/Avalonia.Native/inc/avalonia-native.h | 1 - .../src/OSX/platformthreading.mm | 6 --- .../PlatformThreadingInterface.cs | 46 +++++++++---------- 3 files changed, 21 insertions(+), 32 deletions(-) diff --git a/native/Avalonia.Native/inc/avalonia-native.h b/native/Avalonia.Native/inc/avalonia-native.h index 48822c66ce..677fa2f4c5 100644 --- a/native/Avalonia.Native/inc/avalonia-native.h +++ b/native/Avalonia.Native/inc/avalonia-native.h @@ -308,7 +308,6 @@ AVNCOM(IAvnPlatformThreadingInterface, 0b) : IUnknown // Can't pass int* to sharpgentools for some reason virtual void Signal(int priority) = 0; virtual IUnknown* StartTimer(int priority, int ms, IAvnActionCallback* callback) = 0; - virtual HRESULT TerminateApp () = 0; }; AVNCOM(IAvnSystemDialogEvents, 0c) : IUnknown diff --git a/native/Avalonia.Native/src/OSX/platformthreading.mm b/native/Avalonia.Native/src/OSX/platformthreading.mm index 596106c6dc..e7abedae51 100644 --- a/native/Avalonia.Native/src/OSX/platformthreading.mm +++ b/native/Avalonia.Native/src/OSX/platformthreading.mm @@ -138,12 +138,6 @@ public: return new TimerWrapper(callback, ms); } } - - virtual HRESULT TerminateApp () override - { - [NSApp stop:0]; - return S_OK; - } }; @implementation Signaler diff --git a/src/Avalonia.Native/PlatformThreadingInterface.cs b/src/Avalonia.Native/PlatformThreadingInterface.cs index 4c70a71772..f011648cd2 100644 --- a/src/Avalonia.Native/PlatformThreadingInterface.cs +++ b/src/Avalonia.Native/PlatformThreadingInterface.cs @@ -45,6 +45,7 @@ namespace Avalonia.Native readonly IAvnPlatformThreadingInterface _native; private ExceptionDispatchInfo _exceptionDispatchInfo; + private IAvnLoopCancellation _loopCancellation; public PlatformThreadingInterface(IAvnPlatformThreadingInterface native) { @@ -59,36 +60,31 @@ namespace Avalonia.Native public void RunLoop(CancellationToken cancellationToken) { - if (cancellationToken.CanBeCanceled == false) - _native.RunLoop(null); - else + var l = new object(); + _loopCancellation = _native.CreateLoopCancellation(); + cancellationToken.Register(() => { - var l = new object(); - var cancellation = _native.CreateLoopCancellation(); - cancellationToken.Register(() => + lock (l) { - lock (l) - { - cancellation?.Cancel(); - } - }); - try - { - _native.RunLoop(cancellation); + _loopCancellation?.Cancel(); } - finally + }); + try + { + _native.RunLoop(_loopCancellation); + } + finally + { + lock (l) { - lock(l) - { - cancellation?.Dispose(); - cancellation = null; - } + _loopCancellation?.Dispose(); + _loopCancellation = null; } + } - if(_exceptionDispatchInfo != null) - { - _exceptionDispatchInfo.Throw(); - } + if (_exceptionDispatchInfo != null) + { + _exceptionDispatchInfo.Throw(); } } @@ -99,7 +95,7 @@ namespace Avalonia.Native public void TerminateNativeApp() { - _native.TerminateApp(); + _loopCancellation?.Cancel(); } public void Signal(DispatcherPriority priority)