medfall

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

unix_atomic.h (1573B)


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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#ifndef _UNIX_ATOMIC_H_
#define _UNIX_ATOMIC_H_

#include "intrinsics.h"

#define read_barrier() asm volatile ( "" ::: "memory" )
#define write_barrier() asm volatile ( "" ::: "memory" )

#define ATOMIC_DEFS( T ) \
	inline T atomic_fetch_add_##T( atomic_##T * atom, T x ) { \
		return __sync_fetch_and_add( &atom->v, x ); \
	} \
	inline T atomic_fetch_sub_##T( atomic_##T * atom, T x ) { \
		return __sync_fetch_and_sub( &atom->v, x ); \
	} \
	inline T atomic_swap_##T( atomic_##T * atom, T x ) { \
		return __sync_lock_test_and_set( &atom->v, x ); \
	} \
	inline T atomic_cas_##T( atomic_##T * atom, T oldval, T newval ) { \
		return __sync_bool_compare_and_swap( &atom->v, oldval, newval ); \
	} \
	inline T atomic_get_##T( atomic_##T * atom ) { \
		return atom->v; \
	} \
	inline void atomic_set_##T( atomic_##T * atom, T x ) { \
		atom->v = x; \
	}

ATOMIC_DEFS( s8 );
ATOMIC_DEFS( s16 );
ATOMIC_DEFS( s32 );
ATOMIC_DEFS( s64 );
ATOMIC_DEFS( u8 );
ATOMIC_DEFS( u16 );
ATOMIC_DEFS( u32 );
ATOMIC_DEFS( u64 );

#undef ATOMIC_DEFS

template< typename T >
inline bool atomic_swap_pointer( atomic_ptr< T > * atom, T * x ) {
	return __sync_lock_test_and_set( &atom->v, x );
}

template< typename T >
inline bool atomic_cas_pointer( atomic_ptr< T > * atom, T * oldval, T * newval ) {
	return __sync_lock_compare_and_swap( &atom->v, oldval, newval );
}

template< typename T >
inline T atomic_get_ptr( atomic_ptr< T > * atom ) {
	return atom->v;
}

template< typename T >
inline void atomic_set_ptr( atomic_ptr< T > * atom, T * x ) {
	atom->v = x;
}

#endif // _UNIX_ATOMIC_H_