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)922898e3aSchristosatomic_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)1722898e3aSchristosatomic_add_64(volatile uint64_t *ptr, int64_t delta) { 1822898e3aSchristos *ptr += delta; 1922898e3aSchristos } 2022898e3aSchristos 2122898e3aSchristos void atomic_inc_64(volatile uint64_t * ptr)2222898e3aSchristosatomic_inc_64(volatile uint64_t *ptr) { 2322898e3aSchristos ++(*ptr); 2422898e3aSchristos } 2522898e3aSchristos 2622898e3aSchristos void atomic_dec_64(volatile uint64_t * ptr)2722898e3aSchristosatomic_dec_64(volatile uint64_t *ptr) { 2822898e3aSchristos --(*ptr); 2922898e3aSchristos } 3022898e3aSchristos 3122898e3aSchristos uint64_t atomic_add_64_nv(volatile uint64_t * ptr,int64_t delta)3222898e3aSchristosatomic_add_64_nv(volatile uint64_t *ptr, int64_t delta) { 3322898e3aSchristos return *ptr += delta; 3422898e3aSchristos } 35*c8ad22d6Schristos 36*c8ad22d6Schristos #endif 37