Пример #1
0
/* 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);
}
Пример #2
0
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();
}
Пример #3
0
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;
}
Пример #4
0
void fallback_finref_cleanup(GC *gc)
{
  gc_set_weakref_sets(gc);
  gc_clear_weakref_pools(gc);
}