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
- ProgressBarHighlightConverter.cs
- SemanticResultKey.cs
- FtpWebRequest.cs
- BaseValidator.cs
- Resources.Designer.cs
- Visual3DCollection.cs
- PreProcessor.cs
- ParseElement.cs
- ContextDataSourceView.cs
- BasicAsyncResult.cs
- MessagingActivityHelper.cs
- BamlReader.cs
- MapPathBasedVirtualPathProvider.cs
- SoapInteropTypes.cs
- MarkupProperty.cs
- ReadOnlyAttribute.cs
- BasicBrowserDialog.cs
- SecurityPolicySection.cs
- TreeNodeStyle.cs
- ObfuscateAssemblyAttribute.cs
- WindowsAuthenticationModule.cs
- ThemeDirectoryCompiler.cs
- _Semaphore.cs
- ParseNumbers.cs
- ApplicationCommands.cs
- TimeSpan.cs
- COM2AboutBoxPropertyDescriptor.cs
- MatchingStyle.cs
- PackageRelationshipSelector.cs
- ImpersonateTokenRef.cs
- InstanceOwnerQueryResult.cs
- WsdlBuildProvider.cs
- SqlCrossApplyToCrossJoin.cs
- BypassElementCollection.cs
- CharUnicodeInfo.cs
- Ref.cs
- ContextProperty.cs
- TimeStampChecker.cs
- SplineKeyFrames.cs
- ScrollBar.cs
- PauseStoryboard.cs
- ADRole.cs
- TransformCollection.cs
- SQLInt32Storage.cs
- QilInvoke.cs
- LinqTreeNodeEvaluator.cs
- CssStyleCollection.cs
- LazyTextWriterCreator.cs
- EventListenerClientSide.cs
- SourceChangedEventArgs.cs
- ReadOnlyCollectionBuilder.cs
- ToolStripDropDownClosedEventArgs.cs
- EmptyReadOnlyDictionaryInternal.cs
- IPAddress.cs
- SerializationTrace.cs
- DispatchWrapper.cs
- SafeMILHandle.cs
- GeneralTransform.cs
- HebrewNumber.cs
- CodeTypeParameterCollection.cs
- InvokeGenerator.cs
- SequenceDesigner.cs
- XmlSchemaException.cs
- ViewCellSlot.cs
- UnmanagedMarshal.cs
- SchemaTypeEmitter.cs
- ErrorTolerantObjectWriter.cs
- Events.cs
- TraceHandler.cs
- QilFunction.cs
- PackageDigitalSignature.cs
- TreeNodeStyleCollectionEditor.cs
- XmlnsPrefixAttribute.cs
- RuleInfoComparer.cs
- DocumentPageView.cs
- DtdParser.cs
- GifBitmapEncoder.cs
- IImplicitResourceProvider.cs
- SelectedDatesCollection.cs
- SignatureToken.cs
- XmlDataCollection.cs
- EndpointFilterProvider.cs
- SqlRowUpdatingEvent.cs
- ExceptionUtil.cs
- UserInitiatedNavigationPermission.cs
- ListControlActionList.cs
- WeakReference.cs
- DiscoveryDocument.cs
- ConfigurationElementProperty.cs
- WebReference.cs
- DataKeyCollection.cs
- IndicShape.cs
- KeyProperty.cs
- SqlFormatter.cs
- ManagementClass.cs
- PermissionRequestEvidence.cs
- Color.cs
- KerberosSecurityTokenParameters.cs
- DesignBindingPropertyDescriptor.cs
- SystemFonts.cs