Move parts of WeakReference to shared partition (#24800)
authorMarek Safar <marek.safar@gmail.com>
Tue, 28 May 2019 20:54:38 +0000 (22:54 +0200)
committerJan Kotas <jkotas@microsoft.com>
Tue, 28 May 2019 20:54:38 +0000 (13:54 -0700)
src/System.Private.CoreLib/System.Private.CoreLib.csproj
src/System.Private.CoreLib/shared/System.Private.CoreLib.Shared.projitems
src/System.Private.CoreLib/shared/System/WeakReference.T.cs [moved from src/System.Private.CoreLib/src/System/WeakReferenceOfT.cs with 61% similarity]
src/System.Private.CoreLib/shared/System/WeakReference.cs [new file with mode: 0644]
src/System.Private.CoreLib/src/System/WeakReference.CoreCLR.cs [moved from src/System.Private.CoreLib/src/System/WeakReference.cs with 58% similarity]
src/System.Private.CoreLib/src/System/WeakReference.T.CoreCLR.cs [new file with mode: 0644]

index 455973c..246cd42 100644 (file)
     <Compile Include="$(BclSourcesRoot)\System\TypeLoadException.CoreCLR.cs" />
     <Compile Include="$(BclSourcesRoot)\System\TypeNameParser.cs" />
     <Compile Include="$(BclSourcesRoot)\System\ValueType.cs" />
-    <Compile Include="$(BclSourcesRoot)\System\WeakReference.cs" />
-    <Compile Include="$(BclSourcesRoot)\System\WeakReferenceOfT.cs" />
+    <Compile Include="$(BclSourcesRoot)\System\WeakReference.CoreCLR.cs" />
+    <Compile Include="$(BclSourcesRoot)\System\WeakReference.T.CoreCLR.cs" />
     <Compile Include="shared\Interop\Windows\Kernel32\Interop.HandleTypes.cs" />
     <Compile Include="shared\Interop\Windows\Kernel32\Interop.GetStdHandle.cs" />
     <Compile Include="shared\Interop\Windows\Kernel32\Interop.LocalAlloc.cs" />
index ba8509d..ece302e 100644 (file)
     <Compile Include="$(MSBuildThisFileDirectory)System\ValueTuple.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)System\Version.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)System\Void.cs" />
+    <Compile Include="$(MSBuildThisFileDirectory)System\WeakReference.cs" />
+    <Compile Include="$(MSBuildThisFileDirectory)System\WeakReference.T.cs" />
   </ItemGroup>
   <ItemGroup>
     <Compile Include="$(MSBuildThisFileDirectory)Interop\Windows\Advapi32\Interop.ActivityControl.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<T> : ISerializable
+    public sealed partial class WeakReference<T> : 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<T> finalizer is not usually run, but
-        // treated specially in gc.cpp's ScanForFinalization
-        // This is needed for subclasses deriving from WeakReference<T>, 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/System.Private.CoreLib/shared/System/WeakReference.cs b/src/System.Private.CoreLib/shared/System/WeakReference.cs
new file mode 100644 (file)
index 0000000..bb436e6
--- /dev/null
@@ -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<T> 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,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<T> 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/System.Private.CoreLib/src/System/WeakReference.T.CoreCLR.cs b/src/System.Private.CoreLib/src/System/WeakReference.T.CoreCLR.cs
new file mode 100644 (file)
index 0000000..028817f
--- /dev/null
@@ -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<T> : 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<T> finalizer is not usually run, but
+        // treated specially in gc.cpp's ScanForFinalization
+        // This is needed for subclasses deriving from WeakReference<T>, 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();
+    }
+}