private void Initialize()
 {
     _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)
         {
             Loger.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)
         {
             Loger.Error(ex.Message, ex);
         }
     });
     _sessionPool = new SessionPool(1024, int.MaxValue,
                                    () =>
     {
         var session = new TcpSocketSaeaSession(_configuration, _configuration.BufferManager, _handleSaeaPool, _dispatcher, this);
         return(session);
     },
                                    (session) =>
     {
         try
         {
             session.Clear();
         }
         catch (Exception ex)
         {
             Loger.Error(ex.Message, ex);
         }
     });
 }
Exemple #2
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);
                }
            });
        }
Exemple #3
0
        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 awaitable SAEA.");
                }

                awaiter.Reset();
                if (awaitable.ShouldCaptureContext)
                {
                    awaiter.SyncContext = SynchronizationContext.Current;
                }
            }

            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);
        }
Exemple #4
0
        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);
                }
            };
        }
        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);
                    }
                }
            };
        }
Exemple #6
0
        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.Factory.StartNew(continuation, TaskCreationOptions.PreferFairness);
                    }
                }
            };
        }
Exemple #7
0
        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;
        }
Exemple #8
0
 private void Initialize()
 {
     _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)
         {
             Loger.Error(ex.Message, ex);
         }
     });
 }
 private void Initialize()
 {
     _saeaPool = new SaeaPool(
         () =>
     {
         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)     // initialize SAEA error occurred
         {
             _log.Error(ex.Message, ex);
         }
     })
                 .Initialize(256);
 }
        private void Initialize()
        {
            _bufferManager = new GrowingByteBufferManager(_configuration.InitialBufferAllocationCount, _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);
                    }
                });
        }
        private void Initialize()
        {
            _bufferManager = new GrowingByteBufferManager(_configuration.InitialBufferAllocationCount, _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);
                    }
                });
        }
Exemple #12
0
 public static SaeaAwaitable SendAsync(this Socket socket, SaeaAwaitable awaitable)
 {
     return(OperateAsync(socket, awaitable, SEND));
 }
Exemple #13
0
 public static SaeaAwaitable ReceiveAsync(this Socket socket, SaeaAwaitable awaitable)
 {
     return(OperateAsync(socket, awaitable, RECEIVE));
 }
Exemple #14
0
 public static SaeaAwaitable DisonnectAsync(this Socket socket, SaeaAwaitable awaitable)
 {
     return(OperateAsync(socket, awaitable, DISCONNECT));
 }
Exemple #15
0
 public static SaeaAwaitable AcceptAsync(this Socket socket, SaeaAwaitable awaitable)
 {
     return(OperateAsync(socket, awaitable, ACCEPT));
 }
Exemple #16
0
 public SaeaAwaiter(SaeaAwaitable awaitable)
 {
     _awaitable = awaitable;
     _awaitable.Saea.Completed += OnSaeaCompleted;
 }
Exemple #17
0
 public static SaeaAwaitable AcceptAsync(this Socket socket, SaeaAwaitable awaitable)
 {
     return OperateAsync(socket, awaitable, ACCEPT);
 }
Exemple #18
0
 public static SaeaAwaitable SendAsync(this Socket socket, SaeaAwaitable awaitable)
 {
     return OperateAsync(socket, awaitable, SEND);
 }
Exemple #19
0
 public static SaeaAwaitable ReceiveAsync(this Socket socket, SaeaAwaitable awaitable)
 {
     return OperateAsync(socket, awaitable, RECEIVE);
 }
Exemple #20
0
 public static SaeaAwaitable DisonnectAsync(this Socket socket, SaeaAwaitable awaitable)
 {
     return OperateAsync(socket, awaitable, DISCONNECT);
 }