-
-
Notifications
You must be signed in to change notification settings - Fork 52
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #21 from Sergio0694/dev/suppressgctransition
Add [SuppressGCTransition] polyfill
- Loading branch information
Showing
3 changed files
with
74 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
72 changes: 72 additions & 0 deletions
72
...esources/RuntimeSupported/System.Runtime.InteropServices.SuppressGCTransitionAttribute.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
// <auto-generated/> | ||
#pragma warning disable | ||
#nullable enable annotations | ||
|
||
// Licensed to the .NET Foundation under one or more agreements. | ||
// The .NET Foundation licenses this file to you under the MIT license. | ||
|
||
namespace System.Runtime.InteropServices | ||
{ | ||
/// <summary> | ||
/// An attribute used to indicate a GC transition should be skipped when making an unmanaged function call. | ||
/// </summary> | ||
/// <example> | ||
/// Example of a valid use case. The Win32 `GetTickCount()` function is a small performance related function | ||
/// that reads some global memory and returns the value. In this case, the GC transition overhead is significantly | ||
/// more than the memory read. | ||
/// <code> | ||
/// using System; | ||
/// using System.Runtime.InteropServices; | ||
/// class Program | ||
/// { | ||
/// [DllImport("Kernel32")] | ||
/// [SuppressGCTransition] | ||
/// static extern int GetTickCount(); | ||
/// static void Main() | ||
/// { | ||
/// Console.WriteLine($"{GetTickCount()}"); | ||
/// } | ||
/// } | ||
/// </code> | ||
/// </example> | ||
/// <remarks> | ||
/// This attribute is ignored if applied to a method without the <see cref="global::System.Runtime.InteropServices.DllImportAttribute"/>. | ||
/// | ||
/// Forgoing this transition can yield benefits when the cost of the transition is more than the execution time | ||
/// of the unmanaged function. However, avoiding this transition removes some of the guarantees the runtime | ||
/// provides through a normal P/Invoke. When exiting the managed runtime to enter an unmanaged function the | ||
/// GC must transition from Cooperative mode into Preemptive mode. Full details on these modes can be found at | ||
/// https://github.com/dotnet/runtime/blob/main/docs/coding-guidelines/clr-code-guide.md#2.1.8. | ||
/// Suppressing the GC transition is an advanced scenario and should not be done without fully understanding | ||
/// potential consequences. | ||
/// | ||
/// One of these consequences is an impact to Mixed-mode debugging (https://docs.microsoft.com/visualstudio/debugger/how-to-debug-in-mixed-mode). | ||
/// During Mixed-mode debugging, it is not possible to step into or set breakpoints in a P/Invoke that | ||
/// has been marked with this attribute. A workaround is to switch to native debugging and set a breakpoint in the native function. | ||
/// In general, usage of this attribute is not recommended if debugging the P/Invoke is important, for example | ||
/// stepping through the native code or diagnosing an exception thrown from the native code. | ||
/// | ||
/// The runtime may load the native library for method marked with this attribute in advance before the method is called for the first time. | ||
/// Usage of this attribute is not recommended for platform neutral libraries with conditional platform specific code. | ||
/// | ||
/// The P/Invoke method that this attribute is applied to must have all of the following properties: | ||
/// * Native function always executes for a trivial amount of time (less than 1 microsecond). | ||
/// * Native function does not perform a blocking syscall (e.g. any type of I/O). | ||
/// * Native function does not call back into the runtime (e.g. Reverse P/Invoke). | ||
/// * Native function does not throw exceptions. | ||
/// * Native function does not manipulate locks or other concurrency primitives. | ||
/// | ||
/// Consequences of invalid uses of this attribute: | ||
/// * GC starvation. | ||
/// * Immediate runtime termination. | ||
/// * Data corruption. | ||
/// </remarks> | ||
[global::System.AttributeUsage(global::System.AttributeTargets.Method, Inherited = false)] | ||
[global::System.Diagnostics.Conditional("MULTI_TARGETING_SUPPORT_ATTRIBUTES")] | ||
internal sealed class SuppressGCTransitionAttribute : global::System.Attribute | ||
{ | ||
public SuppressGCTransitionAttribute() | ||
{ | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters