@@ -1193,26 +1193,30 @@ heap_add_pages(rb_objspace_t *objspace, rb_heap_t *heap, size_t add)
11931193 heap_pages_increment = 0 ;
11941194}
11951195
1196- static void
1197- heap_set_increment (rb_objspace_t * objspace , size_t minimum_limit )
1196+ static size_t
1197+ heap_extend_pages (rb_objspace_t * objspace )
11981198{
11991199 size_t used = heap_pages_used - heap_tomb -> page_length ;
12001200 size_t next_used_limit = (size_t )(used * gc_params .growth_factor );
1201+
12011202 if (gc_params .growth_max_slots > 0 ) {
12021203 size_t max_used_limit = (size_t )(used + gc_params .growth_max_slots /HEAP_OBJ_LIMIT );
12031204 if (next_used_limit > max_used_limit ) next_used_limit = max_used_limit ;
12041205 }
1205- if (next_used_limit == heap_pages_used ) next_used_limit ++ ;
12061206
1207- if (next_used_limit < minimum_limit ) {
1208- next_used_limit = minimum_limit ;
1207+ return next_used_limit - used ;
12091208 }
12101209
1210+ static void
1211+ heap_set_increment (rb_objspace_t * objspace , size_t additional_pages )
1212+ {
1213+ size_t used = heap_eden -> page_length ;
1214+ size_t next_used_limit = used + additional_pages ;
1215+
1216+ if (next_used_limit == heap_pages_used ) next_used_limit ++ ;
1217+
12111218 heap_pages_increment = next_used_limit - used ;
12121219 heap_pages_expand_sorted (objspace );
1213-
1214- if (0 ) fprintf (stderr , "heap_set_increment: heap_pages_length: %d, heap_pages_used: %d, heap_pages_increment: %d, next_used_limit: %d\n" ,
1215- (int )heap_pages_length , (int )heap_pages_used , (int )heap_pages_increment , (int )next_used_limit );
12161220}
12171221
12181222static int
@@ -2855,7 +2859,7 @@ gc_heap_prepare_minimum_pages(rb_objspace_t *objspace, rb_heap_t *heap)
28552859{
28562860 if (!heap -> free_pages ) {
28572861 /* there is no free after page_sweep() */
2858- heap_set_increment (objspace , 0 );
2862+ heap_set_increment (objspace , 1 );
28592863 if (!heap_increment (objspace , heap )) { /* can't allocate additional free objects */
28602864 during_gc = 0 ;
28612865 rb_memerror ();
@@ -2994,7 +2998,7 @@ gc_after_sweep(rb_objspace_t *objspace)
29942998 (int )heap -> total_slots , (int )heap_pages_swept_slots , (int )heap_pages_min_free_slots );
29952999
29963000 if (heap_pages_swept_slots < heap_pages_min_free_slots ) {
2997- heap_set_increment (objspace , ( heap_pages_min_free_slots - heap_pages_swept_slots ) / HEAP_OBJ_LIMIT );
3001+ heap_set_increment (objspace , heap_extend_pages ( objspace ) );
29983002 heap_increment (objspace , heap );
29993003
30003004#if USE_RGENGC
@@ -5064,7 +5068,7 @@ heap_ready_to_gc(rb_objspace_t *objspace, rb_heap_t *heap)
50645068 if (dont_gc || during_gc ) {
50655069 if (!heap -> freelist && !heap -> free_pages ) {
50665070 if (!heap_increment (objspace , heap )) {
5067- heap_set_increment (objspace , 0 );
5071+ heap_set_increment (objspace , 1 );
50685072 heap_increment (objspace , heap );
50695073 }
50705074 }
0 commit comments