summaryrefslogtreecommitdiff
path: root/external/cddl/osnet/lib/libzpool/atomic.c
blob: c28e0805e0b49cc0bee6a8ad6149efef75d74346 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

#include <sys/types.h>
#include <sys/atomic.h>

#ifndef __HAVE_ATOMIC64_OPS

/* XXX: Not so atomic, could use mutexes but not worth it */
uint64_t
atomic_cas_64(volatile uint64_t *ptr, uint64_t old, uint64_t new) {
	uint64_t prev = *ptr;
	if (prev == old)
		*ptr = new;
	return prev;
}

void
atomic_add_64(volatile uint64_t *ptr, int64_t delta) {
	*ptr += delta;
}

void
atomic_inc_64(volatile uint64_t *ptr) {
	++(*ptr);
}

void
atomic_dec_64(volatile uint64_t *ptr) {
	--(*ptr);
}

uint64_t
atomic_add_64_nv(volatile uint64_t *ptr, int64_t delta) {
	return *ptr += delta;
}

#endif