|
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 |
|
@@ -169,7 +171,7 @@ static const MemoryContextMethods SlabMethods = {
|
169 | 171 | * chunkSize: allocation chunk size
|
170 | 172 | *
|
171 | 173 | * The chunkSize may not exceed:
|
172 |
| - * MAXALIGN_DOWN(SIZE_MAX) - MAXALIGN(sizeof(SlabBlock)) - sizeof(SlabChunk) |
| 174 | + * MAXALIGN_DOWN(SIZE_MAX) - MAXALIGN(Slab_BLOCKHDRSZ) - sizeof(SlabChunk) |
173 | 175 | */
|
174 | 176 | MemoryContext
|
175 | 177 | SlabContextCreate(MemoryContext parent,
|
@@ -199,12 +201,12 @@ SlabContextCreate(MemoryContext parent,
|
199 | 201 | fullChunkSize = sizeof(SlabChunk) + MAXALIGN(chunkSize);
|
200 | 202 |
|
201 | 203 | /* Make sure the block can store at least one chunk. */
|
202 |
| - if (blockSize < fullChunkSize + sizeof(SlabBlock)) |
| 204 | + if (blockSize < fullChunkSize + Slab_BLOCKHDRSZ) |
203 | 205 | elog(ERROR, "block size %zu for slab is too small for %zu chunks",
|
204 | 206 | blockSize, chunkSize);
|
205 | 207 |
|
206 | 208 | /* Compute maximum number of chunks per block */
|
207 |
| - chunksPerBlock = (blockSize - sizeof(SlabBlock)) / fullChunkSize; |
| 209 | + chunksPerBlock = (blockSize - Slab_BLOCKHDRSZ) / fullChunkSize; |
208 | 210 |
|
209 | 211 | /* The freelist starts with 0, ends with chunksPerBlock. */
|
210 | 212 | freelistSize = sizeof(dlist_head) * (chunksPerBlock + 1);
|
@@ -772,7 +774,7 @@ SlabCheck(MemoryContext context)
|
772 | 774 |
|
773 | 775 | /* there might be sentinel (thanks to alignment) */
|
774 | 776 | if (slab->chunkSize < (slab->fullChunkSize - sizeof(SlabChunk)))
|
775 |
| - if (!sentinel_ok(chunk, slab->chunkSize)) |
| 777 | + if (!sentinel_ok(chunk, sizeof(SlabChunk) + slab->chunkSize)) |
776 | 778 | elog(WARNING, "problem in slab %s: detected write past chunk end in block %p, chunk %p",
|
777 | 779 | name, block, chunk);
|
778 | 780 | }
|
|
0 commit comments