summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/access/common/toast_internals.c4
-rw-r--r--src/backend/commands/async.c14
-rw-r--r--src/backend/storage/large_object/inv_api.c8
-rw-r--r--src/include/c.h10
4 files changed, 11 insertions, 25 deletions
diff --git a/src/backend/access/common/toast_internals.c b/src/backend/access/common/toast_internals.c
index 81dbd67c725..63b848473f8 100644
--- a/src/backend/access/common/toast_internals.c
+++ b/src/backend/access/common/toast_internals.c
@@ -287,11 +287,9 @@ toast_save_datum(Relation rel, Datum value,
bool t_isnull[3] = {0};
union
{
- struct varlena hdr;
+ alignas(int32) struct varlena hdr;
/* this is to make the union big enough for a chunk: */
char data[TOAST_MAX_CHUNK_SIZE + VARHDRSZ];
- /* ensure union is aligned well enough: */
- int32 align_it;
} chunk_data;
int32 chunk_size;
diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c
index e1cf659485a..eb86402cae4 100644
--- a/src/backend/commands/async.c
+++ b/src/backend/commands/async.c
@@ -1987,14 +1987,10 @@ asyncQueueProcessPageEntries(QueuePosition *current,
/*
* We copy the entries into a local buffer to avoid holding the SLRU lock
* while we transmit them to our frontend. The local buffer must be
- * adequately aligned, so use a union.
+ * adequately aligned.
*/
- union
- {
- char buf[QUEUE_PAGESIZE];
- AsyncQueueEntry align;
- } local_buf;
- char *local_buf_end = local_buf.buf;
+ alignas(AsyncQueueEntry) char local_buf[QUEUE_PAGESIZE];
+ char *local_buf_end = local_buf;
slotno = SimpleLruReadPage_ReadOnly(NotifyCtl, curpage,
InvalidTransactionId);
@@ -2082,8 +2078,8 @@ asyncQueueProcessPageEntries(QueuePosition *current,
* Now that we have let go of the SLRU bank lock, send the notifications
* to our backend
*/
- Assert(local_buf_end - local_buf.buf <= BLCKSZ);
- for (char *p = local_buf.buf; p < local_buf_end;)
+ Assert(local_buf_end - local_buf <= BLCKSZ);
+ for (char *p = local_buf; p < local_buf_end;)
{
AsyncQueueEntry *qe = (AsyncQueueEntry *) p;
diff --git a/src/backend/storage/large_object/inv_api.c b/src/backend/storage/large_object/inv_api.c
index f6d2f9dba13..2bd872d6581 100644
--- a/src/backend/storage/large_object/inv_api.c
+++ b/src/backend/storage/large_object/inv_api.c
@@ -556,11 +556,9 @@ inv_write(LargeObjectDesc *obj_desc, const char *buf, int nbytes)
bool pfreeit;
union
{
- bytea hdr;
+ alignas(int32) bytea hdr;
/* this is to make the union big enough for a LO data chunk: */
char data[LOBLKSIZE + VARHDRSZ];
- /* ensure union is aligned well enough: */
- int32 align_it;
} workbuf = {0};
char *workb = VARDATA(&workbuf.hdr);
HeapTuple newtup;
@@ -747,11 +745,9 @@ inv_truncate(LargeObjectDesc *obj_desc, int64 len)
Form_pg_largeobject olddata;
union
{
- bytea hdr;
+ alignas(int32) bytea hdr;
/* this is to make the union big enough for a LO data chunk: */
char data[LOBLKSIZE + VARHDRSZ];
- /* ensure union is aligned well enough: */
- int32 align_it;
} workbuf = {0};
char *workb = VARDATA(&workbuf.hdr);
HeapTuple newtup;
diff --git a/src/include/c.h b/src/include/c.h
index 8e887bec0b2..729eb8a27de 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -1117,15 +1117,11 @@ pg_noreturn extern void ExceptionalCondition(const char *conditionName,
* Use this, not "char buf[BLCKSZ]", to declare a field or local variable
* holding a page buffer, if that page might be accessed as a page. Otherwise
* the variable might be under-aligned, causing problems on alignment-picky
- * hardware. We include both "double" and "int64" in the union to ensure that
- * the compiler knows the value must be MAXALIGN'ed (cf. configure's
- * computation of MAXIMUM_ALIGNOF).
+ * hardware.
*/
-typedef union PGAlignedBlock
+typedef struct PGAlignedBlock
{
- char data[BLCKSZ];
- double force_align_d;
- int64 force_align_i64;
+ alignas(MAXIMUM_ALIGNOF) char data[BLCKSZ];
} PGAlignedBlock;
/*