示例#1
0
文件: boehm-gc.c 项目: Sciumo/mono
void
mono_gc_weak_link_add (void **link_addr, MonoObject *obj, gboolean track)
{
	/* libgc requires that we use HIDE_POINTER... */
	*link_addr = (void*)HIDE_POINTER (obj);
	GC_GENERAL_REGISTER_DISAPPEARING_LINK (link_addr, obj);
}
示例#2
0
void rvmRegisterDisappearingLink(Env* env, void** address, Object* obj) {
    GC_GENERAL_REGISTER_DISAPPEARING_LINK(address, obj);
}
示例#3
0
文件: test.c 项目: LordJagged/mosh
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);
}