public void RelinquishReceiverRole() { TaskCompletionSource <ReceiveCoordinatorInstructions> awaiter = null; lock (_lock) { if (_awaiters.Count > 0) { var pair = _awaiters.First(); _awaiters.Remove(pair.Key); awaiter = pair.Value; } else { _receiverRoleAssigned = false; } } if (awaiter != null) { var instructions = new ReceiveCoordinatorInstructions { Action = ReceiveCoordinatorAction.AssumeReceiverRole }; awaiter.TrySetResult(instructions); } }
public void DispatchBuffer(int responseTo, IByteBuffer buffer) { TaskCompletionSource <ReceiveCoordinatorInstructions> awaiter = null; lock (_lock) { if (_awaiters.TryGetValue(responseTo, out awaiter)) { _awaiters.Remove(responseTo); } else { _buffers.Add(responseTo, buffer); } } if (awaiter != null) { var instructions = new ReceiveCoordinatorInstructions { Action = ReceiveCoordinatorAction.ReturnBuffer, Buffer = buffer }; if (!awaiter.TrySetResult(instructions)) { buffer.Dispose(); } } }
public async Task <ReceiveCoordinatorInstructions> GetInstructionsAsync(int responseTo, CancellationToken cancellationToken) { TaskCompletionSource <ReceiveCoordinatorInstructions> awaiter; lock (_lock) { ReceiveCoordinatorInstructions instructions; IByteBuffer buffer; if (_buffers.TryGetValue(responseTo, out buffer)) { _buffers.Remove(responseTo); instructions = new ReceiveCoordinatorInstructions { Action = ReceiveCoordinatorAction.ReturnBuffer, Buffer = buffer }; return(instructions); } else if (_receiverRoleAssigned) { awaiter = new TaskCompletionSource <ReceiveCoordinatorInstructions>(); _awaiters.Add(responseTo, awaiter); } else { _receiverRoleAssigned = true; instructions = new ReceiveCoordinatorInstructions { Action = ReceiveCoordinatorAction.AssumeReceiverRole }; return(instructions); } } using (cancellationToken.Register(() => awaiter.TrySetCanceled(), useSynchronizationContext: false)) { return(await awaiter.Task.ConfigureAwait(false)); } }
public void RelinquishReceiverRole() { TaskCompletionSource<ReceiveCoordinatorInstructions> awaiter = null; lock (_lock) { if (_awaiters.Count > 0) { var pair = _awaiters.First(); _awaiters.Remove(pair.Key); awaiter = pair.Value; } else { _receiverRoleAssigned = false; } } if (awaiter != null) { var instructions = new ReceiveCoordinatorInstructions { Action = ReceiveCoordinatorAction.AssumeReceiverRole }; awaiter.TrySetResult(instructions); } }
public async Task<ReceiveCoordinatorInstructions> GetInstructionsAsync(int responseTo, CancellationToken cancellationToken) { TaskCompletionSource<ReceiveCoordinatorInstructions> awaiter; lock (_lock) { ReceiveCoordinatorInstructions instructions; IByteBuffer buffer; if (_buffers.TryGetValue(responseTo, out buffer)) { _buffers.Remove(responseTo); instructions = new ReceiveCoordinatorInstructions { Action = ReceiveCoordinatorAction.ReturnBuffer, Buffer = buffer }; return instructions; } else if (_receiverRoleAssigned) { awaiter = new TaskCompletionSource<ReceiveCoordinatorInstructions>(); _awaiters.Add(responseTo, awaiter); } else { _receiverRoleAssigned = true; instructions = new ReceiveCoordinatorInstructions { Action = ReceiveCoordinatorAction.AssumeReceiverRole }; return instructions; } } using (cancellationToken.Register(() => awaiter.TrySetCanceled(), useSynchronizationContext: false)) { return await awaiter.Task.ConfigureAwait(false); } }
public void DispatchBuffer(int responseTo, IByteBuffer buffer) { TaskCompletionSource<ReceiveCoordinatorInstructions> awaiter = null; lock (_lock) { if (_awaiters.TryGetValue(responseTo, out awaiter)) { _awaiters.Remove(responseTo); } else { _buffers.Add(responseTo, buffer); } } if (awaiter != null) { var instructions = new ReceiveCoordinatorInstructions { Action = ReceiveCoordinatorAction.ReturnBuffer, Buffer = buffer }; if (!awaiter.TrySetResult(instructions)) { buffer.Dispose(); } } }