Skip to content

Commit

Permalink
Use loopcancellation instead of adding a seperate api.
Browse files Browse the repository at this point in the history
  • Loading branch information
danwalmsley committed Jan 20, 2020
1 parent c3fb152 commit 9df55b0
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 32 deletions.
1 change: 0 additions & 1 deletion native/Avalonia.Native/inc/avalonia-native.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 0 additions & 6 deletions native/Avalonia.Native/src/OSX/platformthreading.mm
Original file line number Diff line number Diff line change
Expand Up @@ -138,12 +138,6 @@ virtual void Signal(int priority) override
return new TimerWrapper(callback, ms);
}
}

virtual HRESULT TerminateApp () override
{
[NSApp stop:0];
return S_OK;
}
};

@implementation Signaler
Expand Down
46 changes: 21 additions & 25 deletions src/Avalonia.Native/PlatformThreadingInterface.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ public void Signaled(int priority, bool priorityContainsMeaningfulValue)

readonly IAvnPlatformThreadingInterface _native;
private ExceptionDispatchInfo _exceptionDispatchInfo;
private IAvnLoopCancellation _loopCancellation;

public PlatformThreadingInterface(IAvnPlatformThreadingInterface native)
{
Expand All @@ -59,36 +60,31 @@ public PlatformThreadingInterface(IAvnPlatformThreadingInterface 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();
}
}

Expand All @@ -99,7 +95,7 @@ public void DispatchException (ExceptionDispatchInfo exceptionInfo)

public void TerminateNativeApp()
{
_native.TerminateApp();
_loopCancellation?.Cancel();
}

public void Signal(DispatcherPriority priority)
Expand Down

0 comments on commit 9df55b0

Please sign in to comment.