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
- cookie.cs
- ProxyWebPartConnectionCollection.cs
- SqlTriggerContext.cs
- Attributes.cs
- Link.cs
- CalendarModeChangedEventArgs.cs
- BuildProviderUtils.cs
- PeerNameRegistration.cs
- BrushValueSerializer.cs
- DesignerView.Commands.cs
- ComponentManagerBroker.cs
- FixedSOMSemanticBox.cs
- DataGridColumnCollection.cs
- OutputCacheProfileCollection.cs
- RightsManagementManager.cs
- ApplicationManager.cs
- XmlSchemaObjectTable.cs
- Odbc32.cs
- NetCodeGroup.cs
- BitmapEffectDrawing.cs
- Asn1IntegerConverter.cs
- ConnectionsZone.cs
- DataTablePropertyDescriptor.cs
- SSmlParser.cs
- XmlHelper.cs
- entitydatasourceentitysetnameconverter.cs
- DocumentGrid.cs
- QueryExpr.cs
- ExtenderHelpers.cs
- Overlapped.cs
- SmtpNetworkElement.cs
- TemplatePropertyEntry.cs
- UTF32Encoding.cs
- Directory.cs
- StaticSiteMapProvider.cs
- TextFormatterHost.cs
- ReferenceCountedObject.cs
- PartialCachingControl.cs
- BrushValueSerializer.cs
- FrameAutomationPeer.cs
- TimeZone.cs
- _OSSOCK.cs
- ToolStripItemImageRenderEventArgs.cs
- HttpDebugHandler.cs
- GroupStyle.cs
- TimeSpanStorage.cs
- Identity.cs
- ListItem.cs
- Cursors.cs
- TransformGroup.cs
- mactripleDES.cs
- EmptyEnumerable.cs
- ComponentSerializationService.cs
- Vector3DConverter.cs
- NativeWrapper.cs
- WebException.cs
- baseaxisquery.cs
- QuaternionAnimation.cs
- entitydatasourceentitysetnameconverter.cs
- ImageAutomationPeer.cs
- InfoCardTraceRecord.cs
- DefaultBindingPropertyAttribute.cs
- DataSvcMapFile.cs
- ContentAlignmentEditor.cs
- SQLRoleProvider.cs
- DirectoryNotFoundException.cs
- ClientSession.cs
- RemotingService.cs
- DetailsViewPageEventArgs.cs
- ListBase.cs
- SecurityPolicySection.cs
- SqlTrackingWorkflowInstance.cs
- BmpBitmapDecoder.cs
- SeekableMessageNavigator.cs
- XmlEntity.cs
- VerificationException.cs
- DataContractSerializerFaultFormatter.cs
- RelationshipNavigation.cs
- ByteStack.cs
- DeferredReference.cs
- RunInstallerAttribute.cs
- GroupQuery.cs
- Permission.cs
- RSAPKCS1KeyExchangeDeformatter.cs
- ObjectQueryProvider.cs
- WmlValidatorAdapter.cs
- URI.cs
- XmlNamespaceMapping.cs
- ConnectionProviderAttribute.cs
- PerformanceCounterPermissionEntry.cs
- MarshalDirectiveException.cs
- ToolStripRenderEventArgs.cs
- Function.cs
- CompilerState.cs
- TextSelectionProcessor.cs
- OpenFileDialog.cs
- KeySplineConverter.cs
- OperationCanceledException.cs
- ProgressPage.cs
- DateTimeSerializationSection.cs