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
- HostProtectionException.cs
- QueryOperationResponseOfT.cs
- BinaryMethodMessage.cs
- WeakRefEnumerator.cs
- ApplicationActivator.cs
- AutomationAttributeInfo.cs
- XmlHierarchyData.cs
- AlternateView.cs
- DataMisalignedException.cs
- SiteMap.cs
- SessionStateSection.cs
- AutomationAttributeInfo.cs
- PropertyGroupDescription.cs
- WorkflowDesignerColors.cs
- FixedSOMPageConstructor.cs
- _HelperAsyncResults.cs
- AutoGeneratedField.cs
- VectorCollection.cs
- HostSecurityManager.cs
- MessageSecurityException.cs
- DefaultWorkflowSchedulerService.cs
- Tokenizer.cs
- FormatConvertedBitmap.cs
- SafeNativeMethodsCLR.cs
- SafeNativeMethodsCLR.cs
- SchemaImporterExtensionsSection.cs
- BinaryObjectWriter.cs
- HideDisabledControlAdapter.cs
- TableCellsCollectionEditor.cs
- NestedContainer.cs
- ScanQueryOperator.cs
- BindingGroup.cs
- XmlReaderSettings.cs
- Timer.cs
- fixedPageContentExtractor.cs
- BasicDesignerLoader.cs
- AlphabeticalEnumConverter.cs
- ToolStripRendererSwitcher.cs
- ObjectContextServiceProvider.cs
- httpserverutility.cs
- CustomTypeDescriptor.cs
- GridViewRow.cs
- StateBag.cs
- TextServicesCompartmentContext.cs
- PostBackOptions.cs
- ConfigurationCollectionAttribute.cs
- DiagnosticsConfiguration.cs
- StylusPointProperty.cs
- ToolStripItemImageRenderEventArgs.cs
- XmlNamespaceMapping.cs
- MSAAWinEventWrap.cs
- AmbientLight.cs
- Empty.cs
- DataFieldCollectionEditor.cs
- X509AsymmetricSecurityKey.cs
- ParseHttpDate.cs
- infer.cs
- XmlLangPropertyAttribute.cs
- WinFormsSecurity.cs
- RenamedEventArgs.cs
- EntryWrittenEventArgs.cs
- MetadataHelper.cs
- KeyFrames.cs
- BeginEvent.cs
- BitStack.cs
- BezierSegment.cs
- NameValueConfigurationCollection.cs
- ReferenceConverter.cs
- FlowPosition.cs
- ToolboxService.cs
- WebPartEditorCancelVerb.cs
- CompressionTransform.cs
- ListDataBindEventArgs.cs
- GridViewAutomationPeer.cs
- AutoGeneratedField.cs
- StringFreezingAttribute.cs
- XmlQueryStaticData.cs
- CompilerParameters.cs
- oledbmetadatacolumnnames.cs
- ServerProtocol.cs
- InkCollectionBehavior.cs
- TdsParameterSetter.cs
- LexicalChunk.cs
- DataKey.cs
- FileDocument.cs
- AncestorChangedEventArgs.cs
- ProfileSettings.cs
- CmsInterop.cs
- RequestNavigateEventArgs.cs
- _HeaderInfoTable.cs
- NativeMethodsOther.cs
- VoiceChangeEventArgs.cs
- ArglessEventHandlerProxy.cs
- Set.cs
- SingleAnimation.cs
- CodeCompiler.cs
- ModelUIElement3D.cs
- PolicyLevel.cs
- BCLDebug.cs
- ThicknessAnimationBase.cs