Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / xsp / System / Web / RequestTimeoutManager.cs / 1 / 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)); // future date
}
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.
//
//-----------------------------------------------------------------------------
/*
* 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)); // future date
}
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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- Rotation3D.cs
- ProfilePropertySettingsCollection.cs
- WebPartConnectionsConnectVerb.cs
- ResourceContainer.cs
- CallTemplateAction.cs
- FormParameter.cs
- XsdDuration.cs
- MemberAssignmentAnalysis.cs
- DataGridViewColumnCollection.cs
- DictionaryEntry.cs
- IItemProperties.cs
- SystemNetworkInterface.cs
- SqlDataSourceCommandEventArgs.cs
- RelOps.cs
- SystemSounds.cs
- TemplateGroupCollection.cs
- DateTimeStorage.cs
- FrameworkElementFactory.cs
- ISAPIRuntime.cs
- DiscoveryInnerClientAdhocCD1.cs
- ClientScriptManager.cs
- CompiledIdentityConstraint.cs
- ImageMetadata.cs
- RouteItem.cs
- RawAppCommandInputReport.cs
- Parser.cs
- Update.cs
- ClientProxyGenerator.cs
- LambdaCompiler.Address.cs
- ElementsClipboardData.cs
- WebRequest.cs
- ActionMessageFilterTable.cs
- EpmCustomContentDeSerializer.cs
- TypedReference.cs
- ZipIOCentralDirectoryFileHeader.cs
- WindowHideOrCloseTracker.cs
- IDQuery.cs
- ServiceDescriptionSerializer.cs
- GAC.cs
- ObjectItemCachedAssemblyLoader.cs
- TimelineCollection.cs
- EditingCoordinator.cs
- Missing.cs
- GridLengthConverter.cs
- BitArray.cs
- PermissionAttributes.cs
- _ProxyRegBlob.cs
- TransformDescriptor.cs
- ForeignConstraint.cs
- DataGridViewTextBoxCell.cs
- LicenseProviderAttribute.cs
- Int32Animation.cs
- SystemThemeKey.cs
- PageContent.cs
- OptionUsage.cs
- DragCompletedEventArgs.cs
- PersonalizationProvider.cs
- FunctionNode.cs
- HtmlUtf8RawTextWriter.cs
- PropertyDescriptorCollection.cs
- SpecialNameAttribute.cs
- AutomationFocusChangedEventArgs.cs
- IncomingWebRequestContext.cs
- MethodBuilderInstantiation.cs
- DataGridViewCellFormattingEventArgs.cs
- ValidatingPropertiesEventArgs.cs
- ListViewItemMouseHoverEvent.cs
- ProviderCommandInfoUtils.cs
- IODescriptionAttribute.cs
- _Rfc2616CacheValidators.cs
- MultiPropertyDescriptorGridEntry.cs
- PanelDesigner.cs
- RegexWorker.cs
- ScriptControl.cs
- ClientTarget.cs
- DeviceSpecificChoiceCollection.cs
- ImageMapEventArgs.cs
- Journal.cs
- CodeSubDirectory.cs
- NativeMethods.cs
- SizeAnimationClockResource.cs
- DefaultWorkflowLoaderService.cs
- EntitySetRetriever.cs
- webbrowsersite.cs
- Fonts.cs
- GregorianCalendar.cs
- AutomationProperties.cs
- XPathArrayIterator.cs
- LoadedOrUnloadedOperation.cs
- DispatchChannelSink.cs
- DropShadowBitmapEffect.cs
- DashStyle.cs
- FontStretches.cs
- IdleTimeoutMonitor.cs
- XmlSchemaCollection.cs
- MulticastIPAddressInformationCollection.cs
- GenericWebPart.cs
- Metafile.cs
- ConstraintConverter.cs
- InkCanvasFeedbackAdorner.cs