예제 #1
0
        public override void Complete()
        {
            Debug.Assert((CompletionFlags & (OperationCompletionFlags.OperationCancelled | OperationCompletionFlags.OperationFinished)) != 0);

            ResetOperationState();
            _readNotWrite = IsReadNotWrite;
            var completionFlags = CompletionFlags;

            Saea.Complete(completionFlags);

            if ((completionFlags & OperationCompletionFlags.CompletedCanceledSync) == OperationCompletionFlags.CompletedCanceledSync)
            {
                // Caller threw an exception which prevents further use of this.
                ResetAndReturnThis();
            }
            else
            {
                _vts.SetResult(0);

                ManualResetEventSlim?mre = Interlocked.Exchange(ref _mre, s_completedSentinel);
                // This ManualResetEventSlim is used to wait until the operation completed.
                // After that a direct call is made to get the result.
                mre?.Set();
            }
        }
예제 #2
0
 /// <summary>
 ///     Releases all resources used by <see cref="SaeaAwaitable" />.
 /// </summary>
 public void Dispose()
 {
     lock (SyncRoot)
     {
         if (!IsDisposed)
         {
             Saea.Dispose();
             IsDisposed = true;
         }
     }
 }
예제 #3
0
        void IThreadPoolWorkItem.Execute()
        {
            // Capture state.
            OperationCompletionFlags completionStatus = CompletionFlags;

            // Reset state.
            CompletionFlags     = OperationCompletionFlags.None;
            CurrentAsyncContext = null;

            // Complete.
            Saea.Complete(completionStatus);
        }
예제 #4
0
        /// <summary>
        ///     Clear properties to prepare
        ///     <see cref="SaeaAwaitable" /> for pooling.
        /// </summary>
        public void ClearAndResetSaeaProperties()
        {
            Saea.SocketFlags           = SocketFlags.None;
            Saea.SocketError           = SocketError.Success;
            Saea.SendPacketsSendSize   = 0;
            Saea.SendPacketsElements   = null;
            Saea.DisconnectReuseSocket = false;
            Saea.BufferList            = null;
            Saea.AcceptSocket          = null;
            Saea.RemoteEndPoint        = null;
            Saea.UserToken             = null;

            if (_initBufferSize != MAGIC)
            {
                // restore buffer
                Saea.SetBuffer(0, _initBufferSize);
            }
        }