| 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 |