diff options
Diffstat (limited to 'src/mscorlib/src/System/AppContext/AppContextSwitches.cs')
-rw-r--r-- | src/mscorlib/src/System/AppContext/AppContextSwitches.cs | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/src/mscorlib/src/System/AppContext/AppContextSwitches.cs b/src/mscorlib/src/System/AppContext/AppContextSwitches.cs new file mode 100644 index 0000000000..3a96ec2159 --- /dev/null +++ b/src/mscorlib/src/System/AppContext/AppContextSwitches.cs @@ -0,0 +1,110 @@ +// 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. + +namespace System +{ + using System; + using System.Runtime.CompilerServices; + + internal static class AppContextSwitches + { + private static int _noAsyncCurrentCulture; + public static bool NoAsyncCurrentCulture + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return GetCachedSwitchValue(AppContextDefaultValues.SwitchNoAsyncCurrentCulture, ref _noAsyncCurrentCulture); + } + } + + private static int _throwExceptionIfDisposedCancellationTokenSource; + public static bool ThrowExceptionIfDisposedCancellationTokenSource + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return GetCachedSwitchValue(AppContextDefaultValues.SwitchThrowExceptionIfDisposedCancellationTokenSource, ref _throwExceptionIfDisposedCancellationTokenSource); + } + } + + private static int _preserveEventListnerObjectIdentity; + public static bool PreserveEventListnerObjectIdentity + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return GetCachedSwitchValue(AppContextDefaultValues.SwitchPreserveEventListnerObjectIdentity, ref _preserveEventListnerObjectIdentity); + } + } + +#if FEATURE_PATHCOMPAT + private static int _useLegacyPathHandling; + + /// <summary> + /// Use legacy path normalization logic and blocking of extended syntax. + /// </summary> + public static bool UseLegacyPathHandling + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return GetCachedSwitchValue(AppContextDefaultValues.SwitchUseLegacyPathHandling, ref _useLegacyPathHandling); + } + } + + private static int _blockLongPaths; + + /// <summary> + /// Throw PathTooLongException for paths greater than MAX_PATH or directories greater than 248 (as per CreateDirectory Win32 limitations) + /// </summary> + public static bool BlockLongPaths + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return GetCachedSwitchValue(AppContextDefaultValues.SwitchBlockLongPaths, ref _blockLongPaths); + } + } +#endif // FEATURE_PATHCOMPAT + + // + // Implementation details + // + + private static bool DisableCaching { get; set; } + + static AppContextSwitches() + { + bool isEnabled; + if (AppContext.TryGetSwitch(@"TestSwitch.LocalAppContext.DisableCaching", out isEnabled)) + { + DisableCaching = isEnabled; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static bool GetCachedSwitchValue(string switchName, ref int switchValue) + { + if (switchValue < 0) return false; + if (switchValue > 0) return true; + + return GetCachedSwitchValueInternal(switchName, ref switchValue); + } + + private static bool GetCachedSwitchValueInternal(string switchName, ref int switchValue) + { + bool isSwitchEnabled; + AppContext.TryGetSwitch(switchName, out isSwitchEnabled); + + if (DisableCaching) + { + return isSwitchEnabled; + } + + switchValue = isSwitchEnabled ? 1 /*true*/ : -1 /*false*/; + return isSwitchEnabled; + } + } +} |