Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Net / System / Net / _ScatterGatherBuffers.cs / 1 / _ScatterGatherBuffers.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
namespace System.Net {
using System;
using System.Collections;
internal class ScatterGatherBuffers {
private MemoryChunk headChunk; // = null;
private MemoryChunk currentChunk; // = null;
private int nextChunkLength = 1024; // this could be customized at construction time
private int totalLength; // = 0;
private int chunkCount; // = 0;
internal ScatterGatherBuffers() {
}
internal ScatterGatherBuffers(long totalSize)
{
// We know up front how much data is to be written.
if (totalSize > 0)
{
currentChunk = AllocateMemoryChunk(totalSize > Int32.MaxValue ? Int32.MaxValue : (int) totalSize);
}
}
internal BufferOffsetSize[] GetBuffers() {
if (Empty) {
return null;
}
GlobalLog.Print("ScatterGatherBuffers#" + ValidationHelper.HashString(this) + "::ToArray() chunkCount:" + chunkCount.ToString());
BufferOffsetSize[] array = new BufferOffsetSize[chunkCount];
int index = 0;
MemoryChunk thisMemoryChunk = headChunk;
while (thisMemoryChunk!=null) {
GlobalLog.Print("ScatterGatherBuffers#" + ValidationHelper.HashString(this) + "::ToArray() index:" + index.ToString() + " size:" + thisMemoryChunk.FreeOffset);
//
// buffer itself is referenced by the BufferOffsetSize struct, data is not copied
//
array[index] = new BufferOffsetSize(thisMemoryChunk.Buffer, 0, thisMemoryChunk.FreeOffset, false);
index++;
thisMemoryChunk = thisMemoryChunk.Next;
}
return array;
}
private bool Empty {
get {
return headChunk==null || chunkCount==0;
}
}
internal int Length {
get {
return totalLength;
}
}
internal void Write(byte[] buffer, int offset, int count) {
GlobalLog.Print("ScatterGatherBuffers#" + ValidationHelper.HashString(this) + "::Add() count:" + count.ToString());
while (count > 0) {
//
// compute available space in current allocated buffer (0 if there's no buffer)
//
int available = Empty ? 0 : currentChunk.Buffer.Length - currentChunk.FreeOffset;
GlobalLog.Assert(available >= 0, "ScatterGatherBuffers::Add()|available < 0");
//
// if the current chunk is is full, allocate a new one
//
if (available==0) {
// ask for at least count bytes so that we need at most one allocation
MemoryChunk newChunk = AllocateMemoryChunk(count);
if (currentChunk!=null) {
currentChunk.Next = newChunk;
}
//
// move ahead in the linked list (or at the beginning if this is the fist buffer)
//
currentChunk = newChunk;
}
int copyCount = count < available ? count : available;
Buffer.BlockCopy(
buffer, // src
offset, // src index
currentChunk.Buffer, // dest
currentChunk.FreeOffset, // dest index
copyCount ); // total size to copy
//
// update offsets and counts
//
offset += copyCount;
count -= copyCount;
totalLength += copyCount;
currentChunk.FreeOffset += copyCount;
}
GlobalLog.Print("ScatterGatherBuffers#" + ValidationHelper.HashString(this) + "::Add() totalLength:" + totalLength.ToString());
}
private MemoryChunk AllocateMemoryChunk(int newSize) {
if (newSize > nextChunkLength) {
nextChunkLength = newSize;
}
MemoryChunk newChunk = new MemoryChunk(nextChunkLength);
if (Empty) {
headChunk = newChunk;
}
//
// next time allocate twice as much. check fot possible overflows
//
nextChunkLength *= 2;
//
// update number of chunks in the linked list
//
chunkCount++;
GlobalLog.Print("ScatterGatherBuffers#" + ValidationHelper.HashString(this) + "::AllocateMemoryChunk() chunkCount:" + chunkCount.ToString() + " nextChunkLength:" + nextChunkLength.ToString());
return newChunk;
}
private class MemoryChunk {
internal byte[] Buffer;
internal int FreeOffset; // = 0
internal MemoryChunk Next; // = null
internal MemoryChunk(int bufferSize) {
Buffer = new byte[bufferSize];
}
}
} // class ScatterGatherBuffers
} // namespace System.Net
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- MdImport.cs
- AssociationTypeEmitter.cs
- Table.cs
- MediaEntryAttribute.cs
- CreateInstanceBinder.cs
- Paragraph.cs
- LostFocusEventManager.cs
- ClientReliableChannelBinder.cs
- XmlSchemas.cs
- InvalidContentTypeException.cs
- WebScriptEnablingBehavior.cs
- PromptEventArgs.cs
- precedingsibling.cs
- DBSchemaRow.cs
- WMIInterop.cs
- CompiledAction.cs
- LambdaCompiler.Expressions.cs
- TransformerInfoCollection.cs
- ValidationSummary.cs
- PropertyMetadata.cs
- EntityViewGenerationAttribute.cs
- CodeVariableReferenceExpression.cs
- GridItemProviderWrapper.cs
- EventToken.cs
- SecurityChannelListener.cs
- ProjectionRewriter.cs
- XmlMapping.cs
- UserNameSecurityTokenProvider.cs
- WebExceptionStatus.cs
- ReadOnlyNameValueCollection.cs
- OperationCanceledException.cs
- DurableRuntimeValidator.cs
- TransactionChannelFaultConverter.cs
- SyncOperationState.cs
- ContentType.cs
- PagesChangedEventArgs.cs
- DynamicActionMessageFilter.cs
- MissingMethodException.cs
- NameValueFileSectionHandler.cs
- TableCell.cs
- ExclusiveCanonicalizationTransform.cs
- BinarySerializer.cs
- MailHeaderInfo.cs
- XmlRawWriter.cs
- XmlNodeChangedEventArgs.cs
- CaseInsensitiveHashCodeProvider.cs
- ApplicationHost.cs
- DirectoryObjectSecurity.cs
- DataGridViewMethods.cs
- TabPage.cs
- ProgressPage.cs
- MimeMapping.cs
- ViewEventArgs.cs
- TimelineCollection.cs
- MulticastOption.cs
- ContentOperations.cs
- HttpServerVarsCollection.cs
- ProfessionalColors.cs
- ConsumerConnectionPointCollection.cs
- SchemaEntity.cs
- ActivityCodeDomSerializationManager.cs
- LoginCancelEventArgs.cs
- OracleMonthSpan.cs
- clipboard.cs
- InputScopeManager.cs
- BaseCollection.cs
- HandlerMappingMemo.cs
- SyndicationDeserializer.cs
- SimplePropertyEntry.cs
- TransformedBitmap.cs
- SqlRowUpdatingEvent.cs
- ListViewItemEventArgs.cs
- GenerateTemporaryTargetAssembly.cs
- TextEditorCharacters.cs
- StringValueSerializer.cs
- Int64.cs
- MaterialGroup.cs
- FocusWithinProperty.cs
- OleDbPermission.cs
- UrlMappingCollection.cs
- AdPostCacheSubstitution.cs
- Trigger.cs
- SolidBrush.cs
- FormsAuthenticationModule.cs
- Parser.cs
- ControlDesigner.cs
- SelectionUIHandler.cs
- QuotedPairReader.cs
- PTUtility.cs
- InternalBufferOverflowException.cs
- XmlBinaryReader.cs
- WsdlWriter.cs
- XmlWriterSettings.cs
- PageAsyncTaskManager.cs
- LinqDataSource.cs
- documentsequencetextpointer.cs
- DiscoveryDocumentLinksPattern.cs
- GenericUriParser.cs
- ToolboxDataAttribute.cs
- XmlLinkedNode.cs