From 4d73f1d159b96ae004848903351e7cb8ca3cc45d Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 1 Feb 2019 10:33:08 +0100 Subject: [PATCH] Fix deadlock in remote protocol. The `TransportConnectionWrapper` producer-consumer queue was deadlocking due to `_signal` getting set to `null` while a worker was still waiting for it. Spoke with @kekekeks who suggested this fix. --- src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs b/src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs index 1e821b7c24..d7919af9d9 100644 --- a/src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs +++ b/src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs @@ -64,7 +64,7 @@ namespace Avalonia.Remote.Protocol public Task Send(object data) { - var tcs = new TaskCompletionSource(); + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); lock (_lock) { if (!_workerIsAlive) @@ -79,8 +79,9 @@ namespace Avalonia.Remote.Protocol }); if (_signal != null) { - _signal.SetResult(0); + var signal = _signal; _signal = null; + signal.SetResult(0); } } return tcs.Task; @@ -98,4 +99,4 @@ namespace Avalonia.Remote.Protocol remove => _onException.Remove(value); } } -} \ No newline at end of file +}