summaryrefslogtreecommitdiff
path: root/malloc.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2016-06-30 10:50:59 +0300
committerIvan Maidanski <ivmai@mail.ru>2016-06-30 10:59:22 +0300
commitfe6e67c9554c57457687b056ba0fac565b7ff68e (patch)
tree59370b5da4a0e0af13a34d4899358d088fd0197f /malloc.c
parentd32cb53bb0b32a44ae9c68cfe22876a9c069b957 (diff)
parent9cd4c2f2d3bf68a98210024dfd573c8b50ff41d6 (diff)
downloadbdwgc-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.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/malloc.c b/malloc.c
index 51acb2fb..d6cb7abc 100644
--- a/malloc.c
+++ b/malloc.c
@@ -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 */