From b6ada2c3033b03dac6cbdddf0e29454f9d26d986 Mon Sep 17 00:00:00 2001 From: Melanie Plageman Date: Mon, 11 Oct 2021 16:15:06 -0400 Subject: [PATCH v20 1/8] Read-only atomic 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 such counters. pg_atomic_unlocked_inc_counter() is a helper function which can be used to increment these values safely without unnecessary overhead. Author: Thomas Munro Reviewed-by: Melanie Plageman Discussion: https://www.postgresql.org/message-id/CA%2BhUKGJ06d3h5JeOtAv4h52n0vG1jOPZxqMCn5FySJQUVZA32w%40mail.gmail.com Discussion: https://www.postgresql.org/message-id/flat/20200124195226.lth52iydq2n2uilq%40alap3.anarazel.de --- src/include/port/atomics.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/include/port/atomics.h b/src/include/port/atomics.h index 856338f161..af30da32e5 100644 --- a/src/include/port/atomics.h +++ b/src/include/port/atomics.h @@ -519,6 +519,17 @@ pg_atomic_sub_fetch_u64(volatile pg_atomic_uint64 *ptr, int64 sub_) return pg_atomic_sub_fetch_u64_impl(ptr, sub_); } +/* + * On modern systems this is really just *counter++. On some older systems + * there might be more to it (due to an inability to read and write 64-bit + * values atomically). + */ +static inline void +pg_atomic_unlocked_inc_counter(pg_atomic_uint64 *counter) +{ + pg_atomic_write_u64(counter, pg_atomic_read_u64(counter) + 1); +} + #undef INSIDE_ATOMICS_H #endif /* ATOMICS_H */ -- 2.30.2