Browse Source

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.
pull/2274/head
Steven Kirk 8 years ago
parent
commit
4d73f1d159
  1. 7
      src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs

7
src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs

@ -64,7 +64,7 @@ namespace Avalonia.Remote.Protocol
public Task Send(object data) public Task Send(object data)
{ {
var tcs = new TaskCompletionSource<int>(); var tcs = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);
lock (_lock) lock (_lock)
{ {
if (!_workerIsAlive) if (!_workerIsAlive)
@ -79,8 +79,9 @@ namespace Avalonia.Remote.Protocol
}); });
if (_signal != null) if (_signal != null)
{ {
_signal.SetResult(0); var signal = _signal;
_signal = null; _signal = null;
signal.SetResult(0);
} }
} }
return tcs.Task; return tcs.Task;
@ -98,4 +99,4 @@ namespace Avalonia.Remote.Protocol
remove => _onException.Remove(value); remove => _onException.Remove(value);
} }
} }
} }

Loading…
Cancel
Save