internal void EndShutdown (LazyAsyncResult lazyResult) { if (Interlocked.Exchange (ref _NestedWrite, 0) == 0) throw new InvalidOperationException (SR.GetString (SR.net_io_invalidendcall, "EndShutdown")); // No "artificial" timeouts implemented so far, InnerStream controls timeout. lazyResult.InternalWaitForCompletion (); if (lazyResult.Result is Exception) { if (lazyResult.Result is IOException) throw (Exception)lazyResult.Result; throw new IOException (SR.GetString (SR.mono_net_io_shutdown), (Exception)lazyResult.Result); } }
internal void EndShutdown(LazyAsyncResult lazyResult) { if (Interlocked.Exchange(ref _NestedWrite, 0) == 0) { throw new InvalidOperationException(SR.GetString(SR.net_io_invalidendcall, "EndShutdown")); } // No "artificial" timeouts implemented so far, InnerStream controls timeout. lazyResult.InternalWaitForCompletion(); if (lazyResult.Result is Exception) { if (lazyResult.Result is IOException) { throw (Exception)lazyResult.Result; } throw new IOException(SR.GetString(SR.mono_net_io_shutdown), (Exception)lazyResult.Result); } }
// Returns: // -1 - proceed // 0 - queued // X - some bytes are ready, no need for IO private int CheckEnqueueRead(Memory <byte> buffer) { int lockState = Interlocked.CompareExchange(ref _lockReadState, LockRead, LockNone); if (lockState != LockHandshake) { // Proceed, no concurrent handshake is ongoing so no need for a lock. return(CheckOldKeyDecryptedData(buffer)); } LazyAsyncResult lazyResult = null; lock (SyncLock) { int result = CheckOldKeyDecryptedData(buffer); if (result != -1) { return(result); } // Check again under lock. if (_lockReadState != LockHandshake) { // The other thread has finished before we grabbed the lock. _lockReadState = LockRead; return(-1); } _lockReadState = LockPendingRead; lazyResult = new LazyAsyncResult(null, null, /*must be */ null); _queuedReadStateRequest = lazyResult; } // Need to exit from lock before waiting. lazyResult.InternalWaitForCompletion(); lock (SyncLock) { return(CheckOldKeyDecryptedData(buffer)); } }
internal void EndProcessAuthentication(IAsyncResult result) { if (result == null) { throw new ArgumentNullException("asyncResult"); } LazyAsyncResult result2 = result as LazyAsyncResult; if (result2 == null) { throw new ArgumentException(SR.GetString("net_io_async_result", new object[] { result.GetType().FullName }), "asyncResult"); } if (Interlocked.Exchange(ref this._NestedAuth, 0) == 0) { throw new InvalidOperationException(SR.GetString("net_io_invalidendcall", new object[] { "EndAuthenticate" })); } result2.InternalWaitForCompletion(); Exception e = result2.Result as Exception; if (e != null) { throw this.SetException(e); } }
// // // internal void InternalEndProcessAuthentication(LazyAsyncResult lazyResult) { // No "artificial" timeouts implemented so far, InnerStream controls that. lazyResult.InternalWaitForCompletion(); Exception e = lazyResult.Result as Exception; if (e != null) { // Failed auth, reset the framing if any. _Framing = Framing.Unknown; _handshakeCompleted = false; SetException(e).Throw(); } }
// Returns: // true - operation queued // false - operation can proceed private bool CheckEnqueueHandshake(byte[] buffer, AsyncProtocolRequest asyncRequest) { LazyAsyncResult lazyResult = null; lock (this) { if (_lockWriteState == LockPendingWrite) { return false; } int lockState = Interlocked.Exchange(ref _lockWriteState, LockHandshake); if (lockState != LockWrite) { // Proceed with handshake. return false; } if (asyncRequest != null) { asyncRequest.Buffer = buffer; _queuedWriteStateRequest = asyncRequest; return true; } lazyResult = new LazyAsyncResult(null, null, /*must be*/null); _queuedWriteStateRequest = lazyResult; } lazyResult.InternalWaitForCompletion(); return false; }
// Returns: // true - operation queued // false - operation can proceed internal bool CheckEnqueueWrite(AsyncProtocolRequest asyncRequest) { // Clear previous request. _queuedWriteStateRequest = null; int lockState = Interlocked.CompareExchange(ref _lockWriteState, LockWrite, LockNone); if (lockState != LockHandshake) { // Proceed with write. return false; } LazyAsyncResult lazyResult = null; lock (this) { if (_lockWriteState != LockHandshake) { // Handshake has completed before we grabbed the lock. CheckThrow(true); return false; } _lockWriteState = LockPendingWrite; // Still pending, wait or enqueue. if (asyncRequest != null) { _queuedWriteStateRequest = asyncRequest; return true; } lazyResult = new LazyAsyncResult(null, null, /*must be */null); _queuedWriteStateRequest = lazyResult; } // Need to exit from lock before waiting. lazyResult.InternalWaitForCompletion(); CheckThrow(true); return false; }
// Returns: // -1 - proceed // 0 - queued // X - some bytes are ready, no need for IO internal int CheckEnqueueRead(byte[] buffer, int offset, int count, AsyncProtocolRequest request) { int lockState = Interlocked.CompareExchange(ref _lockReadState, LockRead, LockNone); if (lockState != LockHandshake) { // Proceed, no concurrent handshake is ongoing so no need for a lock. return CheckOldKeyDecryptedData(buffer, offset, count); } LazyAsyncResult lazyResult = null; lock (this) { int result = CheckOldKeyDecryptedData(buffer, offset, count); if (result != -1) { return result; } // Check again under lock. if (_lockReadState != LockHandshake) { // The other thread has finished before we grabbed the lock. _lockReadState = LockRead; return -1; } _lockReadState = LockPendingRead; if (request != null) { // Request queued. _queuedReadStateRequest = request; return 0; } lazyResult = new LazyAsyncResult(null, null, /*must be */ null); _queuedReadStateRequest = lazyResult; } // Need to exit from lock before waiting. lazyResult.InternalWaitForCompletion(); lock (this) { return CheckOldKeyDecryptedData(buffer, offset, count); } }
private bool CheckEnqueueHandshakeRead(ref byte[] buffer, AsyncProtocolRequest request) { LazyAsyncResult lazyResult = null; lock (this) { if (_lockReadState == LockPendingRead) { return false; } int lockState = Interlocked.Exchange(ref _lockReadState, LockHandshake); if (lockState != LockRead) { return false; } if (request != null) { _queuedReadStateRequest = request; return true; } lazyResult = new LazyAsyncResult(null, null, /*must be */ null); _queuedReadStateRequest = lazyResult; } // Need to exit from lock before waiting. lazyResult.InternalWaitForCompletion(); buffer = (byte[])lazyResult.Result; return false; }
// // private bool CheckEnqueueHandshakeRead(ref byte[] buffer, AsyncProtocolRequest request) { LazyAsyncResult lazyResult = null; lock (this) { if (_LockReadState == LockPendingRead) { // we own the whole process and will never let read to take over until completed. return false; } int lockState = Interlocked.Exchange(ref _LockReadState, LockHandshake); if (lockState != LockRead) { // we came first return false; } if (request != null) { // Request queued _QueuedReadStateRequest = request; return true; } lazyResult = new LazyAsyncResult(null, null,/*must be */ null); _QueuedReadStateRequest = lazyResult; } // need to exit from lock before waiting lazyResult.InternalWaitForCompletion(); buffer = (byte[])lazyResult.Result; return false; }