Skip to content

Commit 150402e

Browse files
authored
Shrink the ref_table if it grows large (#1156)
1 parent f1af429 commit 150402e

File tree

1 file changed

+20
-4
lines changed

1 file changed

+20
-4
lines changed

ocaml/runtime/minor_gc.c

+20-4
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,20 @@ static void reset_table (struct generic_table *tbl)
130130
tbl->base = tbl->ptr = tbl->threshold = tbl->limit = tbl->end = NULL;
131131
}
132132

133-
static void clear_table (struct generic_table *tbl)
133+
static void clear_table (struct generic_table *tbl,
134+
asize_t element_size,
135+
const char* name)
134136
{
137+
asize_t maxsz = Caml_state->minor_heap_wsz;
138+
if (tbl->size <= maxsz) {
135139
tbl->ptr = tbl->base;
136140
tbl->limit = tbl->threshold;
141+
} else {
142+
caml_gc_message (0x08, "Shrinking %s to %ldk bytes\n",
143+
name,
144+
(long)((maxsz * element_size) / 1024));
145+
alloc_generic_table(tbl, Caml_state->minor_heap_wsz, 256, element_size);
146+
}
137147
}
138148

139149
void caml_set_minor_heap_size (asize_t bsz)
@@ -466,9 +476,15 @@ void caml_empty_minor_heap (void)
466476
(double) (Caml_state->young_alloc_end - Caml_state->young_ptr)
467477
/ Caml_state->minor_heap_wsz;
468478
Caml_state->young_ptr = Caml_state->young_alloc_end;
469-
clear_table ((struct generic_table *) Caml_state->ref_table);
470-
clear_table ((struct generic_table *) Caml_state->ephe_ref_table);
471-
clear_table ((struct generic_table *) Caml_state->custom_table);
479+
clear_table ((struct generic_table *) Caml_state->ref_table,
480+
sizeof(value *),
481+
"ref_table");
482+
clear_table ((struct generic_table *) Caml_state->ephe_ref_table,
483+
sizeof(struct caml_ephe_ref_elt),
484+
"ephe_ref_table");
485+
clear_table ((struct generic_table *) Caml_state->custom_table,
486+
sizeof(struct caml_custom_elt),
487+
"custom_table");
472488
Caml_state->extra_heap_resources_minor = 0;
473489
caml_gc_message (0x02, ">");
474490
Caml_state->in_minor_collection = 0;

0 commit comments

Comments
 (0)