mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-07 05:06:36 +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);
|
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)
|
void *collector_main(void *arg)
|
||||||
{
|
{
|
||||||
int stage;
|
int stage;
|
||||||
|
|
|
@ -52,6 +52,11 @@ void GC(void *, closure, object *, int);
|
||||||
*/
|
*/
|
||||||
void gc_init_heap(long heap_size);
|
void gc_init_heap(long heap_size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \ingroup gc_force
|
||||||
|
*/
|
||||||
|
void gc_force(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \defgroup prim Primitives
|
* \defgroup prim Primitives
|
||||||
* @brief Built-in Scheme functions provided by the runtime library
|
* @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 */
|
/** Stages of the Major GC's collector thread */
|
||||||
typedef enum { STAGE_CLEAR_OR_MARKING, STAGE_TRACING
|
typedef enum { STAGE_CLEAR_OR_MARKING, STAGE_TRACING
|
||||||
//, STAGE_REF_PROCESSING
|
//, STAGE_REF_PROCESSING
|
||||||
, STAGE_SWEEPING, STAGE_RESTING
|
, STAGE_SWEEPING, STAGE_RESTING, STAGE_FORCING
|
||||||
} gc_stage_type;
|
} gc_stage_type;
|
||||||
|
|
||||||
// Constant colors are defined here.
|
// Constant colors are defined here.
|
||||||
|
@ -377,6 +377,7 @@ struct gc_thread_data_t {
|
||||||
|
|
||||||
/* GC prototypes */
|
/* GC prototypes */
|
||||||
void gc_initialize(void);
|
void gc_initialize(void);
|
||||||
|
void gc_force(void);
|
||||||
void gc_add_new_unrunning_mutator(gc_thread_data * thd);
|
void gc_add_new_unrunning_mutator(gc_thread_data * thd);
|
||||||
void gc_add_mutator(gc_thread_data * thd);
|
void gc_add_mutator(gc_thread_data * thd);
|
||||||
void gc_remove_mutator(gc_thread_data * thd);
|
void gc_remove_mutator(gc_thread_data * thd);
|
||||||
|
|
Loading…
Add table
Reference in a new issue