Skip to content
This repository has been archived by the owner on Jan 23, 2023. It is now read-only.

Commit

Permalink
Move parts of WeakReference to shared partition (#24800)
Browse files Browse the repository at this point in the history
  • Loading branch information
marek-safar authored and jkotas committed May 28, 2019
1 parent c690dae commit 2b08a11
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 97 deletions.
4 changes: 2 additions & 2 deletions src/System.Private.CoreLib/System.Private.CoreLib.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -284,8 +284,8 @@
<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" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -923,6 +923,8 @@
<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" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,34 +2,20 @@
// 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
{
[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.)
//
Expand Down Expand Up @@ -74,29 +60,6 @@ public bool TryGetTarget([NotNullWhen(true)] out T target)
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)
Expand All @@ -107,11 +70,5 @@ public void GetObjectData(SerializationInfo info, StreamingContext context)
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();
}
}
51 changes: 51 additions & 0 deletions src/System.Private.CoreLib/shared/System/WeakReference.cs
Original file line number Diff line number Diff line change
@@ -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)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand All @@ -34,34 +22,6 @@ protected WeakReference()
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.
//
Expand Down Expand Up @@ -100,16 +60,6 @@ public extern virtual object? Target
[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);

Expand Down
45 changes: 45 additions & 0 deletions src/System.Private.CoreLib/src/System/WeakReference.T.CoreCLR.cs
Original file line number Diff line number Diff line change
@@ -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();
}
}

0 comments on commit 2b08a11

Please sign in to comment.