int ggc_thread_create(ggc_thread_t *thread, void (*func)(ThreadArg), ThreadArg arg) { ThreadInfo ti = NULL; GGC_PUSH_2(arg, ti); /* set up its thread info */ ti = GGC_NEW(ThreadInfo); GGC_WD(ti, func, func); GGC_WP(ti, arg, arg); /* update our thread barrier */ while (ggc_mutex_trylock(&ggggc_worldBarrierLock) != 0) GGC_YIELD(); if (ggggc_threadCount == 0) ggggc_threadCount++; else ggc_barrier_destroy(&ggggc_worldBarrier); ggc_barrier_init(&ggggc_worldBarrier, ++ggggc_threadCount); ggc_mutex_unlock(&ggggc_worldBarrierLock); /* spawn the pthread */ if ((errno = pthread_create(thread, NULL, ggggcThreadWrapper, ti))) return -1; return 0; }
/* allocate a data array */ void *ggggc_mallocDataArray(ggc_size_t nmemb, ggc_size_t size) { struct GGGGC_Descriptor *descriptor = NULL; struct GGGGC_Array *ret = NULL; ggc_size_t sz = ((nmemb*size)+sizeof(ggc_size_t)-1)/sizeof(ggc_size_t); GGC_PUSH_2(descriptor, ret); descriptor = ggggc_allocateDescriptorDA(sz + 1 + sizeof(struct GGGGC_Header)/sizeof(ggc_size_t)); ret = (struct GGGGC_Array *) ggggc_malloc(descriptor); ret->length = nmemb; return ret; }