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
- SpecularMaterial.cs
- KeySpline.cs
- CacheMemory.cs
- PageAction.cs
- CompModSwitches.cs
- Transform3DGroup.cs
- XmlEventCache.cs
- MsmqIntegrationSecurityMode.cs
- WindowsScrollBar.cs
- EncoderBestFitFallback.cs
- MemoryFailPoint.cs
- LostFocusEventManager.cs
- PageAsyncTask.cs
- JulianCalendar.cs
- ObjectNotFoundException.cs
- ToolStripOverflow.cs
- LocalizableResourceBuilder.cs
- RepeaterCommandEventArgs.cs
- CodeArrayIndexerExpression.cs
- Metafile.cs
- InternalCache.cs
- WindowsGraphicsWrapper.cs
- AppearanceEditorPart.cs
- GatewayDefinition.cs
- VerbConverter.cs
- ContextProperty.cs
- ErrorWebPart.cs
- PreparingEnlistment.cs
- Selection.cs
- KoreanLunisolarCalendar.cs
- DataGridViewLinkCell.cs
- Triplet.cs
- PointUtil.cs
- Geometry.cs
- IPGlobalProperties.cs
- DbTransaction.cs
- XmlHierarchicalEnumerable.cs
- TextEditorDragDrop.cs
- DynamicDiscoSearcher.cs
- filewebrequest.cs
- AutomationFocusChangedEventArgs.cs
- ToggleButton.cs
- KeyboardDevice.cs
- Journaling.cs
- XhtmlBasicListAdapter.cs
- TableLayoutPanel.cs
- SqlBooleanMismatchVisitor.cs
- PassportAuthenticationEventArgs.cs
- ScrollEvent.cs
- RowTypePropertyElement.cs
- SQLInt32Storage.cs
- MimeObjectFactory.cs
- RequestCachePolicy.cs
- SourceLineInfo.cs
- ProxyWebPart.cs
- IsolatedStoragePermission.cs
- DataColumnCollection.cs
- UserPersonalizationStateInfo.cs
- StylusShape.cs
- HostSecurityManager.cs
- StateChangeEvent.cs
- IconHelper.cs
- Pkcs7Signer.cs
- EntityDataSourceReferenceGroup.cs
- StorageScalarPropertyMapping.cs
- Padding.cs
- PersonalizationState.cs
- CachedPathData.cs
- uribuilder.cs
- CustomWebEventKey.cs
- PocoEntityKeyStrategy.cs
- TextViewDesigner.cs
- WhitespaceSignificantCollectionAttribute.cs
- ConstructorNeedsTagAttribute.cs
- AuthenticationService.cs
- FixedDocument.cs
- FormViewUpdateEventArgs.cs
- TableHeaderCell.cs
- BufferedGraphics.cs
- DynamicScriptObject.cs
- Page.cs
- LOSFormatter.cs
- COAUTHIDENTITY.cs
- Clause.cs
- HyperLinkColumn.cs
- UnmanagedMemoryAccessor.cs
- JsonReaderDelegator.cs
- MarginsConverter.cs
- Operator.cs
- ChameleonKey.cs
- UnhandledExceptionEventArgs.cs
- SecurityHelper.cs
- TextContainerHelper.cs
- ImagingCache.cs
- Triplet.cs
- AccessKeyManager.cs
- NTAccount.cs
- DbConnectionPoolGroup.cs
- RegionData.cs
- MethodAccessException.cs