Implement atomic_swap_xxx() for all platforms.

Differential Revision:	https://reviews.freebsd.org/D18450
Reviewed by:		kib@
MFC after:		3 days
Sponsored by:		Mellanox Technologies
This commit is contained in:
Hans Petter Selasky 2018-12-10 13:38:13 +00:00
parent 98d2a76e37
commit d7a9bfee8f
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=341787
3 changed files with 74 additions and 0 deletions

View File

@ -55,6 +55,13 @@
#include <machine/atomic-v4.h>
#endif /* Arch >= v6 */
static __inline u_long
atomic_swap_long(volatile u_long *p, u_long v)
{
return (atomic_swap_32((volatile uint32_t *)p, v));
}
#define atomic_clear_ptr atomic_clear_32
#define atomic_clear_acq_ptr atomic_clear_acq_32
#define atomic_clear_rel_ptr atomic_clear_rel_32

View File

@ -755,4 +755,68 @@ atomic_thread_fence_seq_cst(void)
#define atomic_store_rel_ptr atomic_store_rel_long
#define atomic_readandclear_ptr atomic_readandclear_long
static __inline unsigned int
atomic_swap_int(volatile unsigned int *ptr, const unsigned int value)
{
unsigned int retval;
retval = *ptr;
while (!atomic_fcmpset_int(ptr, &retval, value))
;
return (retval);
}
static __inline uint32_t
atomic_swap_32(volatile uint32_t *ptr, const uint32_t value)
{
uint32_t retval;
retval = *ptr;
while (!atomic_fcmpset_32(ptr, &retval, value))
;
return (retval);
}
#if defined(__mips_n64) || defined(__mips_n32)
static __inline uint64_t
atomic_swap_64(volatile uint64_t *ptr, const uint64_t value)
{
uint64_t retval;
retval = *ptr;
while (!atomic_fcmpset_64(ptr, &retval, value))
;
return (retval);
}
#endif
static __inline unsigned long
atomic_swap_long(volatile unsigned long *ptr, const unsigned long value)
{
unsigned long retval;
retval = *ptr;
while (!atomic_fcmpset_32((volatile uint32_t *)ptr,
(uint32_t *)&retval, value))
;
return (retval);
}
static __inline uintptr_t
atomic_swap_ptr(volatile uintptr_t *ptr, const uintptr_t value)
{
uintptr_t retval;
retval = *ptr;
while (!atomic_fcmpset_32((volatile uint32_t *)ptr,
(uint32_t *)&retval, value))
;
return (retval);
}
#endif /* ! _MACHINE_ATOMIC_H_ */

View File

@ -852,6 +852,9 @@ atomic_swap_64(volatile u_long *p, u_long v)
#define atomic_fetchadd_64 atomic_fetchadd_long
#define atomic_swap_long atomic_swap_64
#define atomic_swap_ptr atomic_swap_64
#else
#define atomic_swap_long(p,v) atomic_swap_32((volatile u_int *)(p), v)
#define atomic_swap_ptr(p,v) atomic_swap_32((volatile u_int *)(p), v)
#endif
#undef __ATOMIC_REL