Skip to content

Commit fff2d6d

Browse files
ko1dbussink
authored andcommitted
* gc.c (heap_extend_pages): calculate next growing heap size.
* gc.c (heap_set_increment): accept addition pages instead of minimum pages. * gc.c (gc_after_sweep): use heap_etend_pages(). * gc.c (gc_heap_prepare_minimum_pages): add only 1 page. * gc.c (heap_ready_to_gc): add only 1 page. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@45949 b2dd03c8-39d4-4d8f-98ff-823fe69b080e Conflicts: ChangeLog
1 parent 339fad1 commit fff2d6d

File tree

1 file changed

+15
-11
lines changed

1 file changed

+15
-11
lines changed

gc.c

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

12181222
static 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

Comments
 (0)