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
- DataSourceControlBuilder.cs
- Stackframe.cs
- FreezableOperations.cs
- ConnectionProviderAttribute.cs
- ObjectAnimationBase.cs
- DataSetMappper.cs
- DataRow.cs
- PersistChildrenAttribute.cs
- ChangeNode.cs
- SpeechRecognitionEngine.cs
- Message.cs
- ProfileSection.cs
- EllipticalNodeOperations.cs
- ClientApiGenerator.cs
- XmlSerializationGeneratedCode.cs
- TextTreeDeleteContentUndoUnit.cs
- EntityKey.cs
- ColorContextHelper.cs
- TrackingMemoryStream.cs
- HuffModule.cs
- DeflateEmulationStream.cs
- SoapException.cs
- Figure.cs
- AdRotator.cs
- ALinqExpressionVisitor.cs
- PageStatePersister.cs
- Missing.cs
- ValidationSummary.cs
- SecurityPolicySection.cs
- DataBoundControlAdapter.cs
- GeneralTransform3DTo2DTo3D.cs
- NameValuePermission.cs
- VersionedStreamOwner.cs
- ITreeGenerator.cs
- FigureParaClient.cs
- ToolBarPanel.cs
- ISO2022Encoding.cs
- BaseCAMarshaler.cs
- XmlDigitalSignatureProcessor.cs
- CngKeyBlobFormat.cs
- NetNamedPipeSecurityMode.cs
- PositiveTimeSpanValidator.cs
- TimeStampChecker.cs
- IndentedWriter.cs
- TextServicesCompartmentEventSink.cs
- SrgsText.cs
- TCPListener.cs
- ProcessManager.cs
- DocumentViewerHelper.cs
- RichTextBox.cs
- DataTemplate.cs
- SegmentInfo.cs
- BindingExpression.cs
- LocalValueEnumerator.cs
- TlsnegoTokenAuthenticator.cs
- CapabilitiesRule.cs
- securitycriticaldataformultiplegetandset.cs
- DefaultAsyncDataDispatcher.cs
- StrokeNodeData.cs
- GeometryDrawing.cs
- DataContractSerializerOperationFormatter.cs
- Add.cs
- ScalarType.cs
- Collection.cs
- MappingModelBuildProvider.cs
- PolyBezierSegment.cs
- TagPrefixAttribute.cs
- CollectionAdapters.cs
- ColumnWidthChangedEvent.cs
- x509utils.cs
- HybridDictionary.cs
- DesignerActionItemCollection.cs
- ResourceContainer.cs
- cache.cs
- ExtensionFile.cs
- UnsafeNativeMethods.cs
- FileUpload.cs
- ResourceSet.cs
- CompilerErrorCollection.cs
- LinkArea.cs
- DirectoryObjectSecurity.cs
- EventsTab.cs
- QueryTask.cs
- MsmqVerifier.cs
- EnumerableValidator.cs
- ZipIOLocalFileDataDescriptor.cs
- TypeBuilderInstantiation.cs
- EventLogPermissionEntryCollection.cs
- PrintPageEvent.cs
- ProjectionQueryOptionExpression.cs
- dtdvalidator.cs
- PermissionRequestEvidence.cs
- DBAsyncResult.cs
- DownloadProgressEventArgs.cs
- PrePrepareMethodAttribute.cs
- AccessDataSource.cs
- WebConfigurationManager.cs
- NotCondition.cs
- SecureStringHasher.cs
- SessionPageStateSection.cs