Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/runtime.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Au <andrewau@microsoft.com>2021-07-14 01:10:34 +0300
committerGitHub <noreply@github.com>2021-07-14 01:10:34 +0300
commitf5316845d5a0069f1b265b5f6d3b81b827450737 (patch)
treec4af9992ead93a397e278eba2d0c8ea76a01c667 /src/coreclr/gc
parent14854e209868749262bd58a64407b3802177542f (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.cpp16
-rw-r--r--src/coreclr/gc/gcpriv.h2
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