void *GC_malloc_weak_box(void *p, void **secondary, int soffset, int is_late) { GCTYPE *gc = GC_get_GC(); GC_Weak_Box *w; /* Allcation might trigger GC, so we use park: */ CHECK_PARK_UNUSED(gc); gc->park[0] = p; gc->park[1] = secondary; w = (GC_Weak_Box *)GC_malloc_one_tagged(sizeof(GC_Weak_Box)); /* Future-local allocation may fail: */ if (!w) return NULL; p = gc->park[0]; secondary = (void **)gc->park[1]; gc->park[0] = NULL; gc->park[1] = NULL; w->type = gc->weak_box_tag; w->val = p; w->secondary_erase = secondary; w->is_late = is_late; w->soffset = soffset; return w; }
void *GC_malloc_weak_array(size_t size_in_bytes, void *replace_val) { GC_Weak_Array *w; /* Allcation might trigger GC, so we use park: */ park[0] = replace_val; w = (GC_Weak_Array *)GC_malloc_one_tagged(size_in_bytes + sizeof(GC_Weak_Array) - sizeof(void *)); replace_val = park[0]; park[0] = NULL; w->type = weak_array_tag; w->replace_val = replace_val; w->count = (size_in_bytes >> LOG_WORD_SIZE); return w; }
void *GC_malloc_ephemeron(void *k, void *v) { GC_Ephemeron *eph; /* Allcation might trigger GC, so we use park: */ park[0] = k; park[1] = v; eph = (GC_Ephemeron *)GC_malloc_one_tagged(sizeof(GC_Ephemeron)); k = park[0]; park[0] = NULL; v = park[1]; park[1] = NULL; eph->type = ephemeron_tag; eph->key = k; eph->val = v; return eph; }
void *GC_malloc_ephemeron(void *k, void *v) { GCTYPE *gc = GC_get_GC(); GC_Ephemeron *eph; /* Allcation might trigger GC, so we use park: */ gc->park[0] = k; gc->park[1] = v; eph = (GC_Ephemeron *)GC_malloc_one_tagged(sizeof(GC_Ephemeron)); k = gc->park[0]; v = gc->park[1]; gc->park[0] = NULL; gc->park[1] = NULL; eph->type = gc->ephemeron_tag; eph->key = k; eph->val = v; return eph; }
void *GC_malloc_weak_box(void *p, void **secondary, int soffset) { GC_Weak_Box *w; /* Allcation might trigger GC, so we use park: */ park[0] = p; park[1] = secondary; w = (GC_Weak_Box *)GC_malloc_one_tagged(sizeof(GC_Weak_Box)); p = park[0]; park[0] = NULL; secondary = (void **)park[1]; park[1] = NULL; w->type = weak_box_tag; w->val = p; w->secondary_erase = secondary; w->soffset = soffset; return w; }
void *GC_malloc_weak_array(size_t size_in_bytes, void *replace_val) { GCTYPE *gc = GC_get_GC(); GC_Weak_Array *w; /* Allcation might trigger GC, so we use park: */ CHECK_PARK_UNUSED(gc); gc->park[0] = replace_val; w = (GC_Weak_Array *)GC_malloc_one_tagged(size_in_bytes + sizeof(GC_Weak_Array) - sizeof(void *) + sizeof(GC_Weak_Array *)); replace_val = gc->park[0]; gc->park[0] = NULL; w->type = gc->weak_array_tag; w->replace_val = replace_val; w->count = (size_in_bytes >> LOG_WORD_SIZE); return w; }