diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index fc495d6a62..06f5eb003c 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -1482,7 +1482,7 @@ CopyXLogRecordToWAL(int write_len, bool isLogSwitch, XLogRecData *rdata, Assert(written == write_len); /* Align the end position, so that the next record starts aligned */ - CurrPos = MAXALIGN(CurrPos); + CurrPos = MAXALIGN64(CurrPos); /* * If this was an xlog-switch, it's not enough to write the switch record, diff --git a/src/include/c.h b/src/include/c.h index 14bfdcd4da..8916310b5b 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -551,6 +551,18 @@ typedef NameData *Name; #define DOUBLEALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_DOUBLE, (LEN)) #define MAXALIGN_DOWN(LEN) TYPEALIGN_DOWN(MAXIMUM_ALIGNOF, (LEN)) +/* + * The above macros will not work with types wider than intptr_t, like with + * uint64 on 32-bit platforms. That's not problem for the usual use where a + * pointer or a length is aligned, but for the odd case that you need to + * align something (potentially) wider, use TYPEALIGN64. + */ +#define TYPEALIGN64(ALIGNVAL,LEN) \ + (((uint64) (LEN) + ((ALIGNVAL) - 1)) & ~((uint64) ((ALIGNVAL) - 1))) + +/* we don't currently need wider versions of the other ALIGN macros */ +#define MAXALIGN64(LEN) TYPEALIGN64(MAXIMUM_ALIGNOF, (LEN)) + /* ---------------------------------------------------------------- * Section 6: assertions * ----------------------------------------------------------------