Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / ndp / fx / src / xsp / System / Web / PartitionResolver.cs / 3 / PartitionResolver.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- namespace System.Web { using System; using System.Configuration; using System.Collections; using System.Threading; using System.IO; using System.Web; using System.Web.Caching; using System.Web.Util; using System.Data; using System.Data.SqlClient; using System.Text; using System.Security.Principal; using System.Xml; using System.Collections.Specialized; using System.Configuration.Provider; using System.Globalization; using System.Web.Management; using System.Web.Hosting; using System.Web.Configuration; using System.Security.Permissions; [AspNetHostingPermission(SecurityAction.LinkDemand, Level=AspNetHostingPermissionLevel.Minimal)] [AspNetHostingPermission(SecurityAction.InheritanceDemand, Level=AspNetHostingPermissionLevel.Minimal)] public interface IPartitionResolver { void Initialize(); string ResolvePartition(Object key); } internal interface IPartitionInfo { string GetTracingPartitionString(); } internal delegate IPartitionInfo CreatePartitionInfo(string connectionString); class PartitionManager : IDisposable { internal PartitionManager(CreatePartitionInfo createCallback) { _createCallback = createCallback; } HybridDictionary _partitions = new HybridDictionary(); ReaderWriterLock _lock = new ReaderWriterLock(); CreatePartitionInfo _createCallback; internal object GetPartition(IPartitionResolver partitionResolver, string id) { if (EtwTrace.IsTraceEnabled(EtwTraceLevel.Verbose, EtwTraceFlags.Infrastructure)) EtwTrace.Trace(EtwTraceType.ETW_TYPE_SESSIONSTATE_PARTITION_START, HttpContext.Current.WorkerRequest, partitionResolver.GetType().FullName, id); string partitionString = null; string errorMessage = null; IPartitionInfo partitionInfo = null; try { try { partitionString = partitionResolver.ResolvePartition(id); if (partitionString == null) { throw new HttpException( SR.GetString(SR.Bad_partition_resolver_connection_string, partitionResolver.GetType().FullName)); } } catch (Exception e) { errorMessage = e.Message; throw; } try { _lock.AcquireReaderLock(-1); partitionInfo = (IPartitionInfo)_partitions[partitionString]; if (partitionInfo != null) { Debug.Trace("PartitionManager", "id=" + id + "; partitionString=" + partitionString); return partitionInfo; } } finally { if (_lock.IsReaderLockHeld) { _lock.ReleaseReaderLock(); } } // Not found. Has to add it. try { _lock.AcquireWriterLock(-1); // One more time partitionInfo = (IPartitionInfo)_partitions[partitionString]; if (partitionInfo == null) { partitionInfo = _createCallback(partitionString); Debug.Trace("PartitionManager", "Add a new partition; id=" + id + "; partitionString=" + partitionString); _partitions.Add(partitionString, partitionInfo); } Debug.Trace("PartitionManager", "id=" + id + "; partitionString=" + partitionString); return partitionInfo; } finally { if (_lock.IsWriterLockHeld) { _lock.ReleaseWriterLock(); } } } finally { if (EtwTrace.IsTraceEnabled(EtwTraceLevel.Verbose, EtwTraceFlags.Infrastructure)) { string msg = errorMessage; if (msg == null) { if (partitionInfo != null) { msg = partitionInfo.GetTracingPartitionString(); } else { msg = String.Empty; } } EtwTrace.Trace(EtwTraceType.ETW_TYPE_SESSIONSTATE_PARTITION_END, HttpContext.Current.WorkerRequest, msg); } } } public void Dispose() { if (_partitions == null) { return; } try { _lock.AcquireWriterLock(-1); if (_partitions != null) { foreach (PartitionInfo partitionInfo in _partitions.Values) { partitionInfo.Dispose(); } _partitions = null; } } catch { // ignore exceptions in dispose } finally { if (_lock.IsWriterLockHeld) { _lock.ReleaseWriterLock(); } } } } internal class PartitionInfo : IDisposable, IPartitionInfo { ResourcePool _rpool; internal PartitionInfo(ResourcePool rpool) { _rpool = rpool; } internal object RetrieveResource() { return _rpool.RetrieveResource(); } internal void StoreResource(IDisposable o) { _rpool.StoreResource(o); } protected virtual string TracingPartitionString { get { return String.Empty; } } string IPartitionInfo.GetTracingPartitionString() { return TracingPartitionString; } public void Dispose() { if (_rpool == null) { return; } lock (this) { if (_rpool != null) { _rpool.Dispose(); _rpool = null; } } } }; }
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- ObservableDictionary.cs
- Point3DAnimation.cs
- CursorConverter.cs
- OciLobLocator.cs
- HttpApplicationFactory.cs
- UiaCoreProviderApi.cs
- ImageList.cs
- StrokeFIndices.cs
- HtmlUtf8RawTextWriter.cs
- MobileListItem.cs
- DeploymentSection.cs
- DesignerVerb.cs
- OpenTypeLayout.cs
- SecureStringHasher.cs
- BrowserDefinitionCollection.cs
- SelectingProviderEventArgs.cs
- wgx_commands.cs
- CodeArgumentReferenceExpression.cs
- Match.cs
- CellParaClient.cs
- DataGridDefaultColumnWidthTypeConverter.cs
- LinqToSqlWrapper.cs
- WebPartDisplayMode.cs
- CacheEntry.cs
- RelOps.cs
- TrayIconDesigner.cs
- CompiledIdentityConstraint.cs
- FormViewRow.cs
- NullReferenceException.cs
- StateWorkerRequest.cs
- SqlDuplicator.cs
- StringValueConverter.cs
- EventLogPermissionEntry.cs
- ImageCodecInfoPrivate.cs
- TraceProvider.cs
- CodeGroup.cs
- DefaultSettingsSection.cs
- AssemblyHelper.cs
- TypeBrowser.xaml.cs
- ControlOperationInvoker.cs
- TransformedBitmap.cs
- DirtyTextRange.cs
- DbConnectionPool.cs
- DocumentXmlWriter.cs
- ManualResetEvent.cs
- GetResponse.cs
- MailHeaderInfo.cs
- ExtendedPropertyDescriptor.cs
- URLEditor.cs
- WindowsScrollBar.cs
- QuaternionRotation3D.cs
- CodeArrayIndexerExpression.cs
- DataSet.cs
- UpWmlMobileTextWriter.cs
- TableRowCollection.cs
- ServiceContractGenerator.cs
- DataBoundControlDesigner.cs
- ExpressionBuilder.cs
- LinqDataSourceDisposeEventArgs.cs
- PixelFormat.cs
- RegexStringValidatorAttribute.cs
- ContentType.cs
- TrackingLocation.cs
- AbstractDataSvcMapFileLoader.cs
- ServiceNotStartedException.cs
- CodeTypeMemberCollection.cs
- XmlDownloadManager.cs
- CodeSnippetStatement.cs
- ProxyHwnd.cs
- BindingManagerDataErrorEventArgs.cs
- StringExpressionSet.cs
- CompressStream.cs
- StreamGeometry.cs
- WmpBitmapEncoder.cs
- SqlCacheDependency.cs
- GroupByExpressionRewriter.cs
- RegexReplacement.cs
- SignedXmlDebugLog.cs
- InfoCardRSAPKCS1SignatureFormatter.cs
- MailWebEventProvider.cs
- ProviderConnectionPointCollection.cs
- CodeMemberField.cs
- ValidationError.cs
- RegisteredExpandoAttribute.cs
- BoundField.cs
- TcpProcessProtocolHandler.cs
- CriticalExceptions.cs
- IISMapPath.cs
- CertificateReferenceElement.cs
- Renderer.cs
- JoinGraph.cs
- WindowsUpDown.cs
- FormViewInsertedEventArgs.cs
- FrameworkElement.cs
- TypeElement.cs
- TreeIterator.cs
- BindableTemplateBuilder.cs
- EditorPartCollection.cs
- ListManagerBindingsCollection.cs
- RowCache.cs