static void move_disappearing_links (scm_t_weak_entry *from, scm_t_weak_entry *to, SCM key, SCM value, scm_t_weak_table_kind kind) { if ((kind == SCM_WEAK_TABLE_KIND_KEY || kind == SCM_WEAK_TABLE_KIND_BOTH) && SCM_HEAP_OBJECT_P (key)) { #ifdef HAVE_GC_MOVE_DISAPPEARING_LINK GC_move_disappearing_link ((GC_PTR) &from->key, (GC_PTR) &to->key); #else GC_unregister_disappearing_link (&from->key); SCM_I_REGISTER_DISAPPEARING_LINK (&to->key, SCM2PTR (key)); #endif } if ((kind == SCM_WEAK_TABLE_KIND_VALUE || kind == SCM_WEAK_TABLE_KIND_BOTH) && SCM_HEAP_OBJECT_P (value)) { #ifdef HAVE_GC_MOVE_DISAPPEARING_LINK GC_move_disappearing_link ((GC_PTR) &from->value, (GC_PTR) &to->value); #else GC_unregister_disappearing_link (&from->value); SCM_I_REGISTER_DISAPPEARING_LINK (&to->value, SCM2PTR (value)); #endif } }
static void unregister_disappearing_links (scm_t_weak_entry *entry, scm_t_weak_table_kind kind) { if (kind == SCM_WEAK_TABLE_KIND_KEY || kind == SCM_WEAK_TABLE_KIND_BOTH) GC_unregister_disappearing_link ((GC_PTR) &entry->key); if (kind == SCM_WEAK_TABLE_KIND_VALUE || kind == SCM_WEAK_TABLE_KIND_BOTH) GC_unregister_disappearing_link ((GC_PTR) &entry->value); }
static void move_weak_entry (scm_t_weak_entry *from, scm_t_weak_entry *to) { if (from->hash) { scm_t_weak_entry copy; copy_weak_entry (from, ©); to->hash = copy.hash; to->key = copy.key; if (copy.key && SCM_HEAP_OBJECT_P (SCM_PACK (copy.key))) { #ifdef HAVE_GC_MOVE_DISAPPEARING_LINK GC_move_disappearing_link ((GC_PTR) &from->key, (GC_PTR) &to->key); #else GC_unregister_disappearing_link ((GC_PTR) &from->key); SCM_I_REGISTER_DISAPPEARING_LINK ((GC_PTR) &to->key, (GC_PTR) to->key); #endif } } else { to->hash = 0; to->key = 0; } }
void mono_gc_weak_link_remove (void **link_addr, gboolean track) { if (track) GC_unregister_long_link (link_addr); else GC_unregister_disappearing_link (link_addr); *link_addr = NULL; }
void rvmUnregisterDisappearingLink(Env* env, void** address) { GC_unregister_disappearing_link(address); }
static void GC_move_disappearing_link (void **from, void **to) { GC_unregister_disappearing_link (from); SCM_I_REGISTER_DISAPPEARING_LINK (to, *to); }
void mono_gc_weak_link_remove (void **link_addr) { GC_unregister_disappearing_link (link_addr); *link_addr = NULL; }
tn * mktree(int n) { tn * result = (tn *)GC_MALLOC(sizeof(tn)); collectable_count++; # if defined(MACOS) /* get around static data limitations. */ if (!live_indicators) live_indicators = (GC_word*)NewPtrClear(MAX_FINALIZED * sizeof(GC_word)); if (!live_indicators) { GC_printf("Out of memory\n"); exit(1); } # endif if (n == 0) return(0); if (result == 0) { GC_printf("Out of memory\n"); exit(1); } result -> level = n; result -> lchild = mktree(n-1); result -> rchild = mktree(n-1); if (counter++ % 17 == 0 && n >= 2) { tn * tmp = result -> lchild -> rchild; result -> lchild -> rchild = result -> rchild -> lchild; result -> rchild -> lchild = tmp; } if (counter++ % 119 == 0) { int my_index; { # ifdef PCR PCR_ThCrSec_EnterSys(); # endif # if defined(GC_PTHREADS) static pthread_mutex_t incr_lock = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&incr_lock); # elif defined(GC_WIN32_THREADS) EnterCriticalSection(&incr_cs); # endif /* Losing a count here causes erroneous report of failure. */ finalizable_count++; my_index = live_indicators_count++; # ifdef PCR PCR_ThCrSec_ExitSys(); # endif # if defined(GC_PTHREADS) pthread_mutex_unlock(&incr_lock); # elif defined(GC_WIN32_THREADS) LeaveCriticalSection(&incr_cs); # endif } GC_REGISTER_FINALIZER((void *)result, finalizer, (void *)(GC_word)n, (GC_finalization_proc *)0, (void * *)0); if (my_index >= MAX_FINALIZED) { GC_printf("live_indicators overflowed\n"); FAIL; } live_indicators[my_index] = 13; if (GC_GENERAL_REGISTER_DISAPPEARING_LINK( (void * *)(&(live_indicators[my_index])), (void *)result) != 0) { GC_printf("GC_general_register_disappearing_link failed\n"); FAIL; } if (GC_unregister_disappearing_link( (void * *) (&(live_indicators[my_index]))) == 0) { GC_printf("GC_unregister_disappearing_link failed\n"); FAIL; } if (GC_GENERAL_REGISTER_DISAPPEARING_LINK( (void * *)(&(live_indicators[my_index])), (void *)result) != 0) { GC_printf("GC_general_register_disappearing_link failed 2\n"); FAIL; } GC_reachable_here(result); } return(result); }
void ILGCUnregisterWeak(void *ptr) { GC_unregister_disappearing_link(ptr); }
void scheme_unweak_reference(void **p) { GC_unregister_disappearing_link(p); }
void RT0__UnregisterDisappearingLink(OOC_PTR * ptr) { #ifdef USE_BOEHM_GC /* CHECKME: What if ptr is not in a heap object? */ GC_unregister_disappearing_link(ptr); #endif }