slab-fix.patch
text/x-patch
Filename: slab-fix.patch
Type: text/x-patch
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/utils/mmgr/slab.c | 4 | 4 |
diff --git a/src/backend/utils/mmgr/slab.c b/src/backend/utils/mmgr/slab.c index ae1a735b8c..67fbede836 100644 --- a/src/backend/utils/mmgr/slab.c +++ b/src/backend/utils/mmgr/slab.c @@ -102,10 +102,10 @@ typedef struct SlabBlock #define SlabChunkGetPointer(chk) \ ((void *)(((char *)(chk)) + sizeof(MemoryChunk))) #define SlabBlockGetChunk(slab, block, idx) \ - ((MemoryChunk *) ((char *) (block) + sizeof(SlabBlock) \ + ((MemoryChunk *) ((char *) (block) + MAXALIGN(sizeof(SlabBlock)) \ + (idx * slab->fullChunkSize))) #define SlabBlockStart(block) \ - ((char *) block + sizeof(SlabBlock)) + ((char *) block + MAXALIGN(sizeof(SlabBlock))) #define SlabChunkIndex(slab, block, chunk) \ (((char *) chunk - SlabBlockStart(block)) / slab->fullChunkSize) @@ -146,12 +146,12 @@ SlabContextCreate(MemoryContext parent, fullChunkSize = Slab_CHUNKHDRSZ + MAXALIGN(chunkSize); /* Make sure the block can store at least one chunk. */ - if (blockSize < fullChunkSize + sizeof(SlabBlock)) + if (blockSize < fullChunkSize + MAXALIGN(sizeof(SlabBlock))) 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 - MAXALIGN(sizeof(SlabBlock))) / fullChunkSize; /* The freelist starts with 0, ends with chunksPerBlock. */ freelistSize = sizeof(dlist_head) * (chunksPerBlock + 1);