Xamarin Public Jenkins (auto-signing) ef583813eb Imported Upstream version 6.4.0.137
Former-commit-id: 943baa9f16a098c33e129777827f3a9d20da00d6
2019-07-26 19:53:28 +00:00

245 lines
7.7 KiB
C#

using System.Runtime.CompilerServices;
namespace System
{
public enum GCCollectionMode
{
Default = 0,
Forced = 1,
Optimized = 2
}
public enum GCNotificationStatus
{
Succeeded = 0,
Failed = 1,
Canceled = 2,
Timeout = 3,
NotApplicable = 4
}
public static partial class GC
{
[MethodImplAttribute (MethodImplOptions.InternalCall)]
extern static int GetCollectionCount (int generation);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
extern static int GetMaxGeneration ();
[MethodImplAttribute (MethodImplOptions.InternalCall)]
extern static void InternalCollect (int generation);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
extern static void RecordPressure (long bytesAllocated);
// TODO: Move following to ConditionalWeakTable
[MethodImplAttribute (MethodImplOptions.InternalCall)]
internal extern static void register_ephemeron_array (Ephemeron[] array);
[MethodImplAttribute (MethodImplOptions.InternalCall)]
extern static object get_ephemeron_tombstone ();
internal static readonly object EPHEMERON_TOMBSTONE = get_ephemeron_tombstone ();
[MethodImplAttribute (MethodImplOptions.InternalCall)]
public static extern long GetAllocatedBytesForCurrentThread ();
public static long GetTotalAllocatedBytes (bool precise = false) => 0;
public static void AddMemoryPressure (long bytesAllocated)
{
if (bytesAllocated <= 0)
throw new ArgumentOutOfRangeException (nameof (bytesAllocated), SR.ArgumentOutOfRange_NeedPosNum);
if (IntPtr.Size == 4 && bytesAllocated > Int32.MaxValue)
throw new ArgumentOutOfRangeException (nameof (bytesAllocated), SR.ArgumentOutOfRange_MustBeNonNegInt32);
RecordPressure (bytesAllocated);
}
public static void RemoveMemoryPressure (long bytesAllocated)
{
if (bytesAllocated <= 0)
throw new ArgumentOutOfRangeException (nameof (bytesAllocated), SR.ArgumentOutOfRange_NeedPosNum);
if (IntPtr.Size == 4 && bytesAllocated > Int32.MaxValue)
throw new ArgumentOutOfRangeException (nameof (bytesAllocated), SR.ArgumentOutOfRange_MustBeNonNegInt32);
RecordPressure (-bytesAllocated);
}
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public static extern int GetGeneration (object obj);
public static void Collect (int generation)
{
Collect (generation, GCCollectionMode.Default);
}
public static void Collect ()
{
InternalCollect (MaxGeneration);
}
public static void Collect (int generation, GCCollectionMode mode) => Collect (generation, mode, true);
public static void Collect (int generation, GCCollectionMode mode, bool blocking) => Collect (generation, mode, blocking, false);
public static void Collect (int generation, GCCollectionMode mode, bool blocking, bool compacting)
{
if (generation < 0)
throw new ArgumentOutOfRangeException (nameof (generation), "generation", SR.ArgumentOutOfRange_GenericPositive);
if ((mode < GCCollectionMode.Default) || (mode > GCCollectionMode.Optimized))
throw new ArgumentOutOfRangeException (nameof (mode), SR.ArgumentOutOfRange_Enum);
InternalCollect (generation);
}
public static int CollectionCount (int generation)
{
if (generation < 0)
throw new ArgumentOutOfRangeException (nameof (generation), SR.ArgumentOutOfRange_GenericPositive);
return GetCollectionCount (generation);
}
[MethodImplAttribute (MethodImplOptions.NoInlining)] // disable optimizations
public static void KeepAlive (object obj)
{
}
public static int GetGeneration (WeakReference wo)
{
object obj = wo.Target;
if (obj == null)
throw new ArgumentException ();
return GetGeneration (obj);
}
public static int MaxGeneration {
get {
return GetMaxGeneration ();
}
}
[MethodImplAttribute (MethodImplOptions.InternalCall)]
public static extern void WaitForPendingFinalizers ();
[MethodImplAttribute(MethodImplOptions.InternalCall)]
static extern void _SuppressFinalize (object o);
public static void SuppressFinalize (object obj)
{
if (obj == null)
throw new ArgumentNullException (nameof (obj));
_SuppressFinalize (obj);
}
[MethodImplAttribute(MethodImplOptions.InternalCall)]
static extern void _ReRegisterForFinalize (object o);
public static void ReRegisterForFinalize (object obj)
{
if (obj == null)
throw new ArgumentNullException (nameof (obj));
_ReRegisterForFinalize (obj);
}
[MethodImplAttribute (MethodImplOptions.InternalCall)]
public extern static long GetTotalMemory (bool forceFullCollection);
static bool _RegisterForFullGCNotification(int maxGenerationPercentage, int largeObjectHeapPercentage)
{
throw new NotImplementedException ();
}
static bool _CancelFullGCNotification ()
{
throw new NotImplementedException ();
}
static GCNotificationStatus _WaitForFullGCApproach (int millisecondsTimeout)
{
throw new NotImplementedException ();
}
static GCNotificationStatus _WaitForFullGCComplete (int millisecondsTimeout)
{
throw new NotImplementedException ();
}
public static void RegisterForFullGCNotification (int maxGenerationThreshold, int largeObjectHeapThreshold)
{
if ((maxGenerationThreshold <= 0) || (maxGenerationThreshold >= 100))
throw new ArgumentOutOfRangeException (nameof (maxGenerationThreshold),
String.Format (SR.ArgumentOutOfRange_Bounds_Lower_Upper, 1, 99));
if ((largeObjectHeapThreshold <= 0) || (largeObjectHeapThreshold >= 100))
throw new ArgumentOutOfRangeException (nameof (largeObjectHeapThreshold),
String.Format (SR.ArgumentOutOfRange_Bounds_Lower_Upper, 1, 99));
if (!_RegisterForFullGCNotification(maxGenerationThreshold, largeObjectHeapThreshold))
throw new InvalidOperationException (SR.InvalidOperation_NotWithConcurrentGC);
}
public static void CancelFullGCNotification ()
{
if (!_CancelFullGCNotification ())
throw new InvalidOperationException (SR.InvalidOperation_NotWithConcurrentGC);
}
public static GCNotificationStatus WaitForFullGCApproach ()
{
return (GCNotificationStatus)_WaitForFullGCApproach (-1);
}
public static GCNotificationStatus WaitForFullGCApproach (int millisecondsTimeout)
{
if (millisecondsTimeout < -1)
throw new ArgumentOutOfRangeException (nameof (millisecondsTimeout), SR.ArgumentOutOfRange_NeedNonNegOrNegative1);
return _WaitForFullGCApproach (millisecondsTimeout);
}
public static GCNotificationStatus WaitForFullGCComplete ()
{
return _WaitForFullGCComplete(-1);
}
public static GCNotificationStatus WaitForFullGCComplete (int millisecondsTimeout)
{
if (millisecondsTimeout < -1)
throw new ArgumentOutOfRangeException (nameof (millisecondsTimeout), SR.ArgumentOutOfRange_NeedNonNegOrNegative1);
return _WaitForFullGCComplete (millisecondsTimeout);
}
static bool StartNoGCRegion (long totalSize, bool hasLohSize, long lohSize, bool disallowFullBlockingGC)
{
throw new NotImplementedException ();
}
public static bool TryStartNoGCRegion (long totalSize) => StartNoGCRegion (totalSize, false, 0, false);
public static bool TryStartNoGCRegion (long totalSize, long lohSize) => StartNoGCRegion (totalSize, true, lohSize, false);
public static bool TryStartNoGCRegion (long totalSize, bool disallowFullBlockingGC) => StartNoGCRegion (totalSize, false, 0, disallowFullBlockingGC);
public static bool TryStartNoGCRegion (long totalSize, long lohSize, bool disallowFullBlockingGC) => StartNoGCRegion (totalSize, true, lohSize, disallowFullBlockingGC);
public static void EndNoGCRegion ()
{
throw new NotImplementedException ();
}
internal static ulong GetSegmentSize ()
{
// coreclr default
return 1024 * 1024 * 16;
}
public static GCMemoryInfo GetGCMemoryInfo ()
{
return default;
}
internal static T[] AllocateUninitializedArray<T> (int length)
{
return new T [length];
}
}
}