src/dod.c - Dead object destruction of the various headers


This file implements dead object destruction. This is documented in PDD 9 with supplementary notes in docs/dev/

It's possible to turn on/off the checking of the system stack and processor registers. The actual checking is implemented in src/cpu_dep.c.

There's also a verbose mode for garbage collection.

Functions ^

static void mark_special(Parrot_Interp interpreter, PMC *obj)

Mark a special PMC. If it has a PMC_EXT structure, append or prepend the next_for_GC pointer; otherwise, do the custom mark directly.

This should really be inline, so if inline isn't available, it would be better if it was a macro.

void pobject_lives(Interp *interpreter, PObj *obj)

Tag obj as alive.

Used by the GC system when tracing the root set, and used by the PMC GC handling routines to tag their individual pieces if they have private ones.

static int trace_active_PMCs(Interp *interpreter, int trace_stack)

Do a full trace run and mark all the PMCs as active if they are. Returns whether the run wasn't aborted; i.e. whether it's safe to proceed with GC.

int Parrot_dod_trace_root(Interp *interpreter, int trace_stack)

Trace the root set. Returns 0 if its a lazy DOD run and all objects that need timely destruction were found.

trace_stack can have these values:

 0 ... trace normal roots, no system areas
 1 ... trace whole root set
 2 ... trace system areas only
int Parrot_dod_trace_children(Interp *interpreter, size_t how_many)

Returns whether the tracing process wasn't aborted.

static void trace_active_buffers(Interp *interpreter)

Scan any buffers in string registers and other non-PMC places and mark them as active.

void clear_cow(Interp *interpreter, struct Small_Object_Pool *pool, int cleanup)

Clear the COW ref count.

void used_cow(Interp *interpreter, struct Small_Object_Pool *pool, int cleanup)

Find other users of COW's bufstart.

static void clear_live_counter(Interp *interpreter, struct Small_Object_Pool *pool)

Clear the live counter.

static void reduce_arenas(Interp *interpreter, struct Small_Object_Pool *pool, UINTVAL free_arenas)

Reduce the number of memory arenas by freeing any that have no live objects.

void Parrot_dod_sweep(Interp *interpreter, struct Small_Object_Pool *pool)

Put any buffers/PMCs that are now unused onto the pool's free list. If GC_IS_MALLOC, bufstart gets freed too, if possible. Avoid buffers that are immune from collection (i.e. constant).

static size_t find_common_mask(size_t val1, size_t val2)

Find a mask covering the longest common bit-prefix of val1 and val2.

void trace_mem_block(Interp *interpreter, size_t lo_var_ptr, size_t hi_var_ptr)

Traces the memory block between lo_var_ptr and hi_var_ptr.

static void Parrot_dod_clear_live_bits(Parrot_Interp interpreter)

Run through all PMC arenas and clear live bits.

void Parrot_dod_profile_start(Parrot_Interp interpreter)

Records the start time of a DOD run when profiling is enabled.

void Parrot_dod_profile_end(Parrot_Interp interpreter, int what)

Records the end time of the DOD part what run when profiling is enabled. Also record start time of next part.

void Parrot_do_dod_run(Interp *interpreter, UINTVAL flags)

Call the configured garbage collector to reclaim unused headers.

void parrot_dod_ms_run(Interp *interpreter, UINTVAL flags)

Run the stop-the-world mark & sweep collector.

void Parrot_dod_ms_run_init(Interp *interpreter, UINTVAL flags)

Prepare for a mark & sweep DOD run.


include/parrot/dod.h, src/cpu_dep.c, docs/dev/ and docs/pdds/pdd09_gc.pod.


Initial version by Mike Lambert on 2002.05.27.