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); } };