From 72eab5372348bf7062b69efa8cefe8fb6f34cfcc Mon Sep 17 00:00:00 2001 From: Marek Safar Date: Tue, 28 May 2019 22:54:38 +0200 Subject: [PATCH] Move parts of WeakReference to shared partition (dotnet/coreclr#24800) Commit migrated from https://github.com/dotnet/coreclr/commit/2b08a111cc77d77221889700d169c9c636153355 --- .../System.Private.CoreLib.csproj | 4 +- .../{WeakReference.cs => WeakReference.CoreCLR.cs} | 52 +--------------------- .../src/System/WeakReference.T.CoreCLR.cs | 45 +++++++++++++++++++ .../src/System.Private.CoreLib.Shared.projitems | 2 + .../src/System/WeakReference.T.cs} | 45 +------------------ .../src/System/WeakReference.cs | 51 +++++++++++++++++++++ 6 files changed, 102 insertions(+), 97 deletions(-) rename src/coreclr/src/System.Private.CoreLib/src/System/{WeakReference.cs => WeakReference.CoreCLR.cs} (58%) create mode 100644 src/coreclr/src/System.Private.CoreLib/src/System/WeakReference.T.CoreCLR.cs rename src/{coreclr/src/System.Private.CoreLib/src/System/WeakReferenceOfT.cs => libraries/System.Private.CoreLib/src/System/WeakReference.T.cs} (61%) create mode 100644 src/libraries/System.Private.CoreLib/src/System/WeakReference.cs diff --git a/src/coreclr/src/System.Private.CoreLib/System.Private.CoreLib.csproj b/src/coreclr/src/System.Private.CoreLib/System.Private.CoreLib.csproj index 455973c..246cd42 100644 --- a/src/coreclr/src/System.Private.CoreLib/System.Private.CoreLib.csproj +++ b/src/coreclr/src/System.Private.CoreLib/System.Private.CoreLib.csproj @@ -284,8 +284,8 @@ - - + + diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/WeakReference.cs b/src/coreclr/src/System.Private.CoreLib/src/System/WeakReference.CoreCLR.cs similarity index 58% rename from src/coreclr/src/System.Private.CoreLib/src/System/WeakReference.cs rename to src/coreclr/src/System.Private.CoreLib/src/System/WeakReference.CoreCLR.cs index 244af93..509c24a 100644 --- a/src/coreclr/src/System.Private.CoreLib/src/System/WeakReference.cs +++ b/src/coreclr/src/System.Private.CoreLib/src/System/WeakReference.CoreCLR.cs @@ -2,25 +2,13 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -/*============================================================ -** -** -** Purpose: A wrapper for establishing a WeakReference to an Object. -** -===========================================================*/ - -using System; using System.Runtime.Serialization; -using System.Security; using System.Runtime.CompilerServices; -using System.Runtime.Versioning; using System.Diagnostics; namespace System { - [Serializable] - [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")] - public class WeakReference : ISerializable + public partial class WeakReference : ISerializable { // If you fix bugs here, please fix them in WeakReference at the same time. @@ -34,34 +22,6 @@ namespace System throw new NotImplementedException(); } - // 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) - { - Create(target, trackResurrection); - } - - protected WeakReference(SerializationInfo info, StreamingContext context) - { - if (info == null) - { - throw new ArgumentNullException(nameof(info)); - } - - object? target = info.GetValue("TrackedObject", typeof(object)); // Do not rename (binary serialization) - bool trackResurrection = info.GetBoolean("TrackResurrection"); // Do not rename (binary serialization) - - Create(target, trackResurrection); - } - //Determines whether or not this instance of WeakReference still refers to an object //that has not been collected. // @@ -100,16 +60,6 @@ namespace System [MethodImplAttribute(MethodImplOptions.InternalCall)] extern ~WeakReference(); - public virtual void GetObjectData(SerializationInfo info, StreamingContext context) - { - if (info == null) - { - throw new ArgumentNullException(nameof(info)); - } - info.AddValue("TrackedObject", Target, typeof(object)); // Do not rename (binary serialization) - info.AddValue("TrackResurrection", IsTrackResurrection()); // Do not rename (binary serialization) - } - [MethodImplAttribute(MethodImplOptions.InternalCall)] private extern void Create(object? target, bool trackResurrection); diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/WeakReference.T.CoreCLR.cs b/src/coreclr/src/System.Private.CoreLib/src/System/WeakReference.T.CoreCLR.cs new file mode 100644 index 0000000..028817f --- /dev/null +++ b/src/coreclr/src/System.Private.CoreLib/src/System/WeakReference.T.CoreCLR.cs @@ -0,0 +1,45 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Runtime.Serialization; +using System.Runtime.CompilerServices; + +namespace System +{ + public sealed partial class WeakReference : ISerializable + where T : class? + { + // This field is not a regular GC handle. It can have a special values that are used to prevent a race condition between setting the target and finalization. + internal IntPtr m_handle; + + public void SetTarget(T target) + { + this.Target = target; + } + + // This is property for better debugging experience (VS debugger shows values of properties when you hover over the variables) + private extern T Target + { + [MethodImplAttribute(MethodImplOptions.InternalCall)] + get; + [MethodImplAttribute(MethodImplOptions.InternalCall)] + set; + } + + // Free all system resources associated with this reference. + // + // Note: The WeakReference finalizer is not usually run, but + // treated specially in gc.cpp's ScanForFinalization + // This is needed for subclasses deriving from WeakReference, however. + // Additionally, there may be some cases during shutdown when we run this finalizer. + [MethodImplAttribute(MethodImplOptions.InternalCall)] + extern ~WeakReference(); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern void Create(T target, bool trackResurrection); + + [MethodImplAttribute(MethodImplOptions.InternalCall)] + private extern bool IsTrackResurrection(); + } +} diff --git a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems index ba8509d..ece302e 100644 --- a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems +++ b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems @@ -923,6 +923,8 @@ + + diff --git a/src/coreclr/src/System.Private.CoreLib/src/System/WeakReferenceOfT.cs b/src/libraries/System.Private.CoreLib/src/System/WeakReference.T.cs similarity index 61% rename from src/coreclr/src/System.Private.CoreLib/src/System/WeakReferenceOfT.cs rename to src/libraries/System.Private.CoreLib/src/System/WeakReference.T.cs index 1413a35..6a395ee 100644 --- a/src/coreclr/src/System.Private.CoreLib/src/System/WeakReferenceOfT.cs +++ b/src/libraries/System.Private.CoreLib/src/System/WeakReference.T.cs @@ -2,19 +2,8 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -/*============================================================ -** -** -** Purpose: A wrapper for establishing a WeakReference to a generic type. -** -===========================================================*/ - -using System; using System.Runtime.Serialization; -using System.Security; -using System.Runtime; using System.Runtime.CompilerServices; -using System.Runtime.Versioning; using System.Diagnostics.CodeAnalysis; namespace System @@ -22,14 +11,11 @@ namespace System [Serializable] [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")] // This class is sealed to mitigate security issues caused by Object::MemberwiseClone. - public sealed class WeakReference : ISerializable + public sealed partial class WeakReference : ISerializable where T : class? { // If you fix bugs here, please fix them in WeakReference at the same time. - // This field is not a regular GC handle. It can have a special values that are used to prevent a race condition between setting the target and finalization. - internal IntPtr m_handle; - // Creates a new WeakReference that keeps track of target. // Assumes a Short Weak Reference (ie TrackResurrection is false.) // @@ -74,29 +60,6 @@ namespace System return o != null; } - public void SetTarget(T target) - { - this.Target = target; - } - - // This is property for better debugging experience (VS debugger shows values of properties when you hover over the variables) - private extern T Target - { - [MethodImplAttribute(MethodImplOptions.InternalCall)] - get; - [MethodImplAttribute(MethodImplOptions.InternalCall)] - set; - } - - // Free all system resources associated with this reference. - // - // Note: The WeakReference finalizer is not usually run, but - // treated specially in gc.cpp's ScanForFinalization - // This is needed for subclasses deriving from WeakReference, however. - // Additionally, there may be some cases during shutdown when we run this finalizer. - [MethodImplAttribute(MethodImplOptions.InternalCall)] - extern ~WeakReference(); - public void GetObjectData(SerializationInfo info, StreamingContext context) { if (info == null) @@ -107,11 +70,5 @@ namespace System info.AddValue("TrackedObject", this.Target, typeof(T)); // Do not rename (binary serialization) info.AddValue("TrackResurrection", IsTrackResurrection()); // Do not rename (binary serialization) } - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private extern void Create(T target, bool trackResurrection); - - [MethodImplAttribute(MethodImplOptions.InternalCall)] - private extern bool IsTrackResurrection(); } } diff --git a/src/libraries/System.Private.CoreLib/src/System/WeakReference.cs b/src/libraries/System.Private.CoreLib/src/System/WeakReference.cs new file mode 100644 index 0000000..bb436e6 --- /dev/null +++ b/src/libraries/System.Private.CoreLib/src/System/WeakReference.cs @@ -0,0 +1,51 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Runtime.Serialization; + +namespace System +{ + [Serializable] + [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")] + public partial class WeakReference : ISerializable + { + // If you fix bugs here, please fix them in WeakReference at the same time. + + // 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) + { + } + + public WeakReference(object? target, bool trackResurrection) + { + Create(target, trackResurrection); + } + + protected WeakReference(SerializationInfo info, StreamingContext context) + { + if (info == null) + { + throw new ArgumentNullException(nameof(info)); + } + + object? target = info.GetValue("TrackedObject", typeof(object)); // Do not rename (binary serialization) + bool trackResurrection = info.GetBoolean("TrackResurrection"); // Do not rename (binary serialization) + + Create(target, trackResurrection); + } + + public virtual void GetObjectData(SerializationInfo info, StreamingContext context) + { + if (info == null) + { + throw new ArgumentNullException(nameof(info)); + } + info.AddValue("TrackedObject", Target, typeof(object)); // Do not rename (binary serialization) + info.AddValue("TrackResurrection", IsTrackResurrection()); // Do not rename (binary serialization) + } + } +} -- 2.7.4