diff options
| author | Peter Eisentraut <peter@eisentraut.org> | 2025-11-24 07:36:49 +0100 |
|---|---|---|
| committer | Peter Eisentraut <peter@eisentraut.org> | 2025-11-24 07:39:37 +0100 |
| commit | d4c0f91f7d57066b9d62c0eccb2a913d40c14066 (patch) | |
| tree | c2be6f35339f3925f6d01a1f710b4e986f599c23 | |
| parent | 4b203d499c610160e9867e6add2366780429344c (diff) | |
C11 alignas instead of unions -- extended alignments
This replaces some uses of pg_attribute_aligned() with the standard
alignas() for cases where extended alignment (larger than max_align_t)
is required.
This patch stipulates that all supported compilers must support
alignments up to PG_IO_ALIGN_SIZE, but that seems pretty likely.
We can then also desupport the case where direct I/O is disabled
because pg_attribute_aligned is not supported.
Reviewed-by: Chao Li <li.evan.chao@gmail.com>
Discussion: https://www.postgresql.org/message-id/flat/46f05236-d4d4-4b4e-84d4-faa500f14691%40eisentraut.org
| -rw-r--r-- | src/include/c.h | 18 | ||||
| -rw-r--r-- | src/include/storage/fd.h | 5 |
2 files changed, 6 insertions, 17 deletions
diff --git a/src/include/c.h b/src/include/c.h index 729eb8a27de..a40f0cf4642 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -1132,25 +1132,15 @@ typedef struct PGAlignedBlock * for I/O in general, but may be strictly required on some platforms when * using direct I/O. */ -typedef union PGIOAlignedBlock +typedef struct PGIOAlignedBlock { -#ifdef pg_attribute_aligned - pg_attribute_aligned(PG_IO_ALIGN_SIZE) -#endif - char data[BLCKSZ]; - double force_align_d; - int64 force_align_i64; + alignas(PG_IO_ALIGN_SIZE) char data[BLCKSZ]; } PGIOAlignedBlock; /* Same, but for an XLOG_BLCKSZ-sized buffer */ -typedef union PGAlignedXLogBlock +typedef struct PGAlignedXLogBlock { -#ifdef pg_attribute_aligned - pg_attribute_aligned(PG_IO_ALIGN_SIZE) -#endif - char data[XLOG_BLCKSZ]; - double force_align_d; - int64 force_align_i64; + alignas(PG_IO_ALIGN_SIZE) char data[XLOG_BLCKSZ]; } PGAlignedXLogBlock; /* msb for char */ diff --git a/src/include/storage/fd.h b/src/include/storage/fd.h index 3e821ce8fb7..a1bdefec4a5 100644 --- a/src/include/storage/fd.h +++ b/src/include/storage/fd.h @@ -85,10 +85,9 @@ extern PGDLLIMPORT int max_safe_fds; * to the appropriate Windows flag in src/port/open.c. We simulate it with * fcntl(F_NOCACHE) on macOS inside fd.c's open() wrapper. We use the name * PG_O_DIRECT rather than defining O_DIRECT in that case (probably not a good - * idea on a Unix). We can only use it if the compiler will correctly align - * PGIOAlignedBlock for us, though. + * idea on a Unix). */ -#if defined(O_DIRECT) && defined(pg_attribute_aligned) +#if defined(O_DIRECT) #define PG_O_DIRECT O_DIRECT #elif defined(F_NOCACHE) #define PG_O_DIRECT 0x80000000 |
