public void Decode(PerHeapEventVersion Version) { // First decode the reasons that return us a generation number. // It's the same in 4.0 and 4.5. for (Condemned_Reason_Generation i = 0; i < Condemned_Reason_Generation.CRG_max; i++) { CondemnedReasonGroups[(int)i] = (byte)GetReasonWithGenNumber(i); } // Then decode the reasons that just indicate true or false. for (Condemned_Reason_Condition i = 0; i < Condemned_Reason_Condition.CRC_max; i++) { if (GetReasonWithCondition(i, Version)) { switch (i) { case Condemned_Reason_Condition.CRC_induced_fullgc_p: CondemnedReasonGroups[(int)CondemnedReasonGroup.CRG_Induced] = (byte)InducedType.Blocking; break; case Condemned_Reason_Condition.CRC_induced_noforce_p: CondemnedReasonGroups[(int)CondemnedReasonGroup.CRG_Induced] = (byte)InducedType.NotForced; break; case Condemned_Reason_Condition.CRC_low_ephemeral_p: CondemnedReasonGroups[(int)CondemnedReasonGroup.CRG_Low_Ephemeral] = 1; break; case Condemned_Reason_Condition.CRC_low_card_p: CondemnedReasonGroups[(int)CondemnedReasonGroup.CRG_Internal_Tuning] = 1; break; case Condemned_Reason_Condition.CRC_eph_high_frag_p: CondemnedReasonGroups[(int)CondemnedReasonGroup.CRG_Fragmented_Ephemeral] = 1; break; case Condemned_Reason_Condition.CRC_max_high_frag_p: CondemnedReasonGroups[(int)CondemnedReasonGroup.CRG_Fragmented_Gen2] = 1; break; case Condemned_Reason_Condition.CRC_max_high_frag_e_p: CondemnedReasonGroups[(int)CondemnedReasonGroup.CRG_Fragmented_Gen1_To_Gen2] = 1; break; case Condemned_Reason_Condition.CRC_max_high_frag_m_p: case Condemned_Reason_Condition.CRC_max_high_frag_vm_p: CondemnedReasonGroups[(int)CondemnedReasonGroup.CRG_Fragmented_Gen2_High_Mem] = 1; break; case Condemned_Reason_Condition.CRC_max_gen1: CondemnedReasonGroups[(int)CondemnedReasonGroup.CRG_Alloc_Exceeded] = 2; break; case Condemned_Reason_Condition.CRC_expand_fullgc_p: CondemnedReasonGroups[(int)CondemnedReasonGroup.CRG_Expand_Heap] = 1; break; case Condemned_Reason_Condition.CRC_before_oom: CondemnedReasonGroups[(int)CondemnedReasonGroup.CRG_GC_Before_OOM] = 1; break; case Condemned_Reason_Condition.CRC_gen2_too_small: CondemnedReasonGroups[(int)CondemnedReasonGroup.CRG_Too_Small_For_BGC] = 1; break; case Condemned_Reason_Condition.CRC_before_bgc: CondemnedReasonGroups[(int)CondemnedReasonGroup.CRG_Ephemeral_Before_BGC] = 1; break; default: Debug.Assert(false, "Unexpected reason"); break; } } } }
private bool GetReasonWithCondition(Condemned_Reason_Condition Reason_Condition, PerHeapEventVersion Version) { bool ConditionIsSet = false; if (Version == PerHeapEventVersion.V4_0) { Debug.Assert((int)Reason_Condition < 16); ConditionIsSet = ((EncodedReasons.Reasons & (1 << (int)(Reason_Condition + 16))) != 0); } else { ConditionIsSet = ((EncodedReasons.ReasonsEx & (1 << (int)Reason_Condition)) != 0); } return ConditionIsSet; }
private void GetVersion() { if (Version == PerHeapEventVersion.V0) { if (PerHeapHistories[0].V4_0) Version = PerHeapEventVersion.V4_0; else if (PerHeapHistories[0].V4_5) { Version = PerHeapEventVersion.V4_5; Debug.Assert(PerHeapHistories[0].Version == 2); } else { Version = PerHeapEventVersion.V4_6; Debug.Assert(PerHeapHistories[0].Version == 3); } } }