On 2014-09-24 21:19:06 +0300, Heikki Linnakangas wrote: > On 09/24/2014 07:57 PM, Andres Freund wrote: > >On 2014-09-24 12:44:09 -0400, Tom Lane wrote: > >>Andres Freund <and...@2ndquadrant.com> writes: > >>>On 2014-09-24 18:55:51 +0300, Heikki Linnakangas wrote: > >>>>There doesn't seem to be any hardware implementations of that in the > >>>>patch. > >>>>Is there any architecture that has an instruction or compiler intrinsic > >>>>for > >>>>that? > >> > >>>You can implement it rather efficiently on ll/sc architectures. But I > >>>don't really think it matters. I prefer add_until (I've seen it named > >>>saturated add before as well) to live in the atomics code, rather than > >>>reimplement it in atomics employing code. I guess you see that > >>>differently? > >> > >>I think the question is more like "what in the world happened to confining > >>ourselves to a small set of atomics". > > > >I fail to see why the existance of a wrapper around compare-exchange > >(which is one of the primitives we'd agreed upon) runs counter to > >the agreement that we'll only rely on a limited number of atomics on the > >hardware level? > > It might be a useful function, but if there's no hardware implementation for > it, it doesn't belong in atomics.h. We don't want to turn it into a general > library of useful little functions.
Uh. It belongs there because it *atomically* does a saturated add? That's precisely what atomics.h is about, so I don't see why it'd belong anywhere else. > >>I doubt either that this exists > >>natively anywhere, or ethat it's so useful that we should expect platforms > >>to have efficient implementations. > > Googling around, ARM seems to have a QADD instruction that does that. But > AFAICS it's not an atomic instruction that you could use for synchronization > purposes, just a regular instruction. On ARM - and many other LL/SC architectures - you can implement it atomically using LL/SC. In pseudocode: while (true) { load_linked(mem, reg); if (reg + add < limit) reg = reg + add; else reg = limit; if (store_conditional(mem, reg)) break } That's how pretty much *all* atomic instructions work on such architectures. > >It's useful for my work to get rid of most LockBufHdr() calls (to > >manipulate usagecount locklessly). That's why I added it. We can delay > >it till that patch is ready, but I don't really see the benefit. > > Yeah, please leave it out for now, we can argue about it later. Even if we > want it in the future, it would be just dead, untested code now. Ok, will remove it for now. I won't repost a version with it removed, as removing a function as the only doesn't seem to warrant reposting it. 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