[zeromq-dev] atomic ops
john skaller
skaller at users.sourceforge.net
Wed Feb 8 05:34:42 CET 2012
I am looking at the atomic ops stuff, and I find this a bit suspicious,
and also suboptimal:
#elif (defined __i386__ || defined __x86_64__) && defined __GNUC__
#define ZMQ_ATOMIC_COUNTER_X86
...
#elif defined ZMQ_ATOMIC_COUNTER_X86
integer_t oldval = -decrement;
volatile integer_t *val = &value;
__asm__ volatile ("lock; xaddl %0,%1"
: "=r" (oldval), "=m" (*val)
: "0" (oldval), "m" (*val)
: "cc", "memory");
return oldval != decrement;
First, I surely wouldn't trust inline assembler, and I'm suspicious of
"lock; xadd". This code also won't be selected except on x86 or x86_64.
Wouldn't it be better to use this function:
type __sync_fetch_and_add (type *ptr, type value, ...)
which is guaranteed to work on all processors?
I'd trust gcc to do the right thing a lot more than inline assembler.
That function is always available if __GNUC__ is set, on recent
enough implementations of gcc. The spec comes from gcc 4.1.2.
[Presumably config can double check..]
--
john skaller
skaller at users.sourceforge.net
More information about the zeromq-dev
mailing list