diff options
author | Andrew Au <andrewau@microsoft.com> | 2021-07-14 01:10:34 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-14 01:10:34 +0300 |
commit | f5316845d5a0069f1b265b5f6d3b81b827450737 (patch) | |
tree | c4af9992ead93a397e278eba2d0c8ea76a01c667 /src/coreclr/gc | |
parent | 14854e209868749262bd58a64407b3802177542f (diff) |
Avoid declaring an object cannot fit in a segment if we already have committed space for it (#55585)
Diffstat (limited to 'src/coreclr/gc')
-rw-r--r-- | src/coreclr/gc/gc.cpp | 16 | ||||
-rw-r--r-- | src/coreclr/gc/gcpriv.h | 2 |
2 files changed, 12 insertions, 6 deletions
diff --git a/src/coreclr/gc/gc.cpp b/src/coreclr/gc/gc.cpp index 268fffcd4d7..6cf5283476a 100644 --- a/src/coreclr/gc/gc.cpp +++ b/src/coreclr/gc/gc.cpp @@ -14646,6 +14646,7 @@ BOOL gc_heap::short_on_end_of_seg (heap_segment* seg) BOOL sufficient_p = sufficient_space_regions (end_gen0_region_space, end_space_after_gc()); #else BOOL sufficient_p = sufficient_space_end_seg (allocated, + heap_segment_committed (seg), heap_segment_reserved (seg), end_space_after_gc()); #endif //USE_REGIONS @@ -37875,13 +37876,18 @@ bool gc_heap::sufficient_space_regions (size_t end_space, size_t end_space_requi return false; } #else //USE_REGIONS -BOOL gc_heap::sufficient_space_end_seg (uint8_t* start, uint8_t* seg_end, size_t end_space_required) +BOOL gc_heap::sufficient_space_end_seg (uint8_t* start, uint8_t* committed, uint8_t* reserved, size_t end_space_required) { BOOL can_fit = FALSE; - size_t end_seg_space = (size_t)(seg_end - start); - if (end_seg_space > end_space_required) + size_t committed_space = (size_t)(committed - start); + size_t end_seg_space = (size_t)(reserved - start); + if (committed_space > end_space_required) { - return check_against_hard_limit (end_space_required); + return true; + } + else if (end_seg_space > end_space_required) + { + return check_against_hard_limit (end_space_required - committed_space); } else return false; @@ -38045,7 +38051,7 @@ BOOL gc_heap::ephemeral_gen_fit_p (gc_tuning_point tp) size_t gen0_end_space = get_gen0_end_space(); BOOL can_fit = sufficient_space_regions (gen0_end_space, end_space); #else //USE_REGIONS - BOOL can_fit = sufficient_space_end_seg (start, heap_segment_reserved (ephemeral_heap_segment), end_space); + BOOL can_fit = sufficient_space_end_seg (start, heap_segment_committed (ephemeral_heap_segment), heap_segment_reserved (ephemeral_heap_segment), end_space); #endif //USE_REGIONS return can_fit; } diff --git a/src/coreclr/gc/gcpriv.h b/src/coreclr/gc/gcpriv.h index 09bd97d1891..d3f3526925d 100644 --- a/src/coreclr/gc/gcpriv.h +++ b/src/coreclr/gc/gcpriv.h @@ -3182,7 +3182,7 @@ protected: BOOL& should_expand); #ifndef USE_REGIONS PER_HEAP - BOOL sufficient_space_end_seg (uint8_t* start, uint8_t* seg_end, + BOOL sufficient_space_end_seg (uint8_t* start, uint8_t* committed, uint8_t* reserved, size_t end_space_required); #endif //!USE_REGIONS |