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); } }; }
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; }
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); } }); }
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); } }); }
public static SaeaAwaitable SendAsync(this Socket socket, SaeaAwaitable awaitable) { return OperateAsync(socket, awaitable, SEND); }
public static SaeaAwaitable ReceiveAsync(this Socket socket, SaeaAwaitable awaitable) { return OperateAsync(socket, awaitable, RECEIVE); }
public static SaeaAwaitable DisonnectAsync(this Socket socket, SaeaAwaitable awaitable) { return OperateAsync(socket, awaitable, DISCONNECT); }
public static SaeaAwaitable AcceptAsync(this Socket socket, SaeaAwaitable awaitable) { return OperateAsync(socket, awaitable, ACCEPT); }