Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / ndp / clr / src / BCL / System / WeakReference.cs / 5 / WeakReference.cs
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
/*============================================================
**
** Class: WeakReference
**
** Purpose: A wrapper for establishing a WeakReference to an Object.
**
===========================================================*/
namespace System {
using System;
using System.Runtime.Remoting;
using System.Runtime.Serialization;
using System.Security.Permissions;
using System.Runtime.InteropServices;
using System.Threading;
[System.Runtime.InteropServices.ComVisible(true)]
[SecurityPermissionAttribute(SecurityAction.InheritanceDemand, Flags=SecurityPermissionFlag.UnmanagedCode)]
[Serializable()] public class WeakReference : ISerializable {
// Most methods using m_handle should use GC.KeepAlive(this)
// to avoid potential handle recycling attacks. The GC special
// cases the finalizer for WeakReference & only clears them
// when all threads are suspended, but you might still run into
// problems if your code is at least partially interruptible.
// It's just too much complexity to think about.
internal volatile IntPtr m_handle;
internal bool m_IsLongReference;
// Creates a new WeakReference that keeps track of target.
// Assumes a Short Weak Reference (ie TrackResurrection is false.)
//
public WeakReference(Object target)
: this(target, false) {
}
//Creates a new WeakReference that keeps track of target.
//
public WeakReference(Object target, bool trackResurrection) {
m_IsLongReference=trackResurrection;
m_handle = GCHandle.InternalAlloc(target,
trackResurrection ? GCHandleType.WeakTrackResurrection : GCHandleType.Weak);
}
protected WeakReference(SerializationInfo info, StreamingContext context) {
if (info==null) {
throw new ArgumentNullException("info");
}
Object temp = info.GetValue("TrackedObject",typeof(Object));
m_IsLongReference = info.GetBoolean("TrackResurrection");
m_handle = GCHandle.InternalAlloc(temp,
m_IsLongReference ? GCHandleType.WeakTrackResurrection : GCHandleType.Weak);
}
//Determines whether or not this instance of WeakReference still refers to an object
//that has not been collected.
//
public virtual bool IsAlive {
get {
IntPtr h = m_handle;
// In determining whether it is valid to use this object, we need to at least expose this
// without throwing an exception.
if (IntPtr.Zero == h)
return false;
bool result = (GCHandle.InternalGet(h)!=null);
// We want to ensure that if the target is live, then we will
// return it to the user. We need to keep this WeakReference object
// live so m_handle doesn't get set to 0 or reused.
// Since m_handle is volatile, the following statement will
// guarantee the weakref object is live till the following
// statement.
return (m_handle == IntPtr.Zero) ? false : result;
}
}
//Returns a boolean indicating whether or not we're tracking objects until they're collected (true)
//or just until they're finalized (false).
//
public virtual bool TrackResurrection {
get { return m_IsLongReference; }
}
//Gets the Object stored in the handle if it's accessible.
// Or sets it.
//
public virtual Object Target {
get {
IntPtr h = m_handle;
// Should only happen when used illegally, like using a
// WeakReference from a finalizer.
if (IntPtr.Zero == h)
return null;
Object o = GCHandle.InternalGet(h);
// We want to ensure that if the target is live, then we will
// return it to the user. We need to keep this WeakReference object
// live so m_handle doesn't get set to 0 or reused.
// Since m_handle is volatile, the following statement will
// guarantee the weakref object is live till the following
// statement.
return (m_handle == IntPtr.Zero) ? null : o;
}
set {
IntPtr h = m_handle;
if (h == IntPtr.Zero)
throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_HandleIsNotInitialized"));
// There is a ---- w/ finalization where m_handle gets set to
// NULL and the WeakReference becomes invalid. Here we have to
// do the following in order:
//
// 1. Get the old object value
// 2. Get m_handle
// 3. HndInterlockedCompareExchange(m_handle, newValue, oldValue);
//
// If the interlocked-cmp-exchange fails, then either we lost a ----
// with another updater, or we lost a ---- w/ the finalizer. In
// either case, we can just let the other guy win.
Object oldValue = GCHandle.InternalGet(h);
h = m_handle;
if (h == IntPtr.Zero)
throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_HandleIsNotInitialized"));
GCHandle.InternalCompareExchange(h, value, oldValue, false /* isPinned */);
// Ensure we don't have any handle recycling attacks in this
// method where the finalizer frees the handle.
GC.KeepAlive(this);
}
}
// Free all system resources associated with this reference.
//
// Note: The WeakReference finalizer is not actually run, but
// treated specially in gc.cpp's ScanForFinalization
// This is needed for subclasses deriving from WeakReference, however.
#pragma warning disable 420
~WeakReference() {
IntPtr old_handle = m_handle;
if (old_handle != IntPtr.Zero) {
if (old_handle == Interlocked.CompareExchange(ref m_handle, IntPtr.Zero, old_handle))
GCHandle.InternalFree(old_handle);
}
}
public virtual void GetObjectData(SerializationInfo info, StreamingContext context) {
if (info==null) {
throw new ArgumentNullException("info");
}
info.AddValue("TrackedObject", Target, typeof(Object));
info.AddValue("TrackResurrection", m_IsLongReference);
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// ==++==
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// ==--==
/*============================================================
**
** Class: WeakReference
**
** Purpose: A wrapper for establishing a WeakReference to an Object.
**
===========================================================*/
namespace System {
using System;
using System.Runtime.Remoting;
using System.Runtime.Serialization;
using System.Security.Permissions;
using System.Runtime.InteropServices;
using System.Threading;
[System.Runtime.InteropServices.ComVisible(true)]
[SecurityPermissionAttribute(SecurityAction.InheritanceDemand, Flags=SecurityPermissionFlag.UnmanagedCode)]
[Serializable()] public class WeakReference : ISerializable {
// Most methods using m_handle should use GC.KeepAlive(this)
// to avoid potential handle recycling attacks. The GC special
// cases the finalizer for WeakReference & only clears them
// when all threads are suspended, but you might still run into
// problems if your code is at least partially interruptible.
// It's just too much complexity to think about.
internal volatile IntPtr m_handle;
internal bool m_IsLongReference;
// Creates a new WeakReference that keeps track of target.
// Assumes a Short Weak Reference (ie TrackResurrection is false.)
//
public WeakReference(Object target)
: this(target, false) {
}
//Creates a new WeakReference that keeps track of target.
//
public WeakReference(Object target, bool trackResurrection) {
m_IsLongReference=trackResurrection;
m_handle = GCHandle.InternalAlloc(target,
trackResurrection ? GCHandleType.WeakTrackResurrection : GCHandleType.Weak);
}
protected WeakReference(SerializationInfo info, StreamingContext context) {
if (info==null) {
throw new ArgumentNullException("info");
}
Object temp = info.GetValue("TrackedObject",typeof(Object));
m_IsLongReference = info.GetBoolean("TrackResurrection");
m_handle = GCHandle.InternalAlloc(temp,
m_IsLongReference ? GCHandleType.WeakTrackResurrection : GCHandleType.Weak);
}
//Determines whether or not this instance of WeakReference still refers to an object
//that has not been collected.
//
public virtual bool IsAlive {
get {
IntPtr h = m_handle;
// In determining whether it is valid to use this object, we need to at least expose this
// without throwing an exception.
if (IntPtr.Zero == h)
return false;
bool result = (GCHandle.InternalGet(h)!=null);
// We want to ensure that if the target is live, then we will
// return it to the user. We need to keep this WeakReference object
// live so m_handle doesn't get set to 0 or reused.
// Since m_handle is volatile, the following statement will
// guarantee the weakref object is live till the following
// statement.
return (m_handle == IntPtr.Zero) ? false : result;
}
}
//Returns a boolean indicating whether or not we're tracking objects until they're collected (true)
//or just until they're finalized (false).
//
public virtual bool TrackResurrection {
get { return m_IsLongReference; }
}
//Gets the Object stored in the handle if it's accessible.
// Or sets it.
//
public virtual Object Target {
get {
IntPtr h = m_handle;
// Should only happen when used illegally, like using a
// WeakReference from a finalizer.
if (IntPtr.Zero == h)
return null;
Object o = GCHandle.InternalGet(h);
// We want to ensure that if the target is live, then we will
// return it to the user. We need to keep this WeakReference object
// live so m_handle doesn't get set to 0 or reused.
// Since m_handle is volatile, the following statement will
// guarantee the weakref object is live till the following
// statement.
return (m_handle == IntPtr.Zero) ? null : o;
}
set {
IntPtr h = m_handle;
if (h == IntPtr.Zero)
throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_HandleIsNotInitialized"));
// There is a ---- w/ finalization where m_handle gets set to
// NULL and the WeakReference becomes invalid. Here we have to
// do the following in order:
//
// 1. Get the old object value
// 2. Get m_handle
// 3. HndInterlockedCompareExchange(m_handle, newValue, oldValue);
//
// If the interlocked-cmp-exchange fails, then either we lost a ----
// with another updater, or we lost a ---- w/ the finalizer. In
// either case, we can just let the other guy win.
Object oldValue = GCHandle.InternalGet(h);
h = m_handle;
if (h == IntPtr.Zero)
throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_HandleIsNotInitialized"));
GCHandle.InternalCompareExchange(h, value, oldValue, false /* isPinned */);
// Ensure we don't have any handle recycling attacks in this
// method where the finalizer frees the handle.
GC.KeepAlive(this);
}
}
// Free all system resources associated with this reference.
//
// Note: The WeakReference finalizer is not actually run, but
// treated specially in gc.cpp's ScanForFinalization
// This is needed for subclasses deriving from WeakReference, however.
#pragma warning disable 420
~WeakReference() {
IntPtr old_handle = m_handle;
if (old_handle != IntPtr.Zero) {
if (old_handle == Interlocked.CompareExchange(ref m_handle, IntPtr.Zero, old_handle))
GCHandle.InternalFree(old_handle);
}
}
public virtual void GetObjectData(SerializationInfo info, StreamingContext context) {
if (info==null) {
throw new ArgumentNullException("info");
}
info.AddValue("TrackedObject", Target, typeof(Object));
info.AddValue("TrackResurrection", m_IsLongReference);
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- UserMapPath.cs
- ExcCanonicalXml.cs
- LongSumAggregationOperator.cs
- DataBindingHandlerAttribute.cs
- NumericUpDown.cs
- ControlBindingsCollection.cs
- TimeSpanConverter.cs
- ZipFileInfoCollection.cs
- TableFieldsEditor.cs
- HealthMonitoringSectionHelper.cs
- MDIWindowDialog.cs
- RepeaterItemEventArgs.cs
- ObjectHelper.cs
- ToolStripItem.cs
- EntityKeyElement.cs
- formatter.cs
- CheckedPointers.cs
- Regex.cs
- AssemblyAttributes.cs
- SwitchLevelAttribute.cs
- AmbientValueAttribute.cs
- xsdvalidator.cs
- GACMembershipCondition.cs
- Converter.cs
- Base64Stream.cs
- Mutex.cs
- MaskedTextProvider.cs
- SiteMapDataSourceView.cs
- ConfigurationSectionGroupCollection.cs
- ConfigXmlDocument.cs
- Typography.cs
- BindToObject.cs
- TdsParserSafeHandles.cs
- ShaderEffect.cs
- securitycriticaldataClass.cs
- DirectoryNotFoundException.cs
- TextBox.cs
- FormsAuthenticationTicket.cs
- TileBrush.cs
- CollectionsUtil.cs
- XmlSchemaGroupRef.cs
- MarkupCompilePass2.cs
- BitmapSizeOptions.cs
- XPathNavigatorKeyComparer.cs
- Encoder.cs
- ObjectQueryState.cs
- ReflectionPermission.cs
- _SslSessionsCache.cs
- Ipv6Element.cs
- CodeTypeMemberCollection.cs
- DragCompletedEventArgs.cs
- MessagingDescriptionAttribute.cs
- PropertiesTab.cs
- EntityExpressionVisitor.cs
- AnnotationHighlightLayer.cs
- ExpressionVisitor.cs
- ValueConversionAttribute.cs
- AliasExpr.cs
- SspiWrapper.cs
- EdmValidator.cs
- StrokeNodeData.cs
- XmlDesignerDataSourceView.cs
- ADMembershipProvider.cs
- XmlWriter.cs
- ProtectedUri.cs
- FamilyCollection.cs
- JournalEntry.cs
- MatchingStyle.cs
- PlatformCulture.cs
- XMLSyntaxException.cs
- EnumerableCollectionView.cs
- Substitution.cs
- FilterQueryOptionExpression.cs
- HttpCacheParams.cs
- PropertyStore.cs
- MissingSatelliteAssemblyException.cs
- DoubleUtil.cs
- LineSegment.cs
- MethodSignatureGenerator.cs
- PeerService.cs
- Activator.cs
- TransformerInfoCollection.cs
- ListBox.cs
- MethodSet.cs
- OpenFileDialog.cs
- ConstantCheck.cs
- WebPartMovingEventArgs.cs
- TextWriterEngine.cs
- DbModificationCommandTree.cs
- XpsPackagingException.cs
- SafeRegistryHandle.cs
- AuthorizationRuleCollection.cs
- OdbcHandle.cs
- EdmProperty.cs
- FileLoadException.cs
- Assert.cs
- MarkupExtensionReturnTypeAttribute.cs
- HttpWrapper.cs
- SignedInfo.cs
- SafePEFileHandle.cs