|
56 | 56 | #include "utils/memdebug.h"
|
57 | 57 | #include "utils/memutils.h"
|
58 | 58 |
|
| 59 | +#define Slab_BLOCKHDRSZ MAXALIGN(sizeof(SlabBlock)) |
| 60 | + |
59 | 61 | /*
|
60 | 62 | * SlabContext is a specialized implementation of MemoryContext.
|
61 | 63 | */
|
@@ -116,10 +118,10 @@ typedef struct SlabChunk
|
116 | 118 | #define SlabChunkGetPointer(chk) \
|
117 | 119 | ((void *)(((char *)(chk)) + sizeof(SlabChunk)))
|
118 | 120 | #define SlabBlockGetChunk(slab, block, idx) \
|
119 |
| - ((SlabChunk *) ((char *) (block) + sizeof(SlabBlock) \ |
| 121 | + ((SlabChunk *) ((char *) (block) + Slab_BLOCKHDRSZ \ |
120 | 122 | + (idx * slab->fullChunkSize)))
|
121 | 123 | #define SlabBlockStart(block) \
|
122 |
| - ((char *) block + sizeof(SlabBlock)) |
| 124 | + ((char *) block + Slab_BLOCKHDRSZ) |
123 | 125 | #define SlabChunkIndex(slab, block, chunk) \
|
124 | 126 | (((char *) chunk - SlabBlockStart(block)) / slab->fullChunkSize)
|
125 | 127 |
|
@@ -168,7 +170,7 @@ static const MemoryContextMethods SlabMethods = {
|
168 | 170 | * chunkSize: allocation chunk size
|
169 | 171 | *
|
170 | 172 | * The chunkSize may not exceed:
|
171 |
| - * MAXALIGN_DOWN(SIZE_MAX) - MAXALIGN(sizeof(SlabBlock)) - sizeof(SlabChunk) |
| 173 | + * MAXALIGN_DOWN(SIZE_MAX) - MAXALIGN(Slab_BLOCKHDRSZ) - sizeof(SlabChunk) |
172 | 174 | */
|
173 | 175 | MemoryContext
|
174 | 176 | SlabContextCreate(MemoryContext parent,
|
@@ -198,12 +200,12 @@ SlabContextCreate(MemoryContext parent,
|
198 | 200 | fullChunkSize = sizeof(SlabChunk) + MAXALIGN(chunkSize);
|
199 | 201 |
|
200 | 202 | /* Make sure the block can store at least one chunk. */
|
201 |
| - if (blockSize < fullChunkSize + sizeof(SlabBlock)) |
| 203 | + if (blockSize < fullChunkSize + Slab_BLOCKHDRSZ) |
202 | 204 | elog(ERROR, "block size %zu for slab is too small for %zu chunks",
|
203 | 205 | blockSize, chunkSize);
|
204 | 206 |
|
205 | 207 | /* Compute maximum number of chunks per block */
|
206 |
| - chunksPerBlock = (blockSize - sizeof(SlabBlock)) / fullChunkSize; |
| 208 | + chunksPerBlock = (blockSize - Slab_BLOCKHDRSZ) / fullChunkSize; |
207 | 209 |
|
208 | 210 | /* The freelist starts with 0, ends with chunksPerBlock. */
|
209 | 211 | freelistSize = sizeof(dlist_head) * (chunksPerBlock + 1);
|
@@ -769,7 +771,7 @@ SlabCheck(MemoryContext context)
|
769 | 771 |
|
770 | 772 | /* there might be sentinel (thanks to alignment) */
|
771 | 773 | if (slab->chunkSize < (slab->fullChunkSize - sizeof(SlabChunk)))
|
772 |
| - if (!sentinel_ok(chunk, slab->chunkSize)) |
| 774 | + if (!sentinel_ok(chunk, sizeof(SlabChunk) + slab->chunkSize)) |
773 | 775 | elog(WARNING, "problem in slab %s: detected write past chunk end in block %p, chunk %p",
|
774 | 776 | name, block, chunk);
|
775 | 777 | }
|
|
0 commit comments