$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] Notice: Boost.Atomic (atomic operations library)
From: Helge Bahmann (hcb_at_[hidden])
Date: 2009-12-05 12:52:38
On Fri, 4 Dec 2009, Phil Endecott wrote:
> Helge Bahmann wrote:
>> there is a pseudo-code explanation in the boost::atomic class documentation
>
> Ah sorry, I didn't realise that compare_exchange_* were in the external
> interface; for some reason I thought they were internal.
they are external, but I have now changed the implementation that backends
must implement "four-operand" compare_exchange_*, which specifies two
memory_order operands (one for successful exchange, one for failed), but
give it a day until it is committed into the public repo
the three-operand version is then provided by the front-end
>
> OK, so since my kernel_cmpxchg() function doesn't return the old value but
> only a flag, I need something like:
>
> bool success = kernel_cmpxchg(e,d,&i);
> if (!success) e = i;
>
> But i may have changed again between the kernel_cmpxchg() and that
> assignment. Is that OK?
that's okay -- there are two cases:
- "new" value (loaded after failed cmpxchg) does not match "expected",
then the caller receive a more up-to-date value and retry with this one,
after all it does not matter whether it failed with the "old" or "new"
mismatching value
- "new" value (loaded after failed cmpxchg) matches "expected":
compare_exchange_weak is allowed to fail "spuriously"
> Should I use load() there? If so, what memory order is needed?
the load is internal, so load it "relaxed" , you only have to maintain
the memory order for the "total" cmpxchg, successful or failed
Best regards,
Helge