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);
    }
Exemple #2
0
    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);
    }
Exemple #3
0
    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);
    }
Exemple #4
0
    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);
    }
Exemple #7
0
    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");
        }
    }
Exemple #8
0
    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);
    }
Exemple #9
0
    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);
    }