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