public Task <bool> TryWriteSafeAsync(T item) { lock (_sync) { if (TryWriteSafe(item)) { return(TaskConstants.True); } if (_writeCompletion.Task.IsCompleted) { return(TaskConstants.False); } var queuedWrite = new QueuedWrite(item); _writeQueue.Enqueue(queuedWrite); _balance++; OnBalanceChanged(); return(queuedWrite.Task); } }
private void PushWrite(ref QueuedWrite write) { if (writeQueue == null) { writeQueue = new QueuedWrite[16]; writeCount = 0; } else if (writeQueue.Length == writeCount) { var queuedWriteArray = new QueuedWrite[writeQueue.Length*2]; System.Array.Copy(writeQueue, 0, queuedWriteArray, 0, writeQueue.Length); for (var index = 0; index < writeQueue.Length; ++index) { writeQueue[index] = new QueuedWrite(); } writeQueue = queuedWriteArray; } if (writeCount != 0) writeQueue[writeCount - 1] = currentWrite; writeQueue[writeCount++] = write; currentWrite = write; }
private void FlushWriteQueue() { if (writeCount != 0) writeQueue[writeCount - 1] = currentWrite; for (var index = 0; index < writeCount; ++index) { data.Write(writeQueue[index].Data, writeQueue[index].Offset, writeQueue[index].Count); writeQueue[index] = new QueuedWrite(); } writeCount = 0; }
internal void QueueWrite(byte[] data, int offset, int count) { bytesWritten += count; lineTermination = MimeCommon.AdvanceLineTerminationState(lineTermination, data, offset, count); if ((writeCount == 1 ? currentWrite.Length - currentWrite.Count : (writeCount == 0 ? QueuedWrite.QueuedWriteSize : 0)) >= count) { if (writeCount == 0) { var write = new QueuedWrite(); this.PushWrite(ref write); } currentWrite.Append(data, offset, count); } else { var write = new QueuedWrite(); if (count < QueuedWrite.QueuedWriteSize && writeCount > 0) write = currentWrite; this.FlushWriteQueue(); if (count < QueuedWrite.QueuedWriteSize && write.Length > 0) { write.Reset(); write.Append(data, offset, count); this.PushWrite(ref write); } else this.data.Write(data, offset, count); } }