From d8f2073cfd5be6b70d38dc4f333ce72d405177b5 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Wed, 7 Oct 2026 08:21:37 +0200 Subject: [PATCH v3 2/2] Fix casting away of volatile qualifier Fix some issues involving volatile that would be triggered by -Wcast-qual. For PMSignalState, move the volatile qualifiers to the PMSignalData fields that need it rather than making the whole structure have it. For the MemSet() calls, do the initialization honestly with a loop instead. Note that the MemSet() calls would be normal "discards qualifier" warnings if memset() (or another function with a prototype, not a macro) were used. Discussion: https://www.postgresql.org/message-id/c76b72dd-5736-453a-b698-6968d42e4768%40eisentraut.org --- src/backend/postmaster/launch_backend.c | 2 +- src/backend/storage/ipc/pmsignal.c | 8 ++++---- src/backend/storage/ipc/procsignal.c | 6 ++++-- src/backend/utils/activity/backend_progress.c | 3 ++- src/include/storage/pmsignal.h | 2 +- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/backend/postmaster/launch_backend.c b/src/backend/postmaster/launch_backend.c index 8f3cfea880c..093ef879120 100644 --- a/src/backend/postmaster/launch_backend.c +++ b/src/backend/postmaster/launch_backend.c @@ -105,7 +105,7 @@ typedef struct PROC_HDR *ProcGlobal; PGPROC *AuxiliaryProcs; PGPROC *PreparedXactProcs; - volatile PMSignalData *PMSignalState; + PMSignalData *PMSignalState; ProcSignalHeader *ProcSignal; pid_t PostmasterPid; TimestampTz PgStartTime; diff --git a/src/backend/storage/ipc/pmsignal.c b/src/backend/storage/ipc/pmsignal.c index bdad5fdd043..08d382d73ab 100644 --- a/src/backend/storage/ipc/pmsignal.c +++ b/src/backend/storage/ipc/pmsignal.c @@ -73,16 +73,16 @@ struct PMSignalData { /* per-reason flags for signaling the postmaster */ - sig_atomic_t PMSignalFlags[NUM_PMSIGNALS]; + volatile sig_atomic_t PMSignalFlags[NUM_PMSIGNALS]; /* global flags for signals from postmaster to children */ - QuitSignalReason sigquit_reason; /* why SIGQUIT was sent */ + volatile QuitSignalReason sigquit_reason; /* why SIGQUIT was sent */ /* per-child-process flags */ int num_child_flags; /* # of entries in PMChildFlags[] */ - sig_atomic_t PMChildFlags[FLEXIBLE_ARRAY_MEMBER]; + volatile sig_atomic_t PMChildFlags[FLEXIBLE_ARRAY_MEMBER]; }; /* PMSignalState pointer is valid in both postmaster and child processes */ -NON_EXEC_STATIC volatile PMSignalData *PMSignalState = NULL; +NON_EXEC_STATIC PMSignalData *PMSignalState = NULL; static void PMSignalShmemRequest(void *); static void PMSignalShmemInit(void *); diff --git a/src/backend/storage/ipc/procsignal.c b/src/backend/storage/ipc/procsignal.c index 21a77f98c1d..4dc9d96cd21 100644 --- a/src/backend/storage/ipc/procsignal.c +++ b/src/backend/storage/ipc/procsignal.c @@ -155,7 +155,8 @@ ProcSignalShmemInit(void *arg) SpinLockInit(&slot->pss_mutex); pg_atomic_init_u32(&slot->pss_pid, 0); slot->pss_cancel_key_len = 0; - MemSet(slot->pss_signalFlags, 0, sizeof(slot->pss_signalFlags)); + for (int i = 0; i < NUM_PROCSIGNALS; i++) + slot->pss_signalFlags[i] = false; pg_atomic_init_u64(&slot->pss_barrierGeneration, PG_UINT64_MAX); pg_atomic_init_u32(&slot->pss_barrierCheckMask, 0); ConditionVariableInit(&slot->pss_barrierCV); @@ -186,7 +187,8 @@ ProcSignalInit(const uint8 *cancel_key, int cancel_key_len) old_pss_pid = pg_atomic_read_u32(&slot->pss_pid); /* Clear out any leftover signal reasons */ - MemSet(slot->pss_signalFlags, 0, NUM_PROCSIGNALS * sizeof(sig_atomic_t)); + for (int i = 0; i < NUM_PROCSIGNALS; i++) + slot->pss_signalFlags[i] = false; /* * Publish the PID before reading the global barrier generation to ensure diff --git a/src/backend/utils/activity/backend_progress.c b/src/backend/utils/activity/backend_progress.c index dee05b1abb1..32b2cdd81cd 100644 --- a/src/backend/utils/activity/backend_progress.c +++ b/src/backend/utils/activity/backend_progress.c @@ -35,7 +35,8 @@ pgstat_progress_start_command(ProgressCommandType cmdtype, Oid relid) PGSTAT_BEGIN_WRITE_ACTIVITY(beentry); beentry->st_progress_command = cmdtype; beentry->st_progress_command_target = relid; - MemSet(&beentry->st_progress_param, 0, sizeof(beentry->st_progress_param)); + for (int i = 0; i < PGSTAT_NUM_PROGRESS_PARAM; i++) + beentry->st_progress_param[i] = 0; PGSTAT_END_WRITE_ACTIVITY(beentry); } diff --git a/src/include/storage/pmsignal.h b/src/include/storage/pmsignal.h index bcce4011790..1b1f7ddc480 100644 --- a/src/include/storage/pmsignal.h +++ b/src/include/storage/pmsignal.h @@ -61,7 +61,7 @@ typedef enum typedef struct PMSignalData PMSignalData; #ifdef EXEC_BACKEND -extern PGDLLIMPORT volatile PMSignalData *PMSignalState; +extern PGDLLIMPORT PMSignalData *PMSignalState; #endif /* -- 2.56.0