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 interp, 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 were a macro.

static int trace_active_PMCs(Interp *interp, 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 *interp, int trace_stack)

Trace the root set. Returns 0 if it's 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 *interp, size_t how_many)

Returns whether the tracing process wasn't aborted.

void clear_cow(Interp *interp, Small_Object_Pool *pool, int cleanup)

Clear the COW ref count.

void used_cow(Interp *interp, Small_Object_Pool *pool, int cleanup)

Find other users of COW's bufstart.

void Parrot_dod_sweep(Interp *interp, 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 *interp, size_t lo_var_ptr, size_t hi_var_ptr)

Traces the memory block between lo_var_ptr and hi_var_ptr.

void Parrot_dod_profile_start(Parrot_Interp interp)

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

void Parrot_dod_profile_end(Parrot_Interp interp, 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 *interp, UINTVAL flags)

Call the configured garbage collector to reclaim unused headers.

void Parrot_dod_ms_run(Interp *interp, UINTVAL flags)

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

void Parrot_dod_ms_run_init(Interp *interp)

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.