diff --git a/src/runtime/c/pgf/db.cxx b/src/runtime/c/pgf/db.cxx
index 01a283631..deba74767 100644
--- a/src/runtime/c/pgf/db.cxx
+++ b/src/runtime/c/pgf/db.cxx
@@ -153,8 +153,6 @@ typedef struct mchunk mbin;
#define MIN_CHUNK_SIZE (offsetof(mchunk, fd_nextsize))
-#define MALLOC_ALIGN_MASK (2*sizeof(size_t) - 1)
-
/* The smallest size we can malloc is an aligned minimal chunk */
#define MINSIZE \
(unsigned long)(((MIN_CHUNK_SIZE+MALLOC_ALIGN_MASK) & ~MALLOC_ALIGN_MASK))
@@ -356,10 +354,12 @@ DB::init_state(size_t size)
ms->fastbins[i] = 0;
}
- mchunk* top_chunk =
- mem2chunk(((char*) ms) + sizeof(*ms) + sizeof(size_t));
+ size_t sz = (sizeof(*ms) + sizeof(size_t));
+ sz = (sz & ~MALLOC_ALIGN_MASK) + MALLOC_ALIGN_MASK + 1;
+
+ mchunk* top_chunk = mem2chunk(((char*) ms) + sz);
ms->top = ofs(ms,top_chunk);
- set_head(top_chunk, (size - sizeof(*ms)) | PREV_INUSE);
+ set_head(top_chunk, (size - (sz - sizeof(size_t))) | PREV_INUSE);
ms->last_remainder = 0;
diff --git a/src/runtime/c/pgf/db.h b/src/runtime/c/pgf/db.h
index a334bcf4d..c43f64077 100644
--- a/src/runtime/c/pgf/db.h
+++ b/src/runtime/c/pgf/db.h
@@ -1,6 +1,8 @@
#ifndef DB_H
#define DB_H
+#define MALLOC_ALIGN_MASK (2*sizeof(size_t) - 1)
+
class DB;
extern PGF_INTERNAL_DECL __thread unsigned char* current_base __attribute__((tls_model("initial-exec")));
@@ -39,18 +41,18 @@ public:
static
variant tagged(ref ref) {
- assert(A::tag < 2*sizeof(size_t));
+ assert(A::tag < MALLOC_ALIGN_MASK + 1);
return (ref.offset | A::tag);
}
static
ref untagged(variant v) {
- return (v & ~(2*sizeof(size_t) - 1));
+ return (v & ~MALLOC_ALIGN_MASK);
}
static
uint8_t get_tag(variant v) {
- return (v & (2*sizeof(size_t) - 1));
+ return (v & MALLOC_ALIGN_MASK);
}
};