Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SqlCrossApplyToCrossJoin.cs
- iisPickupDirectory.cs
- AutomationPropertyInfo.cs
- EventNotify.cs
- ThousandthOfEmRealPoints.cs
- SystemIcmpV6Statistics.cs
- SerializationEventsCache.cs
- CodeCatchClause.cs
- ImportFileRequest.cs
- PictureBox.cs
- ScrollProperties.cs
- UseLicense.cs
- DisplayNameAttribute.cs
- ComEventsInfo.cs
- CacheOutputQuery.cs
- XmlParserContext.cs
- SqlDataAdapter.cs
- BrushMappingModeValidation.cs
- ActiveDesignSurfaceEvent.cs
- DesignerAdRotatorAdapter.cs
- ValidatorCollection.cs
- SmtpSpecifiedPickupDirectoryElement.cs
- SystemKeyConverter.cs
- TypeUtil.cs
- DataTable.cs
- DbConnectionPoolGroup.cs
- LoadGrammarCompletedEventArgs.cs
- RtfControlWordInfo.cs
- DllNotFoundException.cs
- TemplateKey.cs
- CompoundFileDeflateTransform.cs
- HelpOperationInvoker.cs
- _SecureChannel.cs
- InheritedPropertyChangedEventArgs.cs
- FillRuleValidation.cs
- DataSvcMapFileSerializer.cs
- WebDisplayNameAttribute.cs
- InvalidCommandTreeException.cs
- MessageSmuggler.cs
- _Rfc2616CacheValidators.cs
- TextServicesCompartmentEventSink.cs
- InkPresenter.cs
- BadImageFormatException.cs
- GridViewRowEventArgs.cs
- StringSource.cs
- TransformValueSerializer.cs
- ButtonBase.cs
- StartUpEventArgs.cs
- SerializationAttributes.cs
- DesignSurfaceCollection.cs
- RowSpanVector.cs
- MobileCategoryAttribute.cs
- ResourceProperty.cs
- DiffuseMaterial.cs
- DataSet.cs
- ResourceDictionary.cs
- CustomCategoryAttribute.cs
- ExtensionMethods.cs
- AnnotationDocumentPaginator.cs
- UriWriter.cs
- HttpListenerElement.cs
- WindowInteractionStateTracker.cs
- AnnotationResourceChangedEventArgs.cs
- Command.cs
- Parameter.cs
- UnicodeEncoding.cs
- XamlTypeWithExplicitNamespace.cs
- MsmqAppDomainProtocolHandler.cs
- ErrorRuntimeConfig.cs
- LocalizedNameDescriptionPair.cs
- KeyProperty.cs
- HealthMonitoringSection.cs
- DataStorage.cs
- HttpSocketManager.cs
- DataControlButton.cs
- KernelTypeValidation.cs
- TextServicesLoader.cs
- XamlSerializer.cs
- InvalidDataException.cs
- RecordManager.cs
- OdbcConnectionString.cs
- SessionEndingEventArgs.cs
- UInt64Converter.cs
- CharEntityEncoderFallback.cs
- ToolStripTextBox.cs
- DbResourceAllocator.cs
- DataServiceRequestOfT.cs
- Mapping.cs
- IntSecurity.cs
- SByteConverter.cs
- SchemaEntity.cs
- ParallelRangeManager.cs
- RequestCacheEntry.cs
- DynamicActivityXamlReader.cs
- TimeoutValidationAttribute.cs
- AppearanceEditorPart.cs
- PerspectiveCamera.cs
- ListControl.cs
- QueryStringParameter.cs
- WebHttpDispatchOperationSelectorData.cs