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
- SimpleRecyclingCache.cs
- ToolboxItemFilterAttribute.cs
- SessionStateUtil.cs
- ToolboxItem.cs
- DynamicField.cs
- SByteConverter.cs
- SafeNativeMethodsCLR.cs
- SchemaImporterExtension.cs
- BlockExpression.cs
- PersonalizationEntry.cs
- HtmlHead.cs
- SystemColors.cs
- HighlightVisual.cs
- DataListCommandEventArgs.cs
- MarkupCompilePass2.cs
- PassportPrincipal.cs
- Transform.cs
- TextDecorationUnitValidation.cs
- IssuanceLicense.cs
- Deserializer.cs
- TTSEngineTypes.cs
- SiteMapSection.cs
- PropertyInfoSet.cs
- SymbolMethod.cs
- OwnerDrawPropertyBag.cs
- UserControlCodeDomTreeGenerator.cs
- TableLayoutCellPaintEventArgs.cs
- HasCopySemanticsAttribute.cs
- TemplateField.cs
- UrlMappingsSection.cs
- BulletedListEventArgs.cs
- FragmentNavigationEventArgs.cs
- AddInContractAttribute.cs
- StrokeNodeData.cs
- EntityDataSourceEntityTypeFilterConverter.cs
- WorkflowMarkupSerializer.cs
- HealthMonitoringSectionHelper.cs
- AnnotationStore.cs
- EntityDataSourceStatementEditor.cs
- AuthenticatedStream.cs
- DataSourceSelectArguments.cs
- Point3DCollectionConverter.cs
- FixedTextBuilder.cs
- DispatchOperationRuntime.cs
- ValidationErrorEventArgs.cs
- SectionUpdates.cs
- ArrangedElementCollection.cs
- SafeFindHandle.cs
- CompilerGeneratedAttribute.cs
- MsmqNonTransactedPoisonHandler.cs
- PlanCompiler.cs
- ComponentDispatcher.cs
- WebPartAuthorizationEventArgs.cs
- PartialArray.cs
- StreamInfo.cs
- URLIdentityPermission.cs
- WebControlsSection.cs
- SettingsPropertyCollection.cs
- SharedStatics.cs
- PreProcessor.cs
- DataGridDefaultColumnWidthTypeConverter.cs
- HtmlForm.cs
- DiscardableAttribute.cs
- VerticalConnector.xaml.cs
- DaylightTime.cs
- TransformationRules.cs
- UrlAuthorizationModule.cs
- RequiredArgumentAttribute.cs
- ActiveDocumentEvent.cs
- TableAdapterManagerHelper.cs
- OverflowException.cs
- RootContext.cs
- HtmlEncodedRawTextWriter.cs
- DataGridColumnEventArgs.cs
- BaseDataList.cs
- ObjectSecurity.cs
- HandlerBase.cs
- SecurityElement.cs
- ExtenderControl.cs
- ActivityBindForm.cs
- IUnknownConstantAttribute.cs
- DigitalSignatureProvider.cs
- OrderedDictionary.cs
- XsltLoader.cs
- WindowsImpersonationContext.cs
- StylusPointPropertyUnit.cs
- SafeHandles.cs
- SerialPort.cs
- HitTestWithPointDrawingContextWalker.cs
- Inline.cs
- StrongNameMembershipCondition.cs
- ArgumentException.cs
- ToolStripPanelCell.cs
- QilExpression.cs
- ConnectionsZone.cs
- DoubleLinkListEnumerator.cs
- ButtonBaseAutomationPeer.cs
- DomNameTable.cs
- ConstraintEnumerator.cs
- SqlCommandBuilder.cs