Example #1
0
            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);
                }
            }
Example #2
0
            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();
                    }
                }
            }
Example #3
0
            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();
                    }
                }
            }