xref: /netbsd-src/external/cddl/osnet/lib/libzpool/atomic.c (revision 0b24109d1b18e8f7ea2f8cadf0d9cfc236b5b43e)
122898e3aSchristos 
2*c8ad22d6Schristos #include <sys/types.h>
322898e3aSchristos #include <sys/atomic.h>
422898e3aSchristos 
5*c8ad22d6Schristos #ifndef __HAVE_ATOMIC64_OPS
6*c8ad22d6Schristos 
722898e3aSchristos /* XXX: Not so atomic, could use mutexes but not worth it */
822898e3aSchristos uint64_t
atomic_cas_64(volatile uint64_t * ptr,uint64_t old,uint64_t new)922898e3aSchristos atomic_cas_64(volatile uint64_t *ptr, uint64_t old, uint64_t new) {
1022898e3aSchristos 	uint64_t prev = *ptr;
1122898e3aSchristos 	if (prev == old)
1222898e3aSchristos 		*ptr = new;
1322898e3aSchristos 	return prev;
1422898e3aSchristos }
1522898e3aSchristos 
1622898e3aSchristos void
atomic_add_64(volatile uint64_t * ptr,int64_t delta)1722898e3aSchristos atomic_add_64(volatile uint64_t *ptr, int64_t delta) {
1822898e3aSchristos 	*ptr += delta;
1922898e3aSchristos }
2022898e3aSchristos 
2122898e3aSchristos void
atomic_inc_64(volatile uint64_t * ptr)2222898e3aSchristos atomic_inc_64(volatile uint64_t *ptr) {
2322898e3aSchristos 	++(*ptr);
2422898e3aSchristos }
2522898e3aSchristos 
2622898e3aSchristos void
atomic_dec_64(volatile uint64_t * ptr)2722898e3aSchristos atomic_dec_64(volatile uint64_t *ptr) {
2822898e3aSchristos 	--(*ptr);
2922898e3aSchristos }
3022898e3aSchristos 
3122898e3aSchristos uint64_t
atomic_add_64_nv(volatile uint64_t * ptr,int64_t delta)3222898e3aSchristos atomic_add_64_nv(volatile uint64_t *ptr, int64_t delta) {
3322898e3aSchristos 	return *ptr += delta;
3422898e3aSchristos }
35*c8ad22d6Schristos 
36*c8ad22d6Schristos #endif
37