Browse Source

Use loopcancellation instead of adding a seperate api.

pull/3451/head
Dan Walmsley 7 years ago
parent
commit
9df55b02d4
  1. 1
      native/Avalonia.Native/inc/avalonia-native.h
  2. 6
      native/Avalonia.Native/src/OSX/platformthreading.mm
  3. 46
      src/Avalonia.Native/PlatformThreadingInterface.cs

1
native/Avalonia.Native/inc/avalonia-native.h

@ -308,7 +308,6 @@ AVNCOM(IAvnPlatformThreadingInterface, 0b) : IUnknown
// Can't pass int* to sharpgentools for some reason // Can't pass int* to sharpgentools for some reason
virtual void Signal(int priority) = 0; virtual void Signal(int priority) = 0;
virtual IUnknown* StartTimer(int priority, int ms, IAvnActionCallback* callback) = 0; virtual IUnknown* StartTimer(int priority, int ms, IAvnActionCallback* callback) = 0;
virtual HRESULT TerminateApp () = 0;
}; };
AVNCOM(IAvnSystemDialogEvents, 0c) : IUnknown AVNCOM(IAvnSystemDialogEvents, 0c) : IUnknown

6
native/Avalonia.Native/src/OSX/platformthreading.mm

@ -138,12 +138,6 @@ public:
return new TimerWrapper(callback, ms); return new TimerWrapper(callback, ms);
} }
} }
virtual HRESULT TerminateApp () override
{
[NSApp stop:0];
return S_OK;
}
}; };
@implementation Signaler @implementation Signaler

46
src/Avalonia.Native/PlatformThreadingInterface.cs

@ -45,6 +45,7 @@ namespace Avalonia.Native
readonly IAvnPlatformThreadingInterface _native; readonly IAvnPlatformThreadingInterface _native;
private ExceptionDispatchInfo _exceptionDispatchInfo; private ExceptionDispatchInfo _exceptionDispatchInfo;
private IAvnLoopCancellation _loopCancellation;
public PlatformThreadingInterface(IAvnPlatformThreadingInterface native) public PlatformThreadingInterface(IAvnPlatformThreadingInterface native)
{ {
@ -59,36 +60,31 @@ namespace Avalonia.Native
public void RunLoop(CancellationToken cancellationToken) public void RunLoop(CancellationToken cancellationToken)
{ {
if (cancellationToken.CanBeCanceled == false) var l = new object();
_native.RunLoop(null); _loopCancellation = _native.CreateLoopCancellation();
else cancellationToken.Register(() =>
{ {
var l = new object(); lock (l)
var cancellation = _native.CreateLoopCancellation();
cancellationToken.Register(() =>
{ {
lock (l) _loopCancellation?.Cancel();
{
cancellation?.Cancel();
}
});
try
{
_native.RunLoop(cancellation);
} }
finally });
try
{
_native.RunLoop(_loopCancellation);
}
finally
{
lock (l)
{ {
lock(l) _loopCancellation?.Dispose();
{ _loopCancellation = null;
cancellation?.Dispose();
cancellation = null;
}
} }
}
if(_exceptionDispatchInfo != null) if (_exceptionDispatchInfo != null)
{ {
_exceptionDispatchInfo.Throw(); _exceptionDispatchInfo.Throw();
}
} }
} }
@ -99,7 +95,7 @@ namespace Avalonia.Native
public void TerminateNativeApp() public void TerminateNativeApp()
{ {
_native.TerminateApp(); _loopCancellation?.Cancel();
} }
public void Signal(DispatcherPriority priority) public void Signal(DispatcherPriority priority)

Loading…
Cancel
Save