Hi, (Coming back to this now)
On 2013-10-28 21:55:22 +0100, Andres Freund wrote: > The list I have previously suggested was: > > * pg_atomic_load_u32(uint32 *) > * uint32 pg_atomic_store_u32(uint32 *) > > To be able to write code without spreading volatiles all over while > making it very clear that that part of the code is worthy of attention. > > * uint32 pg_atomic_exchange_u32(uint32 *ptr, uint32 val) > * bool pg_atomic_compare_exchange_u32(uint32 *ptr, uint32 *expected, uint32 > newval) So what I've previously proposed did use plain types for the to-be-manipulated atomic integers. I am not sure about that anymore though, C11 includes support for atomic operations, but it assumes that the to-be-manipulated variable is of a special "atomic" type. While I am not propose that we try to emulate C11's API completely (basically impossible as it uses type agnostic functions, it also exposes too much), it seems to make sense to allow PG's atomics to be implemented by C11's. The API is described at: http://en.cppreference.com/w/c/atomic The fundamental difference to what I've suggested so far is that the atomic variable isn't a plain integer/type but a distinct datatype that can *only* be manipulated via the atomic operators. That has the nice property that it cannot be accidentally manipulated via plain operators. E.g. it wouldn't be uint32 pg_atomic_fetch_add_u32(uint32 *ptr, uint32 add_); but uint32 pg_atomic_fetch_add_u32(pg_atomic_uint32 *ptr, uint32 add_); where, for now, atomic_uint32 is something like: typedef struct pg_atomic_uint32 { volatile uint32 value; } pg_atomic_uint32; a future C11 implementation would just typedef C11's respective atomic type to pg_atomic_uint32. Comments? Greetings, Andres Freund -- Andres Freund http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers