@@ -130,10 +130,20 @@ static void reset_table (struct generic_table *tbl)
130
130
tbl -> base = tbl -> ptr = tbl -> threshold = tbl -> limit = tbl -> end = NULL ;
131
131
}
132
132
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 )
134
136
{
137
+ asize_t maxsz = Caml_state -> minor_heap_wsz ;
138
+ if (tbl -> size <= maxsz ) {
135
139
tbl -> ptr = tbl -> base ;
136
140
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
+ }
137
147
}
138
148
139
149
void caml_set_minor_heap_size (asize_t bsz )
@@ -466,9 +476,15 @@ void caml_empty_minor_heap (void)
466
476
(double ) (Caml_state -> young_alloc_end - Caml_state -> young_ptr )
467
477
/ Caml_state -> minor_heap_wsz ;
468
478
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" );
472
488
Caml_state -> extra_heap_resources_minor = 0 ;
473
489
caml_gc_message (0x02 , ">" );
474
490
Caml_state -> in_minor_collection = 0 ;
0 commit comments