mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
23 lines
560 B
23 lines
560 B
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
|
|
|