/* SPDX-License-Identifier: GPL-2.0 */ #ifndef __TOOLS_LINUX_ATOMIC_H #define __TOOLS_LINUX_ATOMIC_H #include 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 */