Branch data Line data Source code
1 : : #ifndef __CR_ATOMIC_H__
2 : : #define __CR_ATOMIC_H__
3 : :
4 : : #include "asm/cmpxchg.h"
5 : :
6 : : #define LOCK_PREFIX "\n\tlock; "
7 : :
8 : : typedef struct {
9 : : int counter;
10 : : } atomic_t;
11 : :
12 : : #define ATOMIC_INIT(i) { (i) }
13 : :
14 : : static inline int atomic_read(const atomic_t *v)
15 : : {
16 : 13632 : return (*(volatile int *)&(v)->counter);
17 : : }
18 : :
19 : : static inline void atomic_set(atomic_t *v, int i)
20 : : {
21 : 13273 : v->counter = i;
22 : : }
23 : :
24 : : static inline void atomic_add(int i, atomic_t *v)
25 : : {
26 : 1419 : asm volatile(LOCK_PREFIX "addl %1,%0"
27 : : : "+m" (v->counter)
28 : : : "ir" (i));
29 : : }
30 : :
31 : : static inline void atomic_sub(int i, atomic_t *v)
32 : : {
33 : : asm volatile(LOCK_PREFIX "subl %1,%0"
34 : : : "+m" (v->counter)
35 : : : "ir" (i));
36 : : }
37 : :
38 : : static inline void atomic_inc(atomic_t *v)
39 : : {
40 : 190 : asm volatile(LOCK_PREFIX "incl %0"
41 : : : "+m" (v->counter));
42 : : }
43 : :
44 : : static inline void atomic_dec(atomic_t *v)
45 : : {
46 : 987 : asm volatile(LOCK_PREFIX "decl %0"
47 : : : "+m" (v->counter));
48 : : }
49 : :
50 : : static inline int atomic_dec_and_test(atomic_t *v)
51 : : {
52 : : unsigned char c;
53 : :
54 : : asm volatile(LOCK_PREFIX "decl %0; sete %1"
55 : : : "+m" (v->counter), "=qm" (c)
56 : : : : "memory");
57 : : return c != 0;
58 : : }
59 : :
60 : : static inline int atomic_add_return(int i, atomic_t *v)
61 : : {
62 : 60 : return i + xadd(&v->counter, i);
63 : : }
64 : :
65 : : static inline int atomic_sub_return(int i, atomic_t *v)
66 : : {
67 : : return atomic_add_return(-i, v);
68 : : }
69 : :
70 : : #define atomic_inc_return(v) (atomic_add_return(1, v))
71 : : #define atomic_dec_return(v) (atomic_sub_return(1, v))
72 : :
73 : : #endif /* __CR_ATOMIC_H__ */
|