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