예제 #1
0
파일: SaeaAwaiter.cs 프로젝트: yaozd/Rpc
        public SaeaAwaiter(SaeaAwaitable awaitable)
        {
            _awaitable = awaitable;
            _awaitable.Saea.Completed += delegate
            {
                var continuation = _continuation ?? Interlocked.CompareExchange(ref _continuation, SENTINEL, null);

                if (continuation != null)
                {
                    Complete();

                    if (continuation != SENTINEL)
                        Task.Run(continuation);
                }
            };
        }
예제 #2
0
파일: SaeaExtensions.cs 프로젝트: yaozd/Rpc
private static SaeaAwaitable OperateAsync(Socket socket, SaeaAwaitable awaitable, Func<Socket, SaeaAwaitable, bool> operation)
{
    if (socket == null)
                throw new ArgumentNullException("socket");

            if (awaitable == null)
                throw new ArgumentNullException("awaitable");

            var awaiter = awaitable.GetAwaiter();

            lock (awaiter.SyncRoot)
            {
                if (!awaiter.IsCompleted)
                    throw new InvalidOperationException(
                        "A socket operation is already in progress using the same await-able SAEA.");

                awaiter.Reset();
            }

            try
            {
                if (!operation.Invoke(socket, awaitable))
                    awaiter.Complete();
            }
            catch (SocketException ex)
            {
                awaiter.Complete();
                awaitable.Saea.SocketError =
                    ex.SocketErrorCode != SocketError.Success ? ex.SocketErrorCode : SocketError.SocketError;
            }
            catch (Exception)
            {
                awaiter.Complete();
                awaitable.Saea.SocketError = SocketError.Success;
                throw;
            }

            return awaitable;
}
예제 #3
0
        private void Initialize()
        {
            _bufferManager = new GrowingByteBufferManager(_configuration.InitialPooledBufferCount, _configuration.ReceiveBufferSize);

            _acceptSaeaPool = new SaeaPool(16, 32,
                () =>
                {
                    var saea = new SaeaAwaitable();
                    return saea;
                },
                (saea) =>
                {
                    try
                    {
                        saea.Saea.AcceptSocket = null;
                        saea.Saea.SetBuffer(0, 0);
                        saea.Saea.RemoteEndPoint = null;
                        saea.Saea.SocketFlags = SocketFlags.None;
                    }
                    catch (Exception ex)
                    {
//                        _log.Error(ex.Message, ex);
                    }
                });
            _handleSaeaPool = new SaeaPool(1024, int.MaxValue,
                () =>
                {
                    var saea = new SaeaAwaitable();
                    return saea;
                },
                (saea) =>
                {
                    try
                    {
                        saea.Saea.AcceptSocket = null;
                        saea.Saea.SetBuffer(EmptyArray, 0, 0);
                        saea.Saea.RemoteEndPoint = null;
                        saea.Saea.SocketFlags = SocketFlags.None;
                    }
                    catch (Exception ex)
                    {
//                        _log.Error(ex.Message, ex);
                    }
                });
            _sessionPool = new SessionPool(1024, int.MaxValue,
                () =>
                {
                    var session = new TcpSocketSaeaSession(_configuration, _bufferManager, _handleSaeaPool, _dispatcher, this);
                    return session;
                },
                (session) =>
                {
                    try
                    {
                        session.Clear();
                    }
                    catch (Exception ex)
                    {
//                        _log.Error(ex.Message, ex);
                    }
                });
        }
예제 #4
0
        private void Initialize()
        {
            _bufferManager = new GrowingByteBufferManager(_configuration.InitialPooledBufferCount, _configuration.ReceiveBufferSize);

            _saeaPool = new SaeaPool(1024, int.MaxValue,
                () =>
                {
                    var saea = new SaeaAwaitable();
                    return saea;
                },
                (saea) =>
                {
                    try
                    {
                        saea.Saea.AcceptSocket = null;
                        saea.Saea.SetBuffer(EmptyArray, 0, 0);
                        saea.Saea.RemoteEndPoint = null;
                        saea.Saea.SocketFlags = SocketFlags.None;
                    }
                    catch (Exception ex)
                    {
//                        _log.Error(ex.Message, ex);
                    }
                });
        }
예제 #5
0
파일: SaeaExtensions.cs 프로젝트: yaozd/Rpc
public static SaeaAwaitable SendAsync(this Socket socket, SaeaAwaitable awaitable)
{
    return OperateAsync(socket, awaitable, SEND);
}
예제 #6
0
파일: SaeaExtensions.cs 프로젝트: yaozd/Rpc
public static SaeaAwaitable ReceiveAsync(this Socket socket, SaeaAwaitable awaitable)
{
    return OperateAsync(socket, awaitable, RECEIVE);
}
예제 #7
0
파일: SaeaExtensions.cs 프로젝트: yaozd/Rpc
public static SaeaAwaitable DisonnectAsync(this Socket socket, SaeaAwaitable awaitable)
{
    return OperateAsync(socket, awaitable, DISCONNECT);
}
예제 #8
0
파일: SaeaExtensions.cs 프로젝트: yaozd/Rpc
public static SaeaAwaitable AcceptAsync(this Socket socket, SaeaAwaitable awaitable)
{
    return OperateAsync(socket, awaitable, ACCEPT);
}