Code:
/ FXUpdate3074 / FXUpdate3074 / 1.1 / DEVDIV / depot / DevDiv / releases / whidbey / QFE / ndp / fx / src / xsp / System / Web / RequestTimeoutManager.cs / 3 / RequestTimeoutManager.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
/*
* Request timeout manager -- implements the request timeout mechanism
*/
namespace System.Web {
using System.Threading;
using System.Collections;
using System.Web.Util;
internal class RequestTimeoutManager {
private int _requestCount;
private DoubleLinkList[] _lists; // partitioned to avoid contention
private int _currentList;
private int _inProgressLock; // only 1 thread can be cancelling
private readonly TimeSpan _timerPeriod = new TimeSpan(0, 0, 15); // 15 second init precision
private Timer _timer;
internal RequestTimeoutManager() {
// initialize request lists
_requestCount = 0;
_lists = new DoubleLinkList[13];
for (int i = 0; i < _lists.Length; i++)
_lists[i] = new DoubleLinkList();
_currentList = 0;
// init lock
_inProgressLock = 0;
// create the timer
#if DBG
if (!Debug.IsTagPresent("Timer") || Debug.IsTagEnabled("Timer"))
#endif
{
_timer = new Timer(new TimerCallback(this.TimerCompletionCallback), null, _timerPeriod, _timerPeriod);
}
}
internal void Stop() {
// stop the timer
if (_timer != null) {
((IDisposable)_timer).Dispose();
_timer = null;
}
while (_inProgressLock != 0)
Thread.Sleep(100);
// cancel all cancelable requests
if (_requestCount > 0)
CancelTimedOutRequests(DateTime.UtcNow.AddYears(1)); //
}
private void TimerCompletionCallback(Object state) {
if (_requestCount > 0)
CancelTimedOutRequests(DateTime.UtcNow);
}
private void CancelTimedOutRequests(DateTime now) {
// only one thread can be doing it
if (Interlocked.CompareExchange(ref _inProgressLock, 1, 0) != 0)
return;
// collect them all into a separate list with minimal locking
ArrayList entries = new ArrayList(_requestCount); // size can change
DoubleLinkListEnumerator en;
for (int i = 0; i < _lists.Length; i++) {
lock (_lists[i]) {
en = _lists[i].GetEnumerator();
while (en.MoveNext())
entries.Add(en.GetDoubleLink());
en = null;
}
}
// walk through the collected list to timeout what's needed
int n = entries.Count;
for (int i = 0; i < n; i++)
((RequestTimeoutEntry)entries[i]).TimeoutIfNeeded(now);
// this thread is done -- unlock
Interlocked.Exchange(ref _inProgressLock, 0);
}
internal void Add(HttpContext context) {
if (context.TimeoutLink != null) {
((RequestTimeoutEntry)context.TimeoutLink).IncrementCount();
return;
}
// create new entry
RequestTimeoutEntry entry = new RequestTimeoutEntry(context);
// add it to the list
int i = _currentList++;
if (i >= _lists.Length) {
i = 0;
_currentList = 0;
}
entry.AddToList(_lists[i]);
Interlocked.Increment(ref _requestCount);
// update HttpContext
context.TimeoutLink = entry;
}
internal void Remove(HttpContext context) {
RequestTimeoutEntry entry = (RequestTimeoutEntry)context.TimeoutLink;
// remove from the list
if (entry != null) {
if( entry.DecrementCount() == 0 ) {
entry.RemoveFromList();
Interlocked.Decrement(ref _requestCount);
} else {
return;
}
}
// update HttpContext
context.TimeoutLink = null;
}
private class RequestTimeoutEntry : DoubleLink {
private HttpContext _context; // the request
private DoubleLinkList _list;
private int _count;
internal RequestTimeoutEntry(HttpContext context) {
_context = context;
_count = 1;
}
internal void AddToList(DoubleLinkList list) {
lock(list) {
list.InsertTail(this);
_list = list;
}
}
internal void RemoveFromList() {
if (_list != null) {
lock(_list) {
Remove();
_list = null;
}
}
}
internal void TimeoutIfNeeded(DateTime now) {
Thread thread = _context.MustTimeout(now);
if (thread != null) {
RemoveFromList();
thread.Abort(new HttpApplication.CancelModuleException(true));
}
}
internal void IncrementCount() {
Interlocked.Increment( ref _count );
}
internal int DecrementCount() {
return Interlocked.Decrement( ref _count );
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
/*
* Request timeout manager -- implements the request timeout mechanism
*/
namespace System.Web {
using System.Threading;
using System.Collections;
using System.Web.Util;
internal class RequestTimeoutManager {
private int _requestCount;
private DoubleLinkList[] _lists; // partitioned to avoid contention
private int _currentList;
private int _inProgressLock; // only 1 thread can be cancelling
private readonly TimeSpan _timerPeriod = new TimeSpan(0, 0, 15); // 15 second init precision
private Timer _timer;
internal RequestTimeoutManager() {
// initialize request lists
_requestCount = 0;
_lists = new DoubleLinkList[13];
for (int i = 0; i < _lists.Length; i++)
_lists[i] = new DoubleLinkList();
_currentList = 0;
// init lock
_inProgressLock = 0;
// create the timer
#if DBG
if (!Debug.IsTagPresent("Timer") || Debug.IsTagEnabled("Timer"))
#endif
{
_timer = new Timer(new TimerCallback(this.TimerCompletionCallback), null, _timerPeriod, _timerPeriod);
}
}
internal void Stop() {
// stop the timer
if (_timer != null) {
((IDisposable)_timer).Dispose();
_timer = null;
}
while (_inProgressLock != 0)
Thread.Sleep(100);
// cancel all cancelable requests
if (_requestCount > 0)
CancelTimedOutRequests(DateTime.UtcNow.AddYears(1)); //
}
private void TimerCompletionCallback(Object state) {
if (_requestCount > 0)
CancelTimedOutRequests(DateTime.UtcNow);
}
private void CancelTimedOutRequests(DateTime now) {
// only one thread can be doing it
if (Interlocked.CompareExchange(ref _inProgressLock, 1, 0) != 0)
return;
// collect them all into a separate list with minimal locking
ArrayList entries = new ArrayList(_requestCount); // size can change
DoubleLinkListEnumerator en;
for (int i = 0; i < _lists.Length; i++) {
lock (_lists[i]) {
en = _lists[i].GetEnumerator();
while (en.MoveNext())
entries.Add(en.GetDoubleLink());
en = null;
}
}
// walk through the collected list to timeout what's needed
int n = entries.Count;
for (int i = 0; i < n; i++)
((RequestTimeoutEntry)entries[i]).TimeoutIfNeeded(now);
// this thread is done -- unlock
Interlocked.Exchange(ref _inProgressLock, 0);
}
internal void Add(HttpContext context) {
if (context.TimeoutLink != null) {
((RequestTimeoutEntry)context.TimeoutLink).IncrementCount();
return;
}
// create new entry
RequestTimeoutEntry entry = new RequestTimeoutEntry(context);
// add it to the list
int i = _currentList++;
if (i >= _lists.Length) {
i = 0;
_currentList = 0;
}
entry.AddToList(_lists[i]);
Interlocked.Increment(ref _requestCount);
// update HttpContext
context.TimeoutLink = entry;
}
internal void Remove(HttpContext context) {
RequestTimeoutEntry entry = (RequestTimeoutEntry)context.TimeoutLink;
// remove from the list
if (entry != null) {
if( entry.DecrementCount() == 0 ) {
entry.RemoveFromList();
Interlocked.Decrement(ref _requestCount);
} else {
return;
}
}
// update HttpContext
context.TimeoutLink = null;
}
private class RequestTimeoutEntry : DoubleLink {
private HttpContext _context; // the request
private DoubleLinkList _list;
private int _count;
internal RequestTimeoutEntry(HttpContext context) {
_context = context;
_count = 1;
}
internal void AddToList(DoubleLinkList list) {
lock(list) {
list.InsertTail(this);
_list = list;
}
}
internal void RemoveFromList() {
if (_list != null) {
lock(_list) {
Remove();
_list = null;
}
}
}
internal void TimeoutIfNeeded(DateTime now) {
Thread thread = _context.MustTimeout(now);
if (thread != null) {
RemoveFromList();
thread.Abort(new HttpApplication.CancelModuleException(true));
}
}
internal void IncrementCount() {
Interlocked.Increment( ref _count );
}
internal int DecrementCount() {
return Interlocked.Decrement( ref _count );
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- TypeReference.cs
- FontFamilyValueSerializer.cs
- DebugHandleTracker.cs
- DataGridViewCellStyleConverter.cs
- TextFragmentEngine.cs
- DataObjectFieldAttribute.cs
- CompleteWizardStep.cs
- QueryStringHandler.cs
- ImpersonateTokenRef.cs
- OdbcCommand.cs
- ParserOptions.cs
- TypographyProperties.cs
- EventLogger.cs
- InputGestureCollection.cs
- Relationship.cs
- Switch.cs
- MediaContextNotificationWindow.cs
- ResourceDescriptionAttribute.cs
- ThreadInterruptedException.cs
- WebPartZone.cs
- DataTemplateSelector.cs
- MimePart.cs
- TogglePattern.cs
- XmlChoiceIdentifierAttribute.cs
- ListDictionaryInternal.cs
- XmlQualifiedNameTest.cs
- TrackingAnnotationCollection.cs
- Util.cs
- SqlInternalConnection.cs
- FlowDocument.cs
- BitmapEffectGroup.cs
- TypeNameHelper.cs
- IriParsingElement.cs
- UniqueIdentifierService.cs
- ChannelOptions.cs
- ProtocolElement.cs
- Guid.cs
- CompilerState.cs
- FontUnitConverter.cs
- SafeCryptContextHandle.cs
- ClientSettingsStore.cs
- RichTextBox.cs
- StorageRoot.cs
- SoapSchemaImporter.cs
- ChildChangedEventArgs.cs
- GreenMethods.cs
- DataBindingsDialog.cs
- QueryParameter.cs
- CacheSection.cs
- Label.cs
- SerialErrors.cs
- FixedSchema.cs
- SendSecurityHeaderElement.cs
- DynamicILGenerator.cs
- WindowsSolidBrush.cs
- TableCell.cs
- Line.cs
- ProfilePropertySettingsCollection.cs
- MenuItemStyleCollection.cs
- AvTraceFormat.cs
- ExecutedRoutedEventArgs.cs
- MultiViewDesigner.cs
- RepeaterCommandEventArgs.cs
- CodeGen.cs
- ObjectDataSourceSelectingEventArgs.cs
- ResolvedKeyFrameEntry.cs
- Setter.cs
- SortedList.cs
- ListSourceHelper.cs
- DockAndAnchorLayout.cs
- WindowsStreamSecurityUpgradeProvider.cs
- OleAutBinder.cs
- CleanUpVirtualizedItemEventArgs.cs
- Triplet.cs
- EnumMember.cs
- WindowsGrip.cs
- TraceContextEventArgs.cs
- Rules.cs
- XmlAttributeCollection.cs
- XsdSchemaFileEditor.cs
- LocationSectionRecord.cs
- MsmqIntegrationAppDomainProtocolHandler.cs
- EventWaitHandleSecurity.cs
- _ContextAwareResult.cs
- IdentityNotMappedException.cs
- AttributeAction.cs
- ItemsChangedEventArgs.cs
- WebBaseEventKeyComparer.cs
- GACMembershipCondition.cs
- PhysicalFontFamily.cs
- Trustee.cs
- TextWriterTraceListener.cs
- GradientBrush.cs
- KeyNotFoundException.cs
- UserControlFileEditor.cs
- ToolboxDataAttribute.cs
- NativeMethods.cs
- NameValuePair.cs
- ProcessHostConfigUtils.cs
- SiteMapNodeItemEventArgs.cs