Boost logo

Boost :

Subject: Re: [boost] Notice: Boost.Atomic (atomic operations library)
From: Phil Endecott (spam_from_boost_dev_at_[hidden])
Date: 2009-12-04 12:06:31


Hi Helge,

In your x86 code you have:

bool compare_exchange_strong(T &e, T d, memory_order
order=memory_order_seq_cst) volatile
{
     T prev=e;
     __asm__ __volatile__("lock cmpxchgb %1, %2\n" : "=a" (prev) : "q"
(d), "m" (i), "a" (e) : "memory");
     bool success=(prev==e);
     e=prev;
     return success;
}

Can you explain why 'e' is a reference and why you assign back to it?
Maybe it would help if you could write out what that asm does in
pseudo-code. The kernel_cmpxchg that I have does:

if (*ptr == oldval) {
   *ptr = newval;
   return 0;
} else {
   return !0;
}

I think I can just write

bool compare_exchange_strong(T &e, T d, memory_order
order=memory_order_seq_cst) volatile
{
   return kernel_cmpxchg(e,d,&i) == 0;
}

but the extra stuff in your x86 version makes me suspect there is more
to it.

Phil.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk