@@ -5807,15 +5807,19 @@ heap_segment* gc_heap::get_segment_for_uoh (int gen_number, size_t size
58075807 gc_etw_segment_pinned_object_heap :
58085808 gc_etw_segment_large_object_heap);
58095809
5810- GCToEEInterface::DiagUpdateGenerationBounds();
5811-
58125810#ifndef USE_REGIONS
58135811#ifdef MULTIPLE_HEAPS
58145812 hp->thread_uoh_segment (gen_number, res);
58155813#else
58165814 thread_uoh_segment (gen_number, res);
58175815#endif //MULTIPLE_HEAPS
58185816#endif //!USE_REGIONS
5817+ GCToEEInterface::DiagAddNewRegion(
5818+ gen_number,
5819+ heap_segment_mem (res),
5820+ heap_segment_allocated (res),
5821+ heap_segment_reserved (res)
5822+ );
58195823 }
58205824
58215825 return res;
@@ -15904,18 +15908,29 @@ BOOL gc_heap::soh_try_fit (int gen_number,
1590415908 fix_youngest_allocation_area();
1590515909
1590615910 heap_segment* next_seg = heap_segment_next (ephemeral_heap_segment);
15911+ bool new_seg = false;
1590715912
1590815913 if (!next_seg)
1590915914 {
1591015915 assert (ephemeral_heap_segment == generation_tail_region (generation_of (gen_number)));
1591115916 next_seg = get_new_region (gen_number);
15917+ new_seg = true;
1591215918 }
1591315919
1591415920 if (next_seg)
1591515921 {
1591615922 dprintf (REGIONS_LOG, ("eph seg %Ix -> next %Ix",
1591715923 heap_segment_mem (ephemeral_heap_segment), heap_segment_mem (next_seg)));
1591815924 ephemeral_heap_segment = next_seg;
15925+ if (new_seg)
15926+ {
15927+ GCToEEInterface::DiagAddNewRegion(
15928+ heap_segment_gen_num (next_seg),
15929+ heap_segment_mem (next_seg),
15930+ heap_segment_allocated (next_seg),
15931+ heap_segment_reserved (next_seg)
15932+ );
15933+ }
1591915934 }
1592015935 else
1592115936 {
@@ -20996,9 +21011,22 @@ bool gc_heap::extend_soh_for_no_gc()
2099621011 }
2099721012
2099821013 region = heap_segment_next (region);
20999- if (( region == nullptr) && !(region = get_new_region (0)) )
21014+ if (region == nullptr)
2100021015 {
21001- break;
21016+ region = get_new_region (0);
21017+ if (region == nullptr)
21018+ {
21019+ break;
21020+ }
21021+ else
21022+ {
21023+ GCToEEInterface::DiagAddNewRegion(
21024+ 0,
21025+ heap_segment_mem (region),
21026+ heap_segment_allocated (region),
21027+ heap_segment_reserved (region)
21028+ );
21029+ }
2100221030 }
2100321031 }
2100421032 else
@@ -42941,6 +42969,75 @@ unsigned int GCHeap::WhichGeneration (Object* object)
4294142969 return g;
4294242970}
4294342971
42972+ unsigned int GCHeap::GetGenerationWithRange (Object* object, uint8_t** ppStart, uint8_t** ppAllocated, uint8_t** ppReserved)
42973+ {
42974+ int generation = -1;
42975+ heap_segment * hs = gc_heap::find_segment ((uint8_t*)object, FALSE);
42976+ #ifdef USE_REGIONS
42977+ generation = heap_segment_gen_num (hs);
42978+ if (generation == max_generation)
42979+ {
42980+ if (heap_segment_loh_p (hs))
42981+ {
42982+ generation = loh_generation;
42983+ }
42984+ else if (heap_segment_poh_p (hs))
42985+ {
42986+ generation = poh_generation;
42987+ }
42988+ }
42989+
42990+ *ppStart = heap_segment_mem (hs);
42991+ *ppAllocated = heap_segment_allocated (hs);
42992+ *ppReserved = heap_segment_reserved (hs);
42993+ #else
42994+ #ifdef MULTIPLE_HEAPS
42995+ gc_heap* hp = heap_segment_heap (hs);
42996+ #else
42997+ gc_heap* hp = __this;
42998+ #endif //MULTIPLE_HEAPS
42999+ if (hs == hp->ephemeral_heap_segment)
43000+ {
43001+ uint8_t* reserved = heap_segment_reserved (hs);
43002+ uint8_t* end = heap_segment_allocated(hs);
43003+ for (int gen = 0; gen < max_generation; gen++)
43004+ {
43005+ uint8_t* start = generation_allocation_start (hp->generation_of (gen));
43006+ if ((uint8_t*)object >= start)
43007+ {
43008+ generation = gen;
43009+ *ppStart = start;
43010+ *ppAllocated = end;
43011+ *ppReserved = reserved;
43012+ break;
43013+ }
43014+ end = reserved = start;
43015+ }
43016+ if (generation == -1)
43017+ {
43018+ *ppStart = heap_segment_mem (hs);
43019+ *ppAllocated = *ppReserved = generation_allocation_start (hp->generation_of (max_generation - 1));
43020+ }
43021+ }
43022+ else
43023+ {
43024+ generation = max_generation;
43025+ if (heap_segment_loh_p (hs))
43026+ {
43027+ generation = loh_generation;
43028+ }
43029+ else if (heap_segment_poh_p (hs))
43030+ {
43031+ generation = poh_generation;
43032+ }
43033+ *ppStart = heap_segment_mem (hs);
43034+ *ppAllocated = heap_segment_allocated (hs);
43035+ *ppReserved = heap_segment_reserved (hs);
43036+ }
43037+ #endif //USE_REGIONS
43038+ return (unsigned int)generation;
43039+ }
43040+
4294443041bool GCHeap::IsEphemeral (Object* object)
4294543042{
4294643043 uint8_t* o = (uint8_t*)object;
0 commit comments