xref: /linux/tools/include/linux/atomic.h (revision 8804d970fab45726b3c7cd7f240b31122aa94219)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __TOOLS_LINUX_ATOMIC_H
3 #define __TOOLS_LINUX_ATOMIC_H
4 
5 #include <asm/atomic.h>
6 
7 void atomic_long_set(atomic_long_t *v, long i);
8 
9 /* atomic_cmpxchg_relaxed */
10 #ifndef atomic_cmpxchg_relaxed
11 #define  atomic_cmpxchg_relaxed		atomic_cmpxchg
12 #define  atomic_cmpxchg_release         atomic_cmpxchg
13 #endif /* atomic_cmpxchg_relaxed */
14 
atomic_try_cmpxchg(atomic_t * ptr,int * oldp,int new)15 static inline bool atomic_try_cmpxchg(atomic_t *ptr, int *oldp, int new)
16 {
17 	int ret, old = *oldp;
18 
19 	ret = atomic_cmpxchg(ptr, old, new);
20 	if (ret != old)
21 		*oldp = ret;
22 	return ret == old;
23 }
24 
atomic_inc_unless_negative(atomic_t * v)25 static inline bool atomic_inc_unless_negative(atomic_t *v)
26 {
27 	int c = atomic_read(v);
28 
29 	do {
30 		if (unlikely(c < 0))
31 			return false;
32 	} while (!atomic_try_cmpxchg(v, &c, c + 1));
33 
34 	return true;
35 }
36 
37 #endif /* __TOOLS_LINUX_ATOMIC_H */
38