mirror of
https://github.com/justinethier/cyclone.git
synced 2025-05-19 05:39:17 +02:00
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:
parent
86cfbeb72b
commit
d8aa289af4
3 changed files with 15 additions and 1 deletions
8
gc.c
8
gc.c
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue