Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / RunTime / DebugEngine / BreakSafeBase.cs / 1305376 / BreakSafeBase.cs
// Copyright (c) Microsoft Corp., 2004. All rights reserved. #region Using directives using System; using System.Threading; #endregion namespace System.Workflow.Runtime.DebugEngine { // // IMPORTANT: Do not edit this file without consulting Break Safe Synchronization.doc! // internal abstract class BreakSafeBasewhere T: ICloneable, new() { #region Data members private volatile object currentData; // object because type parameters instances cannot be volatile. private T nonEEDataClone; private volatile bool nonEEDataConsistent; private volatile bool nonEEIgnoreUpdate; private Mutex nonEELock; private object controllerUpdateObject; private int controllerManagedThreadId; #endregion #region Methods and properties protected BreakSafeBase(int controllerManagedThreadId) { this.currentData = new T(); this.nonEEDataClone = default(T); this.nonEEDataConsistent = false; this.nonEEIgnoreUpdate = false; this.nonEELock = new Mutex(false); this.controllerManagedThreadId = controllerManagedThreadId; } private bool IsEECall { get { return Thread.CurrentThread.ManagedThreadId == this.controllerManagedThreadId; } } protected object GetControllerUpdateObject() { return this.controllerUpdateObject; } protected void SetControllerUpdateObject(object updateObject) { // Ensure that the access to the variable this.controllerUpdateObject is exactly one instruction - StFld in this case. this.controllerUpdateObject = updateObject; } protected T GetReaderData() { // Ensure that the access to the variable this.currentData is exactly one instruction - LdFld in this case. object data = this.currentData; return (T)data; } protected T GetWriterData() { if (IsEECall) { if (this.nonEEDataConsistent && this.nonEEIgnoreUpdate == false) { // Modify the object referred to by this.currentData directly. return (T) this.currentData; } else { // Clone and discard any non-EE update. this.nonEEIgnoreUpdate = true; return (T)((T)this.currentData).Clone(); } } else { // Reset the flag so that we can keep track of any concurrent EE updates. this.nonEEIgnoreUpdate = false; // Ensure that the access to the variable this.currentData is exactly one instruction - LdFld in this case. object data = this.currentData; return (T)((T)data).Clone(); } } protected void SaveData(T data) { if (IsEECall) this.currentData = data; else { // The non-EE clone is now in a consistent state. this.nonEEDataClone = data; this.nonEEDataConsistent = true; this.controllerUpdateObject = null; // If an EE call has already modified the data, it would have also performed current non-EE update // when the debugger entered break mode. So discard the update. Asl ensure that the access to the // variable this.currentData is exactly one instruction - StFld in this case. if (this.nonEEIgnoreUpdate == false) this.currentData = data; // Clear the flag because we will clear the this.nonEEDataClone. this.nonEEDataConsistent = false; this.nonEEDataClone = default(T); } } protected void Lock() { // Serialize non-EE calls and do not invoke synchronization primitives during FuncEval. if (!IsEECall) this.nonEELock.WaitOne(); } protected void Unlock() { // Serialize non-EE calls and do not invoke synchronization primitives during FuncEval. if (!IsEECall) this.nonEELock.ReleaseMutex(); } #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. // Copyright (c) Microsoft Corp., 2004. All rights reserved. #region Using directives using System; using System.Threading; #endregion namespace System.Workflow.Runtime.DebugEngine { // // IMPORTANT: Do not edit this file without consulting Break Safe Synchronization.doc! // internal abstract class BreakSafeBase where T: ICloneable, new() { #region Data members private volatile object currentData; // object because type parameters instances cannot be volatile. private T nonEEDataClone; private volatile bool nonEEDataConsistent; private volatile bool nonEEIgnoreUpdate; private Mutex nonEELock; private object controllerUpdateObject; private int controllerManagedThreadId; #endregion #region Methods and properties protected BreakSafeBase(int controllerManagedThreadId) { this.currentData = new T(); this.nonEEDataClone = default(T); this.nonEEDataConsistent = false; this.nonEEIgnoreUpdate = false; this.nonEELock = new Mutex(false); this.controllerManagedThreadId = controllerManagedThreadId; } private bool IsEECall { get { return Thread.CurrentThread.ManagedThreadId == this.controllerManagedThreadId; } } protected object GetControllerUpdateObject() { return this.controllerUpdateObject; } protected void SetControllerUpdateObject(object updateObject) { // Ensure that the access to the variable this.controllerUpdateObject is exactly one instruction - StFld in this case. this.controllerUpdateObject = updateObject; } protected T GetReaderData() { // Ensure that the access to the variable this.currentData is exactly one instruction - LdFld in this case. object data = this.currentData; return (T)data; } protected T GetWriterData() { if (IsEECall) { if (this.nonEEDataConsistent && this.nonEEIgnoreUpdate == false) { // Modify the object referred to by this.currentData directly. return (T) this.currentData; } else { // Clone and discard any non-EE update. this.nonEEIgnoreUpdate = true; return (T)((T)this.currentData).Clone(); } } else { // Reset the flag so that we can keep track of any concurrent EE updates. this.nonEEIgnoreUpdate = false; // Ensure that the access to the variable this.currentData is exactly one instruction - LdFld in this case. object data = this.currentData; return (T)((T)data).Clone(); } } protected void SaveData(T data) { if (IsEECall) this.currentData = data; else { // The non-EE clone is now in a consistent state. this.nonEEDataClone = data; this.nonEEDataConsistent = true; this.controllerUpdateObject = null; // If an EE call has already modified the data, it would have also performed current non-EE update // when the debugger entered break mode. So discard the update. Asl ensure that the access to the // variable this.currentData is exactly one instruction - StFld in this case. if (this.nonEEIgnoreUpdate == false) this.currentData = data; // Clear the flag because we will clear the this.nonEEDataClone. this.nonEEDataConsistent = false; this.nonEEDataClone = default(T); } } protected void Lock() { // Serialize non-EE calls and do not invoke synchronization primitives during FuncEval. if (!IsEECall) this.nonEELock.WaitOne(); } protected void Unlock() { // Serialize non-EE calls and do not invoke synchronization primitives during FuncEval. if (!IsEECall) this.nonEELock.ReleaseMutex(); } #endregion } } // 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
- EndOfStreamException.cs
- ISAPIApplicationHost.cs
- TdsParser.cs
- AssemblyUtil.cs
- DataGridViewHitTestInfo.cs
- AssemblyAttributesGoHere.cs
- OperationValidationEventArgs.cs
- OdbcReferenceCollection.cs
- Vector3DIndependentAnimationStorage.cs
- XsdSchemaFileEditor.cs
- webproxy.cs
- BuildManagerHost.cs
- VectorAnimation.cs
- ListViewInsertedEventArgs.cs
- WindowsFormsLinkLabel.cs
- ProviderConnectionPoint.cs
- WindowsListViewSubItem.cs
- NTAccount.cs
- InvalidOleVariantTypeException.cs
- CodeStatementCollection.cs
- StrokeCollection.cs
- GridPatternIdentifiers.cs
- COSERVERINFO.cs
- WindowsTreeView.cs
- ArraySegment.cs
- ListenerUnsafeNativeMethods.cs
- OleServicesContext.cs
- EntityClassGenerator.cs
- Accessors.cs
- ToolTipAutomationPeer.cs
- CustomErrorCollection.cs
- SoapIncludeAttribute.cs
- DecimalConstantAttribute.cs
- WebPartManagerDesigner.cs
- BezierSegment.cs
- UnknownWrapper.cs
- GridViewDeleteEventArgs.cs
- TrackingMemoryStream.cs
- Size3D.cs
- ThousandthOfEmRealPoints.cs
- BinaryFormatterWriter.cs
- BamlCollectionHolder.cs
- ITreeGenerator.cs
- OLEDB_Enum.cs
- ManagementBaseObject.cs
- LoadMessageLogger.cs
- OleDbInfoMessageEvent.cs
- VScrollBar.cs
- RNGCryptoServiceProvider.cs
- BufferAllocator.cs
- IndependentAnimationStorage.cs
- DynamicExpression.cs
- AlphaSortedEnumConverter.cs
- UITypeEditors.cs
- OdbcConnectionOpen.cs
- InputLangChangeRequestEvent.cs
- HyperLinkField.cs
- CollectionCodeDomSerializer.cs
- KeyProperty.cs
- SQLMoney.cs
- ShaperBuffers.cs
- EntityDataSourceEntityTypeFilterConverter.cs
- QilLiteral.cs
- LinearGradientBrush.cs
- FlatButtonAppearance.cs
- AuthenticationModuleElement.cs
- GroupBoxRenderer.cs
- AppDomainManager.cs
- ConnectionManagementElement.cs
- HostVisual.cs
- Stream.cs
- Attachment.cs
- LiteralControl.cs
- ExtendedPropertyDescriptor.cs
- CompiledIdentityConstraint.cs
- EditingCommands.cs
- MaskDesignerDialog.cs
- RtfControlWordInfo.cs
- GridViewSelectEventArgs.cs
- BypassElement.cs
- XmlTextReaderImplHelpers.cs
- VisualStyleElement.cs
- SessionEndedEventArgs.cs
- FastEncoderStatics.cs
- NamedPipeTransportManager.cs
- ToolStrip.cs
- Transform3D.cs
- PreservationFileReader.cs
- ProviderBase.cs
- oledbmetadatacolumnnames.cs
- AsymmetricSecurityProtocol.cs
- FlowchartDesigner.xaml.cs
- ObjectDataSourceMethodEventArgs.cs
- ConfigurationValidatorAttribute.cs
- IProvider.cs
- CreateUserWizardStep.cs
- TimeSpan.cs
- HTMLTextWriter.cs
- XmlTextReaderImpl.cs
- TransportConfigurationTypeElementCollection.cs