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)
{
var tcs = new TaskCompletionSource<int>();
var tcs = new TaskCompletionSource<int>(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);
}
}
}
}

Loading…
Cancel
Save