Hi,

On 2017-04-03 11:56:13 -0700, Andres Freund wrote:
> 
> > +/*
> > + * Generic implementation of pg_atomic_fetch_mask_add_u32() via loop
> > + * of compare & exchange.
> > + */
> > +static inline uint32
> > +pg_atomic_fetch_mask_add_u32_impl(volatile pg_atomic_uint32 *ptr,
> > +                                                             uint32 mask_, 
> > uint32 add_)
> > +{
> > +   uint32          old_value;
> > +
> > +   /*
> > +    * Read once outside the loop, later iterations will get the newer value
> > +    * via compare & exchange.
> > +    */
> > +   old_value = pg_atomic_read_u32_impl(ptr);
> > +
> > +   /* loop until we've determined whether we could make an increment or 
> > not */
> > +   while (true)
> > +   {
> > +           uint32          desired_value;
> > +           bool            free;
> > +
> > +           desired_value = old_value;
> > +           free = (old_value & mask_) == 0;
> > +           if (free)
> > +                   desired_value += add_;
> > +
> > +           /*
> > +            * Attempt to swap in the value we are expecting. If we didn't 
> > see
> > +            * masked bits to be clear, that's just the old value. If we 
> > saw them
> > +            * as clear, we'll attempt to make an increment. The reason 
> > that we
> > +            * always swap in the value is that this doubles as a memory 
> > barrier.
> > +            * We could try to be smarter and only swap in values if we saw 
> > the
> > +            * maked bits as clear, but benchmark haven't shown it as 
> > beneficial
> > +            * so far.
> > +            *
> > +            * Retry if the value changed since we last looked at it.
> > +            */
> > +           if (pg_atomic_compare_exchange_u32_impl(ptr, &old_value, 
> > desired_value))
> > +                   return old_value;
> > +   }
> > +   pg_unreachable();
> > +}
> > +#endif
> 
> Have you done x86 benchmarking?

I think unless such benchmarking is done in the next 24h we need to move
this patch to the next CF...

Greetings,

Andres Freund


-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to