1ace9bad4SMark Rutlandcat << EOF
2ace9bad4SMark Rutland/**
3ace9bad4SMark Rutland * ${atomic}_fetch_add_unless - add unless the number is already a given value
4ace9bad4SMark Rutland * @v: pointer of type ${atomic}_t
5ace9bad4SMark Rutland * @a: the amount to add to v...
6ace9bad4SMark Rutland * @u: ...unless v is equal to u.
7ace9bad4SMark Rutland *
8ace9bad4SMark Rutland * Atomically adds @a to @v, so long as @v was not already @u.
9ace9bad4SMark Rutland * Returns original value of @v
10ace9bad4SMark Rutland */
11ace9bad4SMark Rutlandstatic inline ${int}
12ace9bad4SMark Rutland${atomic}_fetch_add_unless(${atomic}_t *v, ${int} a, ${int} u)
13ace9bad4SMark Rutland{
14ace9bad4SMark Rutland	${int} c = ${atomic}_read(v);
15ace9bad4SMark Rutland
16ace9bad4SMark Rutland	do {
17ace9bad4SMark Rutland		if (unlikely(c == u))
18ace9bad4SMark Rutland			break;
19ace9bad4SMark Rutland	} while (!${atomic}_try_cmpxchg(v, &c, c + a));
20ace9bad4SMark Rutland
21ace9bad4SMark Rutland	return c;
22ace9bad4SMark Rutland}
23ace9bad4SMark RutlandEOF
24