Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / ManagedLibraries / Remoting / Channels / CORE / ByteBufferPool.cs / 1305376 / ByteBufferPool.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
//==========================================================================
// File: ByteBufferPool.cs
//
// Summary: Stream used for reading from a socket by remoting channels.
//
//=========================================================================
using System;
using System.Threading;
namespace System.IO
{
internal interface IByteBufferPool
{
byte[] GetBuffer();
void ReturnBuffer(byte[] buffer);
}
// This isn't actually a buffer pool. It always creates a new byte buffer.
internal class ByteBufferAllocator : IByteBufferPool
{
private int _bufferSize;
public ByteBufferAllocator(int bufferSize)
{
_bufferSize = bufferSize;
}
public byte[] GetBuffer()
{
return new byte[_bufferSize];
}
public void ReturnBuffer(byte[] buffer)
{
}
} // ByteBufferAllocator
internal class ByteBufferPool : IByteBufferPool
{
private byte[][] _bufferPool = null;
private int _current; // -1 for none
private int _last;
private int _max; // maximum number of buffers to pool
private int _bufferSize;
private Object _controlCookie = "cookie object";
public ByteBufferPool(int maxBuffers, int bufferSize)
{
_max = maxBuffers;
_bufferPool = new byte[_max][];
_bufferSize = bufferSize;
_current = -1;
_last = -1;
} // ByteBufferPool
public byte[] GetBuffer()
{
Object cookie = null;
try
{
// If a ThreadAbortException gets thrown after the exchange,
// but before the result is assigned to cookie, then the
// control cookie is lost forever. However, the buffer pool
// will still function normally and return everybody a new
// buffer each time (that isn't very likely to happen,
// so we don't really care).
cookie = Interlocked.Exchange(ref _controlCookie, null);
if (cookie != null)
{
// we have the control cookie, so take a buffer
if (_current == -1)
{
_controlCookie = cookie;
// no pooled buffers available
return new byte[_bufferSize];
}
else
{
// grab next available buffer
byte[] buffer = _bufferPool[_current];
_bufferPool[_current] = null;
// update "current" index
if (_current == _last)
{
// this is the last free buffer
_current = -1;
}
else
{
_current = (_current + 1) % _max;
}
_controlCookie = cookie;
return buffer;
}
}
else
{
// we don't have the control cookie, so just create a new buffer since
// there will probably be a lot of contention anyway.
return new byte[_bufferSize];
}
}
catch (ThreadAbortException)
{
if (cookie != null)
{
// This should be rare, so just reset
// everything to the initial state.
_current = -1;
_last = -1;
// restore cookie
_controlCookie = cookie;
}
throw;
}
} // GetBuffer
public void ReturnBuffer(byte[] buffer)
{
if (buffer == null)
throw new ArgumentNullException("buffer");
// The purpose of the buffer pool is to try to reduce the
// amount of garbage generated, so it doesn't matter if
// the buffer gets tossed out. Since we don't want to
// take the perf hit of taking a lock, we only return
// the buffer if we can grab the control cookie.
Object cookie = null;
try
{
// If a ThreadAbortException gets thrown after the exchange,
// but before the result is assigned to cookie, then the
// control cookie is lost forever. However, the buffer pool
// will still function normally and return everybody a new
// buffer each time (that isn't very likely to happen,
// so we don't really care).
cookie = Interlocked.Exchange(ref _controlCookie, null);
if (cookie != null)
{
if (_current == -1)
{
_bufferPool[0] = buffer;
_current = 0;
_last = 0;
}
else
{
int newLast = (_last + 1) % _max;
if (newLast != _current)
{
// the pool isn't full so store this buffer
_last = newLast;
_bufferPool[_last] = buffer;
}
}
_controlCookie = cookie;
}
}
catch (ThreadAbortException)
{
if (cookie != null)
{
// This should be rare, so just reset
// everything to the initial state.
_current = -1;
_last = -1;
// restore cookie
_controlCookie = cookie;
}
throw;
}
} // ReturnBuffer
} // ByteBufferPool
} // namespace System.IO
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Boolean.cs
- ModelPropertyImpl.cs
- SafeEventLogWriteHandle.cs
- DropSource.cs
- TableRow.cs
- Vector3dCollection.cs
- NativeMethods.cs
- _NtlmClient.cs
- WinEventTracker.cs
- ProcessModuleCollection.cs
- PerformanceCounterPermission.cs
- HitTestParameters3D.cs
- OdbcDataReader.cs
- ParseHttpDate.cs
- DataObjectPastingEventArgs.cs
- ToolStripPanelCell.cs
- SQLMembershipProvider.cs
- ChoiceConverter.cs
- TableCellCollection.cs
- DrawListViewSubItemEventArgs.cs
- _Semaphore.cs
- DbProviderSpecificTypePropertyAttribute.cs
- ValidationError.cs
- LineInfo.cs
- ConsoleKeyInfo.cs
- TextRunCache.cs
- InputMethodStateChangeEventArgs.cs
- EntityContainer.cs
- AutomationPropertyInfo.cs
- InputProviderSite.cs
- NavigationWindowAutomationPeer.cs
- NumberAction.cs
- HelpEvent.cs
- Journal.cs
- DefaultShape.cs
- Wildcard.cs
- TextTreeNode.cs
- Pool.cs
- CatalogPartChrome.cs
- ContentTypeSettingDispatchMessageFormatter.cs
- OleDbRowUpdatedEvent.cs
- AppModelKnownContentFactory.cs
- AssemblyNameProxy.cs
- RewritingPass.cs
- OleDbCommand.cs
- HighContrastHelper.cs
- XamlSerializerUtil.cs
- HotSpot.cs
- MsmqAppDomainProtocolHandler.cs
- SeekableReadStream.cs
- TypeGeneratedEventArgs.cs
- BaseParagraph.cs
- ClientSettings.cs
- Parser.cs
- EntityDataSourceDesignerHelper.cs
- FontStretches.cs
- FontWeights.cs
- DesignBindingConverter.cs
- DesignerView.Commands.cs
- Msmq4PoisonHandler.cs
- LocationUpdates.cs
- DesignerSerializationOptionsAttribute.cs
- XmlDictionary.cs
- HelloMessageCD1.cs
- DocumentSequenceHighlightLayer.cs
- XmlSchemaAppInfo.cs
- NetCodeGroup.cs
- DbConnectionStringCommon.cs
- EntityTypeEmitter.cs
- pingexception.cs
- LinqDataSourceEditData.cs
- PathGeometry.cs
- Point3D.cs
- ObjectDataSourceMethodEventArgs.cs
- EventItfInfo.cs
- TypeSchema.cs
- TreeView.cs
- MergeFailedEvent.cs
- Binding.cs
- FreezableDefaultValueFactory.cs
- HttpRequestCacheValidator.cs
- WindowsButton.cs
- HttpRequest.cs
- SafeUserTokenHandle.cs
- CollectionAdapters.cs
- TypeInfo.cs
- VarInfo.cs
- ProxyElement.cs
- ScalarConstant.cs
- Hex.cs
- OleDbSchemaGuid.cs
- EntityException.cs
- Int16AnimationBase.cs
- RootAction.cs
- ControlBuilder.cs
- DSASignatureFormatter.cs
- Operators.cs
- TextDpi.cs
- XmlDocumentViewSchema.cs
- ItemCollectionEditor.cs