cat << EOF | |
/** | |
* arch_${atomic}_fetch_add_unless - add unless the number is already a given value | |
* @v: pointer of type ${atomic}_t | |
* @a: the amount to add to v... | |
* @u: ...unless v is equal to u. | |
* | |
* Atomically adds @a to @v, so long as @v was not already @u. | |
* Returns original value of @v | |
*/ | |
static __always_inline ${int} | |
arch_${atomic}_fetch_add_unless(${atomic}_t *v, ${int} a, ${int} u) | |
{ | |
${int} c = arch_${atomic}_read(v); | |
do { | |
if (unlikely(c == u)) | |
break; | |
} while (!arch_${atomic}_try_cmpxchg(v, &c, c + a)); | |
return c; | |
} | |
EOF |