private static int Inline_NoGCTransition(int expected) { Console.WriteLine($"{nameof(Inline_NoGCTransition)} ({expected}) ..."); int n; SuppressGCTransitionNative.NextUInt_Inline_NoGCTransition(&n); Assert.AreEqual(expected, n); return(n + 1); }
private static int NoInline_GCTransition_FunctionPointer(int expected) { Console.WriteLine($"{nameof(NoInline_GCTransition)} ({expected}) ..."); int n; SuppressGCTransitionNative.GetNextUIntFunctionPointer_NoInline_GCTransition()(&n); Assert.AreEqual(expected, n); return(n + 1); }
private static int Inline_GCTransition_FunctionPointer(int expected) { Console.WriteLine($"{nameof(Inline_GCTransition)} ({expected}) ..."); int n; int ret = SuppressGCTransitionNative.GetNextUIntFunctionPointer_Inline_GCTransition()(&n); Assert.AreEqual(expected, n); ValidateMode(transitionSuppressed: false, ret); return(n + 1); }
private static int NoInline_GCTransition(int expected) { Console.WriteLine($"{nameof(NoInline_GCTransition)} ({expected}) ..."); int n; bool ret = SuppressGCTransitionNative.NextUInt_NoInline_GCTransition(&n); Assert.AreEqual(expected, n); ValidateMode(transitionSuppressed: false, ret); return(n + 1); }
private static int NoInline_NoGCTransition_FunctionPointer(int expected) { Console.WriteLine($"{nameof(NoInline_NoGCTransition)} ({expected}) ..."); int n; bool ret = SuppressGCTransitionNative.GetNextUIntFunctionPointer_NoInline_NoGCTransition()(&n); Assert.Equal(expected, n); CheckGCMode.Validate(transitionSuppressed: true, ret); return(n + 1); }
private static int Inline_GCTransition(int expected) { Console.WriteLine($"{nameof(Inline_GCTransition)} ({expected}) ..."); int n; int ret = SuppressGCTransitionNative.NextUInt_Inline_GCTransition(&n); Assert.Equal(expected, n); CheckGCMode.Validate(transitionSuppressed: false, ret); return(n + 1); }
private static void InitializeExplicitModeCheck() { // GetIsInCooperativeGCModeFunctionPointer is conditionally included based on the runtime build configuration, // so we check for its existence and only do the explicit mode validation if it is available. Type marshalType = typeof(object).Assembly.GetType(typeof(System.Runtime.InteropServices.Marshal).FullName); MethodInfo getFunctionPtr = marshalType.GetMethod("GetIsInCooperativeGCModeFunctionPointer", BindingFlags.NonPublic | BindingFlags.Static); if (getFunctionPtr != null) { var isInCooperativeModeFunc = (delegate * unmanaged <int>)(IntPtr) getFunctionPtr.Invoke(null, null); SuppressGCTransitionNative.SetIsInCooperativeModeFunction(isInCooperativeModeFunc); ExplicitModeCheckEnabled = true; Console.WriteLine("Explicit GC mode check is enabled"); } }
private static int CallAsFunctionPointer(int expected) { Console.WriteLine($"{nameof(CallAsFunctionPointer)} ({expected}) ..."); IntPtr fptr = SuppressGCTransitionNative.GetNextUIntFunctionPointer(); int n = 0; int * pn = &n; object boxedN = Pointer.Box(pn, typeof(int *)); MethodInfo callNextUInt = typeof(FunctionPointer).GetMethod("Call_NextUInt"); callNextUInt.Invoke(null, new object[] { fptr, boxedN }); Assert.AreEqual(expected, n); return(n + 1); }
private static int Mixed_TightLoop(int expected) { Console.WriteLine($"{nameof(Mixed_TightLoop)} ({expected}) ..."); int n = 0; int count = 0x100; for (int i = 0; i < count; ++i) { SuppressGCTransitionNative.NextUInt_Inline_NoGCTransition(&n); } // Use the non-optimized version at the end so a GC poll is not // inserted here as well. SuppressGCTransitionNative.NextUInt_NoInline_GCTransition(&n); Assert.AreEqual(expected + count, n); return(n + 1); }
private static int Mixed(int expected) { Console.WriteLine($"{nameof(Mixed)} ({expected}) ..."); int n; { bool ret = SuppressGCTransitionNative.NextUInt_NoInline_GCTransition(&n); Assert.Equal(expected++, n); CheckGCMode.Validate(transitionSuppressed: false, ret); ret = SuppressGCTransitionNative.NextUInt_NoInline_NoGCTransition(&n); Assert.Equal(expected++, n); CheckGCMode.Validate(transitionSuppressed: true, ret); } { int ret = SuppressGCTransitionNative.NextUInt_Inline_GCTransition(&n); Assert.Equal(expected++, n); CheckGCMode.Validate(transitionSuppressed: false, ret); ret = SuppressGCTransitionNative.NextUInt_Inline_NoGCTransition(&n); Assert.Equal(expected++, n); CheckGCMode.Validate(transitionSuppressed: true, ret); } return(n + 1); }