static void *gc_thread(void *arg) { struct PupHeap *heap = (struct PupHeap *)arg; struct timespec req = { .tv_sec = 0, .tv_nsec = 500000000 }; ANNOTATE_THREAD_NAME("garbage-collector"); while (1) { int res = nanosleep(&req, NULL); ABORTF_ON(res==EINVAL, "nanosleep() reports invalid timespec"); ABORTF_ON(res==EFAULT, "nanosleep() reports EFAULT"); perform_gc(heap); } return NULL; } static int heap_thread_stop(struct PupHeap *heap) { int res = pthread_cancel(heap->gc_thread); if (res) { return res; } res = pthread_join(heap->gc_thread, NULL); return res; }
obj gc_malloc (size_t size){ int i = 0; obj res; if (freel.nbfree == 0) perform_gc(); i = freel.free[--freel.nbfree]; if (freel.mark[i] != FREE) printf ("%d\n", freel.mark[i]); res = (obj) malloc(size); freel.heap[i] = res; freel.mark[i] = UNMARKED; return res; }