| /* SPDX-License-Identifier: GPL-2.0 */ | |
| #ifndef __TOOLS_LINUX_ATOMIC_H | |
| #define __TOOLS_LINUX_ATOMIC_H | |
| #include <asm/atomic.h> | |
| void atomic_long_set(atomic_long_t *v, long i); | |
| /* atomic_cmpxchg_relaxed */ | |
| #ifndef atomic_cmpxchg_relaxed | |
| #define atomic_cmpxchg_relaxed atomic_cmpxchg | |
| #define atomic_cmpxchg_release atomic_cmpxchg | |
| #endif /* atomic_cmpxchg_relaxed */ | |
| static inline bool atomic_try_cmpxchg(atomic_t *ptr, int *oldp, int new) | |
| { | |
| int ret, old = *oldp; | |
| ret = atomic_cmpxchg(ptr, old, new); | |
| if (ret != old) | |
| *oldp = ret; | |
| return ret == old; | |
| } | |
| static inline bool atomic_inc_unless_negative(atomic_t *v) | |
| { | |
| int c = atomic_read(v); | |
| do { | |
| if (unlikely(c < 0)) | |
| return false; | |
| } while (!atomic_try_cmpxchg(v, &c, c + 1)); | |
| return true; | |
| } | |
| #endif /* __TOOLS_LINUX_ATOMIC_H */ |