gc: add a function to force the collector to run

This requires adding a "forced" stage for the collector,
which is the initial stage for a forced collection.
Thereafter, the collector continues to the usual stages
of collection.
This commit is contained in:
Yorick Hardy 2024-11-15 22:59:46 +02:00
parent 86cfbeb72b
commit d8aa289af4
3 changed files with 15 additions and 1 deletions

8
gc.c
View file

@ -2534,6 +2534,14 @@ void gc_collector()
ck_pr_cas_int(&gc_stage, STAGE_SWEEPING, STAGE_RESTING);
}
void gc_force(void)
{
/* try to force the collector to run */
ck_pr_cas_int(&gc_stage, STAGE_RESTING, STAGE_FORCING);
/* if the collector thread was idle, then begin collecting */
ck_pr_cas_int(&gc_stage, STAGE_FORCING, STAGE_CLEAR_OR_MARKING);
}
void *collector_main(void *arg)
{
int stage;

View file

@ -52,6 +52,11 @@ void GC(void *, closure, object *, int);
*/
void gc_init_heap(long heap_size);
/**
* \ingroup gc_force
*/
void gc_force(void);
/**
* \defgroup prim Primitives
* @brief Built-in Scheme functions provided by the runtime library

View file

@ -264,7 +264,7 @@ typedef enum { STATUS_ASYNC, STATUS_SYNC1, STATUS_SYNC2
/** Stages of the Major GC's collector thread */
typedef enum { STAGE_CLEAR_OR_MARKING, STAGE_TRACING
//, STAGE_REF_PROCESSING
, STAGE_SWEEPING, STAGE_RESTING
, STAGE_SWEEPING, STAGE_RESTING, STAGE_FORCING
} gc_stage_type;
// Constant colors are defined here.
@ -377,6 +377,7 @@ struct gc_thread_data_t {
/* GC prototypes */
void gc_initialize(void);
void gc_force(void);
void gc_add_new_unrunning_mutator(gc_thread_data * thd);
void gc_add_mutator(gc_thread_data * thd);
void gc_remove_mutator(gc_thread_data * thd);