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();
Dictionary enlistments = 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
- CounterSampleCalculator.cs
- InvalidPropValue.cs
- IsolationInterop.cs
- ProxyAttribute.cs
- ExternalCalls.cs
- TemporaryBitmapFile.cs
- EventWaitHandleSecurity.cs
- UserNamePasswordValidator.cs
- ParserExtension.cs
- UpdateProgress.cs
- StyleCollection.cs
- PageAdapter.cs
- BufferModesCollection.cs
- SizeIndependentAnimationStorage.cs
- QueryPageSettingsEventArgs.cs
- SynchronizedPool.cs
- SqlBulkCopyColumnMapping.cs
- ApplicationProxyInternal.cs
- MULTI_QI.cs
- ParameterReplacerVisitor.cs
- DictionaryBase.cs
- HttpRuntime.cs
- AutomationProperty.cs
- SiteOfOriginPart.cs
- URLIdentityPermission.cs
- SolidColorBrush.cs
- VirtualPath.cs
- FamilyTypeface.cs
- DES.cs
- MimeReturn.cs
- DataIdProcessor.cs
- EntityDesignerUtils.cs
- DoubleAnimation.cs
- IteratorDescriptor.cs
- SqlDataSourceConfigureSortForm.cs
- PageCatalogPartDesigner.cs
- StrongNamePublicKeyBlob.cs
- PathStreamGeometryContext.cs
- SemaphoreSlim.cs
- PkcsMisc.cs
- JsonReader.cs
- SchemaInfo.cs
- ValidationHelper.cs
- ListView.cs
- XmlAttributes.cs
- WindowsComboBox.cs
- OuterGlowBitmapEffect.cs
- SQLInt16Storage.cs
- HttpCachePolicy.cs
- DataRecordInternal.cs
- BridgeDataRecord.cs
- EntityContainerAssociationSetEnd.cs
- DependsOnAttribute.cs
- XmlHierarchicalDataSourceView.cs
- ContextStack.cs
- DataQuery.cs
- ExpressionBuilderCollection.cs
- EnlistmentState.cs
- HttpBindingExtension.cs
- ListControl.cs
- WebBrowserDocumentCompletedEventHandler.cs
- XmlSchemaObjectCollection.cs
- HandleRef.cs
- CultureSpecificStringDictionary.cs
- SqlAliasesReferenced.cs
- ForceCopyBuildProvider.cs
- GridViewColumnCollection.cs
- TransportContext.cs
- GlobalizationAssembly.cs
- HtmlControl.cs
- X509Extension.cs
- CharacterString.cs
- MenuBindingsEditor.cs
- KnownBoxes.cs
- HitTestDrawingContextWalker.cs
- Rotation3DAnimation.cs
- AppearanceEditorPart.cs
- PropertySourceInfo.cs
- Throw.cs
- PassportAuthentication.cs
- DataGridViewCellParsingEventArgs.cs
- SwitchLevelAttribute.cs
- SettingsSection.cs
- HttpCachePolicy.cs
- BooleanExpr.cs
- OleDbPermission.cs
- Roles.cs
- DbDataAdapter.cs
- XmlNodeChangedEventManager.cs
- XmlNotation.cs
- NegationPusher.cs
- SecurityDocument.cs
- DebugHandleTracker.cs
- FragmentQueryProcessor.cs
- AppDomainProtocolHandler.cs
- UInt64.cs
- XmlDataProvider.cs
- DateTimeOffset.cs
- PermissionAttributes.cs
- ToolBarOverflowPanel.cs