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