cat << EOF | |
/** | |
* ${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 inline ${int} | |
${atomic}_fetch_add_unless(${atomic}_t *v, ${int} a, ${int} u) | |
{ | |
${int} c = ${atomic}_read(v); | |
do { | |
if (unlikely(c == u)) | |
break; | |
} while (!${atomic}_try_cmpxchg(v, &c, c + a)); | |
return c; | |
} | |
EOF |