Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / wpf / src / Shared / MS / Internal / CopyOnWriteList.cs / 1 / CopyOnWriteList.cs
using System; using System.Collections; using System.Diagnostics; #if WINDOWS_BASE using MS.Internal.WindowsBase; #elif PRESENTATION_CORE using MS.Internal.PresentationCore; #elif PRESENTATIONFRAMEWORK using MS.Internal.PresentationFramework; #elif DRT using MS.Internal.Drt; #else #error Attempt to use FriendAccessAllowedAttribute from an unknown assembly. using MS.Internal.YourAssemblyName; #endif namespace MS.Internal { ////// This is a ThreadSafe ArrayList that uses Copy On Write to support consistency. /// - When the "List" property is requested a readonly reference to the /// list is returned and a reference to the readonly list is cached. /// - If the "List" is requested again, the same cached reference is returned. /// - When the list is modified, if a readonly reference is present in the /// cache then the list is copied before it is modified and the readonly list is /// released from the cache. /// [FriendAccessAllowed] internal class CopyOnWriteList { public CopyOnWriteList() : this(null) { } public CopyOnWriteList(object syncRoot) { if(syncRoot == null) { syncRoot = new Object(); } _syncRoot = syncRoot; } ////// Return a readonly wrapper of the list. Note: this is NOT a copy. /// A non-null _readonlyWrapper is a "Copy on Write" flag. /// Methods that change the list (eg. Add() and Remove()) are /// responsible for: /// 1) Checking _readonlyWrapper and copying the list before modifing it. /// 2) Clearing _readonlyWrapper. /// public ArrayList List { get { ArrayList tempList; lock(_syncRoot) { if(null == _readonlyWrapper) _readonlyWrapper = ArrayList.ReadOnly(_LiveList); tempList = _readonlyWrapper; } return tempList; } } ////// Add an object to the List. /// Returns true if successfully added. /// Returns false if object is already on the list. /// public virtual bool Add(object obj) { Debug.Assert(null!=obj, "CopyOnWriteList.Add() should not be passed null."); lock(_syncRoot) { int index = Find(obj); if(index >= 0) return false; return Internal_Add(obj); } } ////// Remove an object from the List. /// Returns true if successfully removed. /// Returns false if object was not on the list. /// public virtual bool Remove(object obj) { Debug.Assert(null!=obj, "CopyOnWriteList.Remove() should not be passed null."); lock(_syncRoot) { int index = Find(obj); // If the object is not on the list then // we are done. (return false) if(index < 0) return false; return RemoveAt(index); } } ////// This allows derived classes to take the lock. This is mostly used /// to extend Add() and Remove() etc. /// protected object SyncRoot { get{ return _syncRoot; } } ////// This is protected and the caller can get into real serious trouble /// using this. Because this points at the real current list without /// any copy on write protection. So the caller must really know what /// they are doing. /// protected ArrayList LiveList { get{ return _LiveList; } } ////// Add an object to the List. /// Without any error checks. /// For use by derived classes that implement there own error checks. /// protected bool Internal_Add(object obj) { DoCopyOnWriteCheck(); _LiveList.Add(obj); return true; } ////// Insert an object into the List at the given index. /// Without any error checks. /// For use by derived classes that implement there own error checks. /// protected bool Internal_Insert(int index, object obj) { DoCopyOnWriteCheck(); _LiveList.Insert(index, obj); return true; } ////// Find an object on the List. /// private int Find(object obj) { // syncRoot Lock MUST be held by the caller. for(int i = 0; i < _LiveList.Count; i++) { if(obj == _LiveList[i]) { return i; } } return -1; } ////// Remove the object at a given index from the List. /// Returns true if successfully removed. /// Returns false if index is outside the range of the list. /// /// This is protected because it operates on the LiveList /// protected bool RemoveAt(int index) { // syncRoot Lock MUST be held by the caller. if(index <0 || index >= _LiveList.Count ) return false; DoCopyOnWriteCheck(); _LiveList.RemoveAt(index); return true; } private void DoCopyOnWriteCheck() { // syncRoot Lock MUST be held by the caller. // If we have exposed (given out) a readonly reference to this // version of the list, then clone a new internal copy and cut // the old version free. if(null != _readonlyWrapper) { _LiveList = (ArrayList)_LiveList.Clone(); _readonlyWrapper = null; } } private object _syncRoot; private ArrayList _LiveList = new ArrayList(); private ArrayList _readonlyWrapper; } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. using System; using System.Collections; using System.Diagnostics; #if WINDOWS_BASE using MS.Internal.WindowsBase; #elif PRESENTATION_CORE using MS.Internal.PresentationCore; #elif PRESENTATIONFRAMEWORK using MS.Internal.PresentationFramework; #elif DRT using MS.Internal.Drt; #else #error Attempt to use FriendAccessAllowedAttribute from an unknown assembly. using MS.Internal.YourAssemblyName; #endif namespace MS.Internal { ////// This is a ThreadSafe ArrayList that uses Copy On Write to support consistency. /// - When the "List" property is requested a readonly reference to the /// list is returned and a reference to the readonly list is cached. /// - If the "List" is requested again, the same cached reference is returned. /// - When the list is modified, if a readonly reference is present in the /// cache then the list is copied before it is modified and the readonly list is /// released from the cache. /// [FriendAccessAllowed] internal class CopyOnWriteList { public CopyOnWriteList() : this(null) { } public CopyOnWriteList(object syncRoot) { if(syncRoot == null) { syncRoot = new Object(); } _syncRoot = syncRoot; } ////// Return a readonly wrapper of the list. Note: this is NOT a copy. /// A non-null _readonlyWrapper is a "Copy on Write" flag. /// Methods that change the list (eg. Add() and Remove()) are /// responsible for: /// 1) Checking _readonlyWrapper and copying the list before modifing it. /// 2) Clearing _readonlyWrapper. /// public ArrayList List { get { ArrayList tempList; lock(_syncRoot) { if(null == _readonlyWrapper) _readonlyWrapper = ArrayList.ReadOnly(_LiveList); tempList = _readonlyWrapper; } return tempList; } } ////// Add an object to the List. /// Returns true if successfully added. /// Returns false if object is already on the list. /// public virtual bool Add(object obj) { Debug.Assert(null!=obj, "CopyOnWriteList.Add() should not be passed null."); lock(_syncRoot) { int index = Find(obj); if(index >= 0) return false; return Internal_Add(obj); } } ////// Remove an object from the List. /// Returns true if successfully removed. /// Returns false if object was not on the list. /// public virtual bool Remove(object obj) { Debug.Assert(null!=obj, "CopyOnWriteList.Remove() should not be passed null."); lock(_syncRoot) { int index = Find(obj); // If the object is not on the list then // we are done. (return false) if(index < 0) return false; return RemoveAt(index); } } ////// This allows derived classes to take the lock. This is mostly used /// to extend Add() and Remove() etc. /// protected object SyncRoot { get{ return _syncRoot; } } ////// This is protected and the caller can get into real serious trouble /// using this. Because this points at the real current list without /// any copy on write protection. So the caller must really know what /// they are doing. /// protected ArrayList LiveList { get{ return _LiveList; } } ////// Add an object to the List. /// Without any error checks. /// For use by derived classes that implement there own error checks. /// protected bool Internal_Add(object obj) { DoCopyOnWriteCheck(); _LiveList.Add(obj); return true; } ////// Insert an object into the List at the given index. /// Without any error checks. /// For use by derived classes that implement there own error checks. /// protected bool Internal_Insert(int index, object obj) { DoCopyOnWriteCheck(); _LiveList.Insert(index, obj); return true; } ////// Find an object on the List. /// private int Find(object obj) { // syncRoot Lock MUST be held by the caller. for(int i = 0; i < _LiveList.Count; i++) { if(obj == _LiveList[i]) { return i; } } return -1; } ////// Remove the object at a given index from the List. /// Returns true if successfully removed. /// Returns false if index is outside the range of the list. /// /// This is protected because it operates on the LiveList /// protected bool RemoveAt(int index) { // syncRoot Lock MUST be held by the caller. if(index <0 || index >= _LiveList.Count ) return false; DoCopyOnWriteCheck(); _LiveList.RemoveAt(index); return true; } private void DoCopyOnWriteCheck() { // syncRoot Lock MUST be held by the caller. // If we have exposed (given out) a readonly reference to this // version of the list, then clone a new internal copy and cut // the old version free. if(null != _readonlyWrapper) { _LiveList = (ArrayList)_LiveList.Clone(); _readonlyWrapper = null; } } private object _syncRoot; private ArrayList _LiveList = new ArrayList(); private ArrayList _readonlyWrapper; } } // 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
- RegexGroup.cs
- EntityChangedParams.cs
- _ShellExpression.cs
- NavigationCommands.cs
- UnsafeNativeMethods.cs
- PolyBezierSegment.cs
- TagPrefixCollection.cs
- MissingFieldException.cs
- LowerCaseStringConverter.cs
- BinaryCommonClasses.cs
- WindowInteractionStateTracker.cs
- wpf-etw.cs
- HuffCodec.cs
- AtomicFile.cs
- Sql8ConformanceChecker.cs
- ButtonBase.cs
- TextAnchor.cs
- SizeFConverter.cs
- Zone.cs
- ContextBase.cs
- ObjectStateFormatter.cs
- DesignBindingPicker.cs
- OracleParameterBinding.cs
- TemplatedWizardStep.cs
- SoapObjectReader.cs
- IisTraceListener.cs
- ConnectionProviderAttribute.cs
- ColorMatrix.cs
- DecimalKeyFrameCollection.cs
- DataBoundControlActionList.cs
- WhitespaceSignificantCollectionAttribute.cs
- SrgsGrammar.cs
- XPathSelectionIterator.cs
- SelectorAutomationPeer.cs
- TraceFilter.cs
- ApplicationInfo.cs
- SvcMapFile.cs
- CodeAttachEventStatement.cs
- ColorConvertedBitmapExtension.cs
- ContractListAdapter.cs
- NetworkInformationPermission.cs
- Utility.cs
- SQLInt32.cs
- CoTaskMemUnicodeSafeHandle.cs
- CssStyleCollection.cs
- ParameterElementCollection.cs
- WebReferencesBuildProvider.cs
- COM2IVsPerPropertyBrowsingHandler.cs
- Rijndael.cs
- TextEditorTables.cs
- XPathAxisIterator.cs
- Property.cs
- _AuthenticationState.cs
- LookupNode.cs
- SuppressMergeCheckAttribute.cs
- RemoteCryptoSignHashRequest.cs
- ResourceDescriptionAttribute.cs
- RelatedPropertyManager.cs
- OdbcTransaction.cs
- HostedNamedPipeTransportManager.cs
- TextDecoration.cs
- COAUTHINFO.cs
- IdentityReference.cs
- HttpUnhandledOperationInvoker.cs
- DetailsViewActionList.cs
- OleDbFactory.cs
- StringComparer.cs
- LineBreak.cs
- FormsAuthenticationUser.cs
- IntSecurity.cs
- WebEvents.cs
- ReferenceConverter.cs
- FactoryId.cs
- TransformerInfo.cs
- SubpageParagraph.cs
- DelayLoadType.cs
- HttpConfigurationContext.cs
- UserPreferenceChangedEventArgs.cs
- WebPartConnectionsDisconnectVerb.cs
- TextReader.cs
- ParameterCollection.cs
- EmulateRecognizeCompletedEventArgs.cs
- ConditionCollection.cs
- SerialStream.cs
- Rect.cs
- FormatterConverter.cs
- DelegateSerializationHolder.cs
- FormViewDeleteEventArgs.cs
- WmlPanelAdapter.cs
- Blend.cs
- LogLogRecord.cs
- CatalogZoneBase.cs
- HasCopySemanticsAttribute.cs
- GifBitmapDecoder.cs
- HorizontalAlignConverter.cs
- SchemaImporter.cs
- TripleDESCryptoServiceProvider.cs
- DivideByZeroException.cs
- StreamReader.cs
- AuthorizationRuleCollection.cs