Re: better atomics - Mailing list pgsql-hackers

From Robert Haas
Subject Re: better atomics
Date
Msg-id CA+Tgmoa_bit25Kfyia1oHM8KKVbg91CXs7vPc7rLwXRFgSbH7w@mail.gmail.com
Whole thread Raw
In response to Re: better atomics  (Andres Freund <andres@2ndquadrant.com>)
Responses Re: better atomics  (Andres Freund <andres@2ndquadrant.com>)
List pgsql-hackers
On Tue, Nov 5, 2013 at 10:51 AM, Andres Freund <andres@2ndquadrant.com> wrote:
> 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?

Sadly, I don't have a clear feeling for how well or poorly that's
going to work out.

-- 
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company



pgsql-hackers by date:

Previous
From: Robert Haas
Date:
Subject: Re: [BUGS] BUG #8573: int4range memory consumption
Next
From: Peter Eisentraut
Date:
Subject: Re: git diff --check whitespace checks, gitattributes