mirror of
https://github.com/postgres/postgres.git
synced 2025-11-19 13:42:17 +03:00
Mostly-cosmetic improvements in memory chunk header alignment coding.
Add commentary about what we're doing and why. Apply the method used for
padding in GenerationChunk to AllocChunkData, replacing the rather ad-hoc
solution used in commit 7e3aa03b4. Reorder fields in GenerationChunk so
that the padding calculation will work even if sizeof(size_t) is different
from sizeof(void *) --- likely that will never happen, but we don't need
the assumption if we do it like this. Improve static assertions about
alignment.
In passing, fix a couple of oversights in the "large chunk" path in
GenerationAlloc().
Discussion: https://postgr.es/m/E1eHa4J-0006hI-Q8@gemulon.postgresql.org
This commit is contained in:
@@ -157,6 +157,14 @@ typedef struct AllocBlockData
|
||||
/*
|
||||
* AllocChunk
|
||||
* The prefix of each piece of memory in an AllocBlock
|
||||
*
|
||||
* Note: to meet the memory context APIs, the payload area of the chunk must
|
||||
* be maxaligned, and the "aset" link must be immediately adjacent to the
|
||||
* payload area (cf. GetMemoryChunkContext). We simplify matters for this
|
||||
* module by requiring sizeof(AllocChunkData) to be maxaligned, and then
|
||||
* we can ensure things work by adding any required alignment padding before
|
||||
* the "aset" field. There is a static assertion below that the alignment
|
||||
* is done correctly.
|
||||
*/
|
||||
typedef struct AllocChunkData
|
||||
{
|
||||
@@ -166,15 +174,19 @@ typedef struct AllocChunkData
|
||||
/* when debugging memory usage, also store actual requested size */
|
||||
/* this is zero in a free chunk */
|
||||
Size requested_size;
|
||||
#if MAXIMUM_ALIGNOF > 4 && SIZEOF_VOID_P == 4
|
||||
Size padding;
|
||||
#endif
|
||||
|
||||
#define ALLOCCHUNK_RAWSIZE (SIZEOF_SIZE_T * 2 + SIZEOF_VOID_P)
|
||||
#else
|
||||
#define ALLOCCHUNK_RAWSIZE (SIZEOF_SIZE_T + SIZEOF_VOID_P)
|
||||
#endif /* MEMORY_CONTEXT_CHECKING */
|
||||
|
||||
/* ensure proper alignment by adding padding if needed */
|
||||
#if (ALLOCCHUNK_RAWSIZE % MAXIMUM_ALIGNOF) != 0
|
||||
char padding[MAXIMUM_ALIGNOF - ALLOCCHUNK_RAWSIZE % MAXIMUM_ALIGNOF];
|
||||
#endif
|
||||
|
||||
/* aset is the owning aset if allocated, or the freelist link if free */
|
||||
void *aset;
|
||||
|
||||
/* there must not be any padding to reach a MAXALIGN boundary here! */
|
||||
} AllocChunkData;
|
||||
|
||||
@@ -327,8 +339,11 @@ AllocSetContextCreate(MemoryContext parent,
|
||||
{
|
||||
AllocSet set;
|
||||
|
||||
/* Assert we padded AllocChunkData properly */
|
||||
StaticAssertStmt(ALLOC_CHUNKHDRSZ == MAXALIGN(ALLOC_CHUNKHDRSZ),
|
||||
"sizeof(AllocChunkData) is not maxaligned");
|
||||
StaticAssertStmt(offsetof(AllocChunkData, aset) + sizeof(MemoryContext) ==
|
||||
MAXALIGN(sizeof(AllocChunkData)),
|
||||
ALLOC_CHUNKHDRSZ,
|
||||
"padding calculation in AllocChunkData is wrong");
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user