|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.Diagnostics.DataContractReader.Contracts.GCHelpers;
internal sealed class GCHeapWKS : IGCHeap
{
public GCHeapWKS(Target target)
{
if (target.TryReadGlobalPointer(Constants.Globals.GCHeapMarkArray, out TargetPointer? markArrayPtr))
MarkArray = target.ReadPointer(markArrayPtr.Value);
if (target.TryReadGlobalPointer(Constants.Globals.GCHeapNextSweepObj, out TargetPointer? nextSweepObjPtr))
NextSweepObj = target.ReadPointer(nextSweepObjPtr.Value);
if (target.TryReadGlobalPointer(Constants.Globals.GCHeapBackgroundMinSavedAddr, out TargetPointer? bgMinPtr))
BackgroundMinSavedAddr = target.ReadPointer(bgMinPtr.Value);
if (target.TryReadGlobalPointer(Constants.Globals.GCHeapBackgroundMaxSavedAddr, out TargetPointer? bgMaxPtr))
BackgroundMaxSavedAddr = target.ReadPointer(bgMaxPtr.Value);
AllocAllocated = target.ReadPointer(target.ReadGlobalPointer(Constants.Globals.GCHeapAllocAllocated));
EphemeralHeapSegment = target.ReadPointer(target.ReadGlobalPointer(Constants.Globals.GCHeapEphemeralHeapSegment));
CardTable = target.ReadPointer(target.ReadGlobalPointer(Constants.Globals.GCHeapCardTable));
FinalizeQueue = target.ReadPointer(target.ReadGlobalPointer(Constants.Globals.GCHeapFinalizeQueue));
GenerationTable = target.ReadGlobalPointer(Constants.Globals.GCHeapGenerationTable);
if (target.TryReadGlobalPointer(Constants.Globals.GCHeapSavedSweepEphemeralSeg, out TargetPointer? savedSweepEphemeralSegPtr))
SavedSweepEphemeralSeg = target.ReadPointer(savedSweepEphemeralSegPtr.Value);
if (target.TryReadGlobalPointer(Constants.Globals.GCHeapSavedSweepEphemeralStart, out TargetPointer? savedSweepEphemeralStartPtr))
SavedSweepEphemeralStart = target.ReadPointer(savedSweepEphemeralStartPtr.Value);
OomData = target.ProcessedData.GetOrAdd<Data.OomHistory>(target.ReadGlobalPointer(Constants.Globals.GCHeapOomData));
InternalRootArray = target.ReadPointer(target.ReadGlobalPointer(Constants.Globals.GCHeapInternalRootArray));
InternalRootArrayIndex = target.ReadNUInt(target.ReadGlobalPointer(Constants.Globals.GCHeapInternalRootArrayIndex));
HeapAnalyzeSuccess = target.Read<int>(target.ReadGlobalPointer(Constants.Globals.GCHeapHeapAnalyzeSuccess)) != 0;
InterestingData = target.ReadGlobalPointer(Constants.Globals.GCHeapInterestingData);
CompactReasons = target.ReadGlobalPointer(Constants.Globals.GCHeapCompactReasons);
ExpandMechanisms = target.ReadGlobalPointer(Constants.Globals.GCHeapExpandMechanisms);
InterestingMechanismBits = target.ReadGlobalPointer(Constants.Globals.GCHeapInterestingMechanismBits);
if (target.TryReadGlobalPointer(Constants.Globals.GCHeapFreeableSohSegment, out TargetPointer? freeableSohSegPtr))
FreeableSohSegment = target.ReadPointer(freeableSohSegPtr.Value);
if (target.TryReadGlobalPointer(Constants.Globals.GCHeapFreeableUohSegment, out TargetPointer? freeableUohSegPtr))
FreeableUohSegment = target.ReadPointer(freeableUohSegPtr.Value);
if (target.TryReadGlobalPointer(Constants.Globals.GCHeapFreeRegions, out TargetPointer? freeRegionsPtr))
FreeRegions = freeRegionsPtr.Value;
}
public TargetPointer? MarkArray { get; }
public TargetPointer? NextSweepObj { get; }
public TargetPointer? BackgroundMinSavedAddr { get; }
public TargetPointer? BackgroundMaxSavedAddr { get; }
public TargetPointer AllocAllocated { get; }
public TargetPointer EphemeralHeapSegment { get; }
public TargetPointer CardTable { get; }
public TargetPointer FinalizeQueue { get; }
public TargetPointer GenerationTable { get; }
public TargetPointer? SavedSweepEphemeralSeg { get; }
public TargetPointer? SavedSweepEphemeralStart { get; }
public Data.OomHistory OomData { get; }
public TargetPointer InternalRootArray { get; }
public TargetNUInt InternalRootArrayIndex { get; }
public bool HeapAnalyzeSuccess { get; }
public TargetPointer InterestingData { get; }
public TargetPointer CompactReasons { get; }
public TargetPointer ExpandMechanisms { get; }
public TargetPointer InterestingMechanismBits { get; }
public TargetPointer? FreeableSohSegment { get; }
public TargetPointer? FreeableUohSegment { get; }
public TargetPointer? FreeRegions { get; }
}
|