Code:
/ WCF / WCF / 3.5.30729.1 / untmp / Orcas / SP / ndp / cdf / src / WCF / TransactionBridge / Microsoft / Transactions / Wsat / Protocol / LookupTables.cs / 1 / LookupTables.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- // This file contains all transaction and enlistment lookup tables for WS-AT using System; using System.Collections.Generic; using System.Diagnostics; using System.Threading; using Microsoft.Transactions.Bridge; using Microsoft.Transactions.Wsat.Messaging; namespace Microsoft.Transactions.Wsat.Protocol { class LookupTables { ProtocolState state; ReaderWriterLock transactionLock = new ReaderWriterLock(); ReaderWriterLock enlistmentLock = new ReaderWriterLock(); Dictionaryenlistments = new Dictionary (); Dictionary transactions = new Dictionary (); public LookupTables(ProtocolState state) { this.state = state; } // // Enlistments // public TransactionEnlistment FindEnlistment(Guid enlistmentId) { return Find (this.enlistments, this.enlistmentLock, enlistmentId); } public void AddEnlistment(TransactionEnlistment enlistment) { Add (this.enlistments, this.enlistmentLock, enlistment.EnlistmentId, enlistment); } public void RemoveEnlistment(TransactionEnlistment enlistment) { Remove (this.enlistments, this.enlistmentLock, enlistment.EnlistmentId, enlistment); } // // Transaction contexts // public TransactionContextManager FindTransactionContextManager(string contextId) { return Find (this.transactions, this.transactionLock, contextId); } public void AddTransactionContextManager(TransactionContextManager contextManager) { Add (this.transactions, this.transactionLock, contextManager.Identifier, contextManager); } public TransactionContextManager FindOrAddTransactionContextManager(TransactionContextManager contextManager, out bool found) { return FindOrAdd (this.transactions, this.transactionLock, contextManager.Identifier, contextManager, out found); } public void RemoveTransactionContextManager(TransactionContextManager contextManager) { Remove (this.transactions, this.transactionLock, contextManager.Identifier, contextManager); } // // Internal // void Add (Dictionary dictionary, ReaderWriterLock rwLock, T key, S value) { bool lockHeld = false; try { try { } finally { rwLock.AcquireWriterLock(Timeout.Infinite); lockHeld = true; } dictionary.Add(key, value); } finally { if (lockHeld) { rwLock.ReleaseWriterLock(); } } if (DebugTrace.Verbose) { int count = dictionary.Count; DebugTrace.Trace(TraceLevel.Verbose, "Added {0} {1} to lookup table. Table contains {2} object{3}", value.GetType().Name, value, count, count == 1 ? string.Empty : "s"); } } void Remove (Dictionary dictionary, ReaderWriterLock rwLock, T key, S value) { bool lockHeld = false; try { try { } finally { rwLock.AcquireWriterLock(Timeout.Infinite); lockHeld = true; } #if DEBUG S existing; if (dictionary.TryGetValue(key, out existing) && !ReferenceEquals(value, existing)) { // If the value exists but isn't the same value as the item passed in, // we have a bug. Reason: an assumption in the code is violated. DiagnosticUtility.DebugAssert("The lookup table contains a different object"); } #endif bool removed = dictionary.Remove(key); if (!(removed)) { // If the value doesn't exist in the dictionary, // we have a bug. Reason: an assumption in the code is violated. DiagnosticUtility.FailFast("The lookup table does not contain the object"); } } finally { if (lockHeld) { rwLock.ReleaseWriterLock(); } } if (DebugTrace.Verbose) { int count = dictionary.Count; DebugTrace.Trace(TraceLevel.Verbose, "Removed {0} {1} from lookup table. Table contains {2} object{3}", value.GetType().Name, value, count, count == 1 ? string.Empty : "s"); } } S Find (Dictionary dictionary, ReaderWriterLock rwLock, T key) where S : class { S value; bool lockHeld = false; try { try { } finally { rwLock.AcquireReaderLock(Timeout.Infinite); lockHeld = true; } if (!dictionary.TryGetValue(key, out value)) { value = null; } } finally { if (lockHeld) { rwLock.ReleaseReaderLock(); } } return value; } S FindOrAdd (Dictionary dictionary, ReaderWriterLock rwLock, T key, S value, out bool found) { S inserted; bool lockHeld = false; try { try { } finally { rwLock.AcquireWriterLock(Timeout.Infinite); lockHeld = true; } found = dictionary.TryGetValue(key, out inserted); if (!found) { dictionary.Add(key, value); inserted = value; } } finally { if (lockHeld) { rwLock.ReleaseWriterLock(); } } if (DebugTrace.Verbose && !found) { int count = dictionary.Count; DebugTrace.Trace(TraceLevel.Verbose, "Added {0} {1} to lookup table. Table contains {2} object{3}", value.GetType().Name, value, count, count == 1 ? string.Empty : "s"); } return inserted; } } } // 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
- ToolStripSplitStackLayout.cs
- ConfigurationLocationCollection.cs
- WebResourceUtil.cs
- XmlSchemaComplexType.cs
- CompModSwitches.cs
- Int64.cs
- ToolStripProfessionalLowResolutionRenderer.cs
- GridToolTip.cs
- xamlnodes.cs
- SelectingProviderEventArgs.cs
- StorageEndPropertyMapping.cs
- SchemaElement.cs
- FactoryGenerator.cs
- NamespaceList.cs
- QueryOutputWriter.cs
- WorkflowHostingResponseContext.cs
- TextContainerChangedEventArgs.cs
- TdsParserSafeHandles.cs
- TheQuery.cs
- DynamicScriptObject.cs
- XmlLanguage.cs
- AutomationPropertyChangedEventArgs.cs
- GridToolTip.cs
- ProxyHelper.cs
- FontCollection.cs
- UriScheme.cs
- ParallelEnumerable.cs
- BrushMappingModeValidation.cs
- SystemNetworkInterface.cs
- XmlCharCheckingWriter.cs
- PropertyGridCommands.cs
- ScriptModule.cs
- Table.cs
- TableAdapterManagerHelper.cs
- EnumConverter.cs
- DesignerGeometryHelper.cs
- TypeUtil.cs
- ConditionalAttribute.cs
- HwndSubclass.cs
- QEncodedStream.cs
- WebControlAdapter.cs
- ModifierKeysValueSerializer.cs
- ServiceContractGenerationContext.cs
- DragStartedEventArgs.cs
- TypeGeneratedEventArgs.cs
- SQLInt32.cs
- BStrWrapper.cs
- DataGridSortCommandEventArgs.cs
- ConcurrencyBehavior.cs
- DataGridColumnHeaderAutomationPeer.cs
- ProfileServiceManager.cs
- BooleanToVisibilityConverter.cs
- LeafCellTreeNode.cs
- StoreContentChangedEventArgs.cs
- PointConverter.cs
- ButtonBaseAutomationPeer.cs
- SqlMethodCallConverter.cs
- PTConverter.cs
- EDesignUtil.cs
- ProcessingInstructionAction.cs
- XmlTypeMapping.cs
- VisemeEventArgs.cs
- LocalValueEnumerator.cs
- ProtectedConfigurationProviderCollection.cs
- WebColorConverter.cs
- MembershipUser.cs
- TypeUsage.cs
- FlowPosition.cs
- ActiveDesignSurfaceEvent.cs
- SecurityTokenException.cs
- ReadOnlyPermissionSet.cs
- ProcessInfo.cs
- PeerCollaboration.cs
- WebPart.cs
- WindowsStartMenu.cs
- Wildcard.cs
- PathStreamGeometryContext.cs
- EvidenceTypeDescriptor.cs
- FileAccessException.cs
- CatalogPartCollection.cs
- RepeaterItem.cs
- TdsParserStateObject.cs
- DrawingDrawingContext.cs
- DataGridViewCellMouseEventArgs.cs
- DependencyObjectPropertyDescriptor.cs
- CodeIterationStatement.cs
- DelegateBodyWriter.cs
- DataList.cs
- Int64AnimationUsingKeyFrames.cs
- SubqueryTrackingVisitor.cs
- SessionEndingEventArgs.cs
- RawUIStateInputReport.cs
- ToolStripDropDownButton.cs
- ISCIIEncoding.cs
- RecordConverter.cs
- ObjectDisposedException.cs
- WorkerRequest.cs
- GPRECTF.cs
- WhitespaceRuleReader.cs
- CollectionChangedEventManager.cs