From 1f7a8a274aebf62e84cf7cbfdb95097ed55e7c14 Mon Sep 17 00:00:00 2001 From: Melanie Plageman Date: Mon, 11 Oct 2021 16:15:06 -0400 Subject: [PATCH 1/2] Read-only atomic's backend write function For counters in shared memory which can be read by any backend but only written to by one backend, an atomic is still needed to protect against torn values, however, pg_atomic_fetch_add_u64() is overkill for incrementing the counter. inc_counter() is a helper function which can be used to increment these values safely but without unnecessary overhead. Author: Thomas Munro --- src/include/utils/backend_status.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/include/utils/backend_status.h b/src/include/utils/backend_status.h index 419de72591..c0149ce0de 100644 --- a/src/include/utils/backend_status.h +++ b/src/include/utils/backend_status.h @@ -349,6 +349,16 @@ extern void pgstat_clear_backend_activity_snapshot(void); /* Activity reporting functions */ typedef struct PgStatIOPathOps PgStatIOPathOps; +/* + * On modern systems this is really just *counter++. On some older systems + * there might be more to it, due to inability to read and write 64 bit values + * atomically. + */ +static inline void inc_counter(pg_atomic_uint64 *counter) +{ + pg_atomic_write_u64(counter, pg_atomic_read_u64(counter) + 1); +} + static inline void pgstat_inc_ioop(IOOp io_op, IOPath io_path) { -- 2.27.0