diff --git a/src/backend/utils/mmgr/slab.c b/src/backend/utils/mmgr/slab.c index 638af8b7aa9..f1a39600ebc 100644 --- a/src/backend/utils/mmgr/slab.c +++ b/src/backend/utils/mmgr/slab.c @@ -57,6 +57,8 @@ #include "lib/ilist.h" +#define Slab_BLOCKHDRSZ MAXALIGN(sizeof(SlabBlock)) + /* * SlabContext is a specialized implementation of MemoryContext. */ @@ -110,10 +112,10 @@ typedef struct SlabChunk #define SlabChunkGetPointer(chk) \ ((void *)(((char *)(chk)) + sizeof(SlabChunk))) #define SlabBlockGetChunk(slab, block, idx) \ - ((SlabChunk *) ((char *) (block) + sizeof(SlabBlock) \ + ((SlabChunk *) ((char *) (block) + Slab_BLOCKHDRSZ \ + (idx * slab->fullChunkSize))) #define SlabBlockStart(block) \ - ((char *) block + sizeof(SlabBlock)) + ((char *) block + Slab_BLOCKHDRSZ) #define SlabChunkIndex(slab, block, chunk) \ (((char *) chunk - SlabBlockStart(block)) / slab->fullChunkSize) @@ -179,7 +181,7 @@ static MemoryContextMethods SlabMethods = { * chunkSize: allocation chunk size * * The chunkSize may not exceed: - * MAXALIGN_DOWN(SIZE_MAX) - MAXALIGN(sizeof(SlabBlock)) - SLAB_CHUNKHDRSZ + * MAXALIGN_DOWN(SIZE_MAX) - MAXALIGN(Slab_BLOCKHDRSZ) - sizeof(SlabChunk) * */ MemoryContext @@ -206,12 +208,12 @@ SlabContextCreate(MemoryContext parent, fullChunkSize = MAXALIGN(sizeof(SlabChunk) + MAXALIGN(chunkSize)); /* Make sure the block can store at least one chunk. */ - if (blockSize - sizeof(SlabBlock) < fullChunkSize) + if (blockSize - Slab_BLOCKHDRSZ < fullChunkSize) elog(ERROR, "block size %zu for slab is too small for %zu chunks", blockSize, chunkSize); /* Compute maximum number of chunks per block */ - chunksPerBlock = (blockSize - sizeof(SlabBlock)) / fullChunkSize; + chunksPerBlock = (blockSize - Slab_BLOCKHDRSZ) / fullChunkSize; /* The freelist starts with 0, ends with chunksPerBlock. */ freelistSize = sizeof(dlist_head) * (chunksPerBlock + 1); @@ -220,7 +222,7 @@ SlabContextCreate(MemoryContext parent, Assert(chunksPerBlock > 0); /* make sure the chunks actually fit on the block */ - Assert((fullChunkSize * chunksPerBlock) + sizeof(SlabBlock) <= blockSize); + Assert((fullChunkSize * chunksPerBlock) + Slab_BLOCKHDRSZ <= blockSize); /* Size of the memory context header */ headerSize = offsetof(SlabContext, freelist) + freelistSize; @@ -765,7 +767,7 @@ SlabCheck(MemoryContext context) /* there might be sentinel (thanks to alignment) */ if (slab->chunkSize < (slab->fullChunkSize - sizeof(SlabChunk))) - if (!sentinel_ok(chunk, slab->chunkSize)) + if (!sentinel_ok(chunk, sizeof(SlabChunk) + slab->chunkSize)) elog(WARNING, "problem in slab %s: detected write past chunk end in block %p, chunk %p", name, block, chunk); }