summaryrefslogtreecommitdiff
path: root/src/inc/MESA_atomic.h
blob: 76e5b80c282e1edcc233babf527c67a3b1b4a553 (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
37
38
#ifndef _MESA_ATOMIC_H_
#define _MESA_ATOMIC_H_


#if(__GNUC__ * 100 + __GNUC_MINOR__ * 10 + __GNUC_PATCHLEVEL__ >= 411)
typedef unsigned long MESA_ATOMIC_T;
#define MESA_ATOMIC_SET(v, i)	__sync_lock_test_and_set((&v), i)
#define MESA_ATOMIC_READ(v)		__sync_or_and_fetch((&v), 0)
#define MESA_ATOMIC_INC(v) 		__sync_add_and_fetch((&v),1)
#define MESA_ATOMIC_DEC(v) 		__sync_sub_and_fetch((&v),1)
#define MESA_ATOMIC_ADD(v,add) 	__sync_add_and_fetch((&v),(add))
#define MESA_ATOMIC_SUB(v,sub) 	__sync_sub_and_fetch((&v),(sub))
#else 
#include <alsa/iatomic.h>
typedef atomic_t	MESA_ATOMIC_T;
#define MESA_ATOMIC_SET(v, i)	atomic_set((&v), i)
#define MESA_ATOMIC_READ(v) 	atomic_read((&v))
#define MESA_ATOMIC_INC(v) 		atomic_inc((&v))
#define MESA_ATOMIC_DEC(v) 		atomic_dec((&v))
#define MESA_ATOMIC_ADD(v, add) atomic_add((add),(&v))
#define MESA_ATOMIC_SUB(v, sub) 	atomic_sub((sub),(&v))
#endif 


#ifdef __tilegx__
#include <arch/atomic.h>
typedef int	MESA_ATOMIC_T;
#define MESA_ATOMIC_SET(v, i)	arch_atomic_exchange((&v), i)
#define MESA_ATOMIC_READ(v) 	arch_atomic_or((&v), 0)
#define MESA_ATOMIC_INC(v) 		arch_atomic_add((&v), 1)
#define MESA_ATOMIC_DEC(v) 		arch_atomic_sub((&v), 1)
#define MESA_ATOMIC_ADD(v, add) arch_atomic_add((&v), add)
#define MESA_ATOMIC_SUB(v, sub) 	arch_atomic_sub((&v), sub)
#endif


#endif