/* Record softrefs and weakrefs whose referents are dead * so that we can update their addr and put them to VM. * In fallback collection these refs will not be considered for enqueueing again, * since their referent fields have been cleared by identify_dead_refs(). */ static void dead_refs_fallback(GC *gc) { Finref_Metadata *metadata = gc->finref_metadata; if(!softref_pool_is_empty(gc) || !weakref_pool_is_empty(gc)) metadata->pending_weakrefs = TRUE; /* We only use fallback_ref_pool in resurrection fallback so it must be empty */ assert(pool_is_empty(metadata->fallback_ref_pool)); dead_weak_refs_fallback(gc, metadata->softref_pool); dead_weak_refs_fallback(gc, metadata->weakref_pool); gc_clear_weakref_pools(gc); }
void gc_reset_after_con_collection(GC* gc) { assert(gc_is_specify_con_gc()); int64 reset_start = time_now(); if(!IGNORE_FINREF ){ INFO2("gc.process", "GC: finref process after collection ...\n"); gc_put_finref_to_vm(gc); gc_reset_finref_metadata(gc); gc_activate_finref_threads((GC*)gc); #ifndef BUILD_IN_REFERENT } else { gc_clear_weakref_pools(gc); gc_clear_finref_repset_pool(gc); #endif } reset_start = time_now(); gc_reset_con_space_stat(gc); gc_clear_conclctor_role(gc); vm_reclaim_native_objs(); }
static void put_dead_refs_to_vm(GC *gc) { Finref_Metadata *metadata = gc->finref_metadata; if(softref_pool_is_empty(gc) && weakref_pool_is_empty(gc) && phanref_pool_is_empty(gc) && pool_is_empty(metadata->fallback_ref_pool)){ gc_clear_weakref_pools(gc); return; } put_dead_weak_refs_to_vm(gc, metadata->softref_pool); put_dead_weak_refs_to_vm(gc, metadata->weakref_pool); put_dead_weak_refs_to_vm(gc, metadata->phanref_pool); /* This is a major collection after resurrection fallback */ if(!pool_is_empty(metadata->fallback_ref_pool)){ put_dead_weak_refs_to_vm(gc, metadata->fallback_ref_pool); } metadata->pending_weakrefs = TRUE; }
void fallback_finref_cleanup(GC *gc) { gc_set_weakref_sets(gc); gc_clear_weakref_pools(gc); }