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
- NonceCache.cs
- TableRow.cs
- EntityDataSourceChangedEventArgs.cs
- PropertyManager.cs
- PermissionToken.cs
- Scene3D.cs
- SettingsBase.cs
- QueryServiceConfigHandle.cs
- COM2Properties.cs
- _NegoState.cs
- GreaterThan.cs
- Line.cs
- DbMetaDataColumnNames.cs
- ColorAnimationUsingKeyFrames.cs
- StateMachineWorkflowDesigner.cs
- LinkTarget.cs
- DataSpaceManager.cs
- Cursors.cs
- CheckPair.cs
- ReadOnlyCollection.cs
- WsatServiceCertificate.cs
- SystemResourceKey.cs
- PageContentAsyncResult.cs
- EpmHelper.cs
- XMLSyntaxException.cs
- DataGridViewToolTip.cs
- SqlDataSourceQueryEditorForm.cs
- DriveInfo.cs
- _DisconnectOverlappedAsyncResult.cs
- PropertyValueChangedEvent.cs
- XPathAxisIterator.cs
- CachedCompositeFamily.cs
- HttpBrowserCapabilitiesWrapper.cs
- Transform.cs
- PlacementWorkspace.cs
- WindowsMenu.cs
- TimerElapsedEvenArgs.cs
- HtmlControl.cs
- ProtocolsConfiguration.cs
- RadioButtonRenderer.cs
- Utils.cs
- SignedXml.cs
- TransactionBehavior.cs
- ImpersonateTokenRef.cs
- CodeGenerator.cs
- Processor.cs
- FlowchartSizeFeature.cs
- PeerCollaboration.cs
- SecurityDocument.cs
- Inline.cs
- RangeBaseAutomationPeer.cs
- SafeNativeMethods.cs
- DataGridPageChangedEventArgs.cs
- TableLayoutCellPaintEventArgs.cs
- WaitHandle.cs
- ConstrainedDataObject.cs
- HttpCacheVary.cs
- Matrix3D.cs
- InvalidAsynchronousStateException.cs
- StatusBarPanelClickEvent.cs
- ListViewHitTestInfo.cs
- ObjectStateEntryBaseUpdatableDataRecord.cs
- XmlResolver.cs
- GridViewDeleteEventArgs.cs
- AvtEvent.cs
- SecurityHelper.cs
- MatrixValueSerializer.cs
- SourceFileBuildProvider.cs
- BaseTemplateBuildProvider.cs
- StringReader.cs
- FileAuthorizationModule.cs
- TableLayoutPanelCellPosition.cs
- ActivityScheduledQuery.cs
- EventProviderTraceListener.cs
- TagPrefixAttribute.cs
- UriScheme.cs
- DecimalKeyFrameCollection.cs
- IgnoreFileBuildProvider.cs
- CodeRegionDirective.cs
- ComponentGlyph.cs
- PixelFormat.cs
- PackageFilter.cs
- ChannelManager.cs
- TypefaceMap.cs
- CmsInterop.cs
- AddingNewEventArgs.cs
- Int32AnimationBase.cs
- SupportedAddressingMode.cs
- RuleConditionDialog.cs
- Rect3D.cs
- Label.cs
- RoleManagerSection.cs
- SamlAssertionKeyIdentifierClause.cs
- PatternMatcher.cs
- GeometryValueSerializer.cs
- CapabilitiesUse.cs
- WebPartTransformer.cs
- FontUnitConverter.cs
- TrustLevel.cs
- PeerTransportSecurityElement.cs