diff options
author | Ivan Maidanski <ivmai@mail.ru> | 2016-06-30 10:50:59 +0300 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2016-06-30 10:59:22 +0300 |
commit | fe6e67c9554c57457687b056ba0fac565b7ff68e (patch) | |
tree | 59370b5da4a0e0af13a34d4899358d088fd0197f /malloc.c | |
parent | d32cb53bb0b32a44ae9c68cfe22876a9c069b957 (diff) | |
parent | 9cd4c2f2d3bf68a98210024dfd573c8b50ff41d6 (diff) | |
download | bdwgc-fe6e67c9554c57457687b056ba0fac565b7ff68e.tar.gz |
Merge branch 'generalize-alloc-via-ok_freelist'
* mark.c (GC_n_kinds): Resolve merge conflict.
Diffstat (limited to 'malloc.c')
-rw-r--r-- | malloc.c | 19 |
1 files changed, 11 insertions, 8 deletions
@@ -239,26 +239,27 @@ GC_API GC_ATTR_MALLOC void * GC_CALL GC_generic_malloc(size_t lb, int k) GC_API GC_ATTR_MALLOC void * GC_CALL GC_malloc_kind_global(size_t lb, int k) { void *op; + void **opp; size_t lg; DCL_LOCK_STATE; - GC_STATIC_ASSERT(MAXOBJKINDS >= PREDEFINED_KINDS); - GC_ASSERT(k < PREDEFINED_KINDS); + GC_ASSERT(k < MAXOBJKINDS); if (SMALL_OBJ(lb)) { GC_DBG_COLLECT_AT_MALLOC(lb); lg = GC_size_map[lb]; LOCK(); - op = GC_freelists[k][lg]; + opp = &GC_obj_kinds[k].ok_freelist[lg]; + op = *opp; if (EXPECT(op != NULL, TRUE)) { if (k == PTRFREE) { - GC_freelists[k][lg] = obj_link(op); + *opp = obj_link(op); } else { GC_ASSERT(0 == obj_link(op) || ((word)obj_link(op) <= (word)GC_greatest_plausible_heap_addr && (word)obj_link(op) >= (word)GC_least_plausible_heap_addr)); - GC_freelists[k][lg] = obj_link(op); + *opp = obj_link(op); obj_link(op) = 0; } GC_bytes_allocd += GRANULES_TO_BYTES(lg); @@ -293,10 +294,11 @@ GC_API GC_ATTR_MALLOC void * GC_CALL GC_generic_malloc_uncollectable( size_t lb, int k) { void *op; + void **opp; size_t lg; DCL_LOCK_STATE; - GC_ASSERT(k < PREDEFINED_KINDS); + GC_ASSERT(k < MAXOBJKINDS); if (SMALL_OBJ(lb)) { GC_DBG_COLLECT_AT_MALLOC(lb); if (EXTRA_BYTES != 0 && lb != 0) lb--; @@ -304,9 +306,10 @@ GC_API GC_ATTR_MALLOC void * GC_CALL GC_generic_malloc_uncollectable( /* collected anyway. */ lg = GC_size_map[lb]; LOCK(); - op = GC_freelists[k][lg]; + opp = &GC_obj_kinds[k].ok_freelist[lg]; + op = *opp; if (EXPECT(op != NULL, TRUE)) { - GC_freelists[k][lg] = obj_link(op); + *opp = obj_link(op); obj_link(op) = 0; GC_bytes_allocd += GRANULES_TO_BYTES(lg); /* Mark bit was already set on free list. It will be */ |