static void gc_mark(void) { // mark all roots // active tasks gc_push_root(jl_root_task); gc_push_root(jl_current_task); // modules gc_push_root(jl_main_module); gc_push_root(jl_current_module); // invisible builtin values if (jl_an_empty_cell) gc_push_root(jl_an_empty_cell); gc_push_root(jl_exception_in_transit); gc_push_root(jl_task_arg_in_transit); gc_push_root(jl_unprotect_stack_func); gc_push_root(jl_bottom_func); gc_push_root(jl_typetype_type); gc_push_root(jl_tupletype_type); // constants gc_push_root(jl_null); gc_push_root(jl_true); gc_push_root(jl_false); // libuv loops gc_mark_uv_state(jl_global_event_loop()); jl_mark_box_caches(); size_t i; // stuff randomly preserved for(i=0; i < preserved_values.len; i++) { gc_push_root((jl_value_t*)preserved_values.items[i]); } // objects currently being finalized for(i=0; i < to_finalize.len; i++) { gc_push_root(to_finalize.items[i]); } gc_mark_all(); // find unmarked objects that need to be finalized. // this must happen last. for(i=0; i < finalizer_table.size; i+=2) { if (finalizer_table.table[i+1] != HT_NOTFOUND) { jl_value_t *v = finalizer_table.table[i]; if (!gc_marked(v)) { gc_push_root(v); schedule_finalization(v); } gc_push_root(finalizer_table.table[i+1]); } } gc_mark_all(); }
static void gc_mark(void) { // mark all roots // active tasks GC_Markval(jl_root_task); GC_Markval(jl_current_task); // modules GC_Markval(jl_core_module); GC_Markval(jl_current_module); // invisible builtin values if (jl_an_empty_cell) GC_Markval(jl_an_empty_cell); GC_Markval(jl_exception_in_transit); GC_Markval(jl_task_arg_in_transit); GC_Markval(jl_unprotect_stack_func); GC_Markval(jl_typetype_type); // constants GC_Markval(jl_null); GC_Markval(jl_true); GC_Markval(jl_false); jl_mark_box_caches(); size_t i; // stuff randomly preserved for(i=0; i < preserved_values.len; i++) { GC_Markval((jl_value_t*)preserved_values.items[i]); } // objects currently being finalized for(i=0; i < to_finalize.len; i++) { GC_Markval(to_finalize.items[i]); } // find unmarked objects that need to be finalized. // this must happen last. for(i=0; i < finalizer_table.size; i+=2) { if (finalizer_table.table[i+1] != HT_NOTFOUND) { jl_value_t *v = finalizer_table.table[i]; if (!gc_marked_obj(v)) { GC_Markval(v); schedule_finalization(v); } GC_Markval(finalizer_table.table[i+1]); } } }
static void gc_mark(void) { // mark all roots // active tasks gc_push_root(jl_root_task, 0); gc_push_root(jl_current_task, 0); // modules gc_push_root(jl_main_module, 0); gc_push_root(jl_internal_main_module, 0); gc_push_root(jl_current_module, 0); if (jl_old_base_module) gc_push_root(jl_old_base_module, 0); // invisible builtin values if (jl_an_empty_cell) gc_push_root(jl_an_empty_cell, 0); gc_push_root(jl_exception_in_transit, 0); gc_push_root(jl_task_arg_in_transit, 0); gc_push_root(jl_unprotect_stack_func, 0); gc_push_root(jl_bottom_func, 0); gc_push_root(jl_typetype_type, 0); gc_push_root(jl_tupletype_type, 0); gc_push_root(typeToTypeId, 0); if (jl_module_init_order != NULL) gc_push_root(jl_module_init_order, 0); // constants gc_push_root(jl_null, 0); gc_push_root(jl_true, 0); gc_push_root(jl_false, 0); jl_mark_box_caches(); size_t i; // stuff randomly preserved for(i=0; i < preserved_values.len; i++) { gc_push_root((jl_value_t*)preserved_values.items[i], 0); } // objects currently being finalized for(i=0; i < to_finalize.len; i++) { gc_push_root(to_finalize.items[i], 0); } visit_mark_stack(); // find unmarked objects that need to be finalized. // this must happen last. for(i=0; i < finalizer_table.size; i+=2) { if (finalizer_table.table[i+1] != HT_NOTFOUND) { jl_value_t *v = (jl_value_t*)finalizer_table.table[i]; if (!gc_marked(v)) { jl_value_t *fin = (jl_value_t*)finalizer_table.table[i+1]; if (gc_typeof(fin) == (jl_value_t*)jl_voidpointer_type) { void *p = ((void**)fin)[1]; if (p) ((void (*)(void*))p)(jl_data_ptr(v)); finalizer_table.table[i+1] = HT_NOTFOUND; continue; } gc_push_root(v, 0); schedule_finalization(v); } gc_push_root(finalizer_table.table[i+1], 0); } } visit_mark_stack(); }