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
- HtmlElementErrorEventArgs.cs
- MouseEventArgs.cs
- NotConverter.cs
- BackStopAuthenticationModule.cs
- SqlClientWrapperSmiStream.cs
- SecurityTokenProviderContainer.cs
- DataGridSortCommandEventArgs.cs
- MimeObjectFactory.cs
- ReadOnlyCollection.cs
- EntityTypeBase.cs
- JoinQueryOperator.cs
- PersistenceTypeAttribute.cs
- Process.cs
- WorkflowInstanceExtensionCollection.cs
- BitArray.cs
- DataTemplate.cs
- FormClosingEvent.cs
- DesignerDataColumn.cs
- XdrBuilder.cs
- FailedToStartupUIException.cs
- MonthCalendar.cs
- PenThread.cs
- TextModifierScope.cs
- RectangleF.cs
- processwaithandle.cs
- XPathNavigatorReader.cs
- remotingproxy.cs
- FileSystemEventArgs.cs
- ColumnTypeConverter.cs
- EdmEntityTypeAttribute.cs
- ContainerParaClient.cs
- XmlTypeAttribute.cs
- LocationUpdates.cs
- SqlDataAdapter.cs
- ServicesSection.cs
- FixedSOMTable.cs
- BitmapEffectInputData.cs
- AutoSizeToolBoxItem.cs
- SmtpException.cs
- OperationCanceledException.cs
- FormViewDeleteEventArgs.cs
- TrackingLocationCollection.cs
- SqlDataSource.cs
- RadioButton.cs
- ExtenderProvidedPropertyAttribute.cs
- SapiRecoInterop.cs
- SessionEndedEventArgs.cs
- TemplateDefinition.cs
- GridViewColumnHeaderAutomationPeer.cs
- UIHelper.cs
- AttributeQuery.cs
- DataGridViewRowPostPaintEventArgs.cs
- Funcletizer.cs
- SqlNodeAnnotations.cs
- pingexception.cs
- NullableLongSumAggregationOperator.cs
- ContextProperty.cs
- TreePrinter.cs
- EncoderBestFitFallback.cs
- ProgressBar.cs
- OleDbPermission.cs
- TemplateAction.cs
- RegionIterator.cs
- SplineKeyFrames.cs
- HyperLinkColumn.cs
- ProjectionPathSegment.cs
- WinInet.cs
- WebBrowsableAttribute.cs
- CalendarDateChangedEventArgs.cs
- AssemblyName.cs
- ColorInterpolationModeValidation.cs
- TypeContext.cs
- ValueChangedEventManager.cs
- ValidatedMobileControlConverter.cs
- QilParameter.cs
- ContainerUtilities.cs
- PassportIdentity.cs
- EncodingStreamWrapper.cs
- ImageMapEventArgs.cs
- Constant.cs
- XmlStrings.cs
- DeferredElementTreeState.cs
- SHA1CryptoServiceProvider.cs
- PathStreamGeometryContext.cs
- PrimitiveOperationFormatter.cs
- Path.cs
- FileClassifier.cs
- ObjectManager.cs
- _SecureChannel.cs
- TextInfo.cs
- DataGridViewHeaderCell.cs
- StylusPointCollection.cs
- MustUnderstandBehavior.cs
- ToolStripContentPanelRenderEventArgs.cs
- UserControlDocumentDesigner.cs
- FixedDocument.cs
- BoolLiteral.cs
- WebPartConnectionsDisconnectVerb.cs
- Rule.cs
- UndoManager.cs