24 lines
		
	
	
		
			523 B
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			24 lines
		
	
	
		
			523 B
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|  | cat << EOF | ||
|  | /** | ||
|  |  * ${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 inline ${int} | ||
|  | ${atomic}_fetch_add_unless(${atomic}_t *v, ${int} a, ${int} u) | ||
|  | { | ||
|  | 	${int} c = ${atomic}_read(v); | ||
|  | 
 | ||
|  | 	do { | ||
|  | 		if (unlikely(c == u)) | ||
|  | 			break; | ||
|  | 	} while (!${atomic}_try_cmpxchg(v, &c, c + a)); | ||
|  | 
 | ||
|  | 	return c; | ||
|  | } | ||
|  | EOF |