Blame view
arch/cris/include/asm/atomic.h
3.39 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 |
/* $Id: atomic.h,v 1.3 2001/07/25 16:15:19 bjornw Exp $ */ #ifndef __ASM_CRIS_ATOMIC__ #define __ASM_CRIS_ATOMIC__ |
9587997a4 cris-build-fixes-... |
5 |
#include <linux/compiler.h> |
ea4354675 atomic_t: unify a... |
6 |
#include <linux/types.h> |
1da177e4c Linux-2.6.12-rc2 |
7 |
#include <asm/system.h> |
556dcee7b [CRIS] Move heade... |
8 |
#include <arch/atomic.h> |
1da177e4c Linux-2.6.12-rc2 |
9 10 11 12 13 |
/* * Atomic operations that C can't guarantee us. Useful for * resource counting etc.. */ |
1da177e4c Linux-2.6.12-rc2 |
14 |
#define ATOMIC_INIT(i) { (i) } |
f3d46f9d3 atomic_t: Cast to... |
15 |
#define atomic_read(v) (*(volatile int *)&(v)->counter) |
1da177e4c Linux-2.6.12-rc2 |
16 17 18 |
#define atomic_set(v,i) (((v)->counter) = (i)) /* These should be written in asm but we do it in C for now. */ |
d9b5444ee [PATCH] cris: "ex... |
19 |
static inline void atomic_add(int i, volatile atomic_t *v) |
1da177e4c Linux-2.6.12-rc2 |
20 21 |
{ unsigned long flags; |
8d20a541b [PATCH] CRIS upda... |
22 |
cris_atomic_save(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
23 |
v->counter += i; |
8d20a541b [PATCH] CRIS upda... |
24 |
cris_atomic_restore(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
25 |
} |
d9b5444ee [PATCH] cris: "ex... |
26 |
static inline void atomic_sub(int i, volatile atomic_t *v) |
1da177e4c Linux-2.6.12-rc2 |
27 28 |
{ unsigned long flags; |
8d20a541b [PATCH] CRIS upda... |
29 |
cris_atomic_save(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
30 |
v->counter -= i; |
8d20a541b [PATCH] CRIS upda... |
31 |
cris_atomic_restore(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
32 |
} |
d9b5444ee [PATCH] cris: "ex... |
33 |
static inline int atomic_add_return(int i, volatile atomic_t *v) |
1da177e4c Linux-2.6.12-rc2 |
34 35 36 |
{ unsigned long flags; int retval; |
8d20a541b [PATCH] CRIS upda... |
37 |
cris_atomic_save(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
38 |
retval = (v->counter += i); |
8d20a541b [PATCH] CRIS upda... |
39 |
cris_atomic_restore(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
40 41 42 43 |
return retval; } #define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0) |
d9b5444ee [PATCH] cris: "ex... |
44 |
static inline int atomic_sub_return(int i, volatile atomic_t *v) |
1da177e4c Linux-2.6.12-rc2 |
45 46 47 |
{ unsigned long flags; int retval; |
8d20a541b [PATCH] CRIS upda... |
48 |
cris_atomic_save(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
49 |
retval = (v->counter -= i); |
8d20a541b [PATCH] CRIS upda... |
50 |
cris_atomic_restore(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
51 52 |
return retval; } |
d9b5444ee [PATCH] cris: "ex... |
53 |
static inline int atomic_sub_and_test(int i, volatile atomic_t *v) |
1da177e4c Linux-2.6.12-rc2 |
54 55 56 |
{ int retval; unsigned long flags; |
8d20a541b [PATCH] CRIS upda... |
57 |
cris_atomic_save(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
58 |
retval = (v->counter -= i) == 0; |
8d20a541b [PATCH] CRIS upda... |
59 |
cris_atomic_restore(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
60 61 |
return retval; } |
d9b5444ee [PATCH] cris: "ex... |
62 |
static inline void atomic_inc(volatile atomic_t *v) |
1da177e4c Linux-2.6.12-rc2 |
63 64 |
{ unsigned long flags; |
8d20a541b [PATCH] CRIS upda... |
65 |
cris_atomic_save(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
66 |
(v->counter)++; |
8d20a541b [PATCH] CRIS upda... |
67 |
cris_atomic_restore(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
68 |
} |
d9b5444ee [PATCH] cris: "ex... |
69 |
static inline void atomic_dec(volatile atomic_t *v) |
1da177e4c Linux-2.6.12-rc2 |
70 71 |
{ unsigned long flags; |
8d20a541b [PATCH] CRIS upda... |
72 |
cris_atomic_save(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
73 |
(v->counter)--; |
8d20a541b [PATCH] CRIS upda... |
74 |
cris_atomic_restore(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
75 |
} |
d9b5444ee [PATCH] cris: "ex... |
76 |
static inline int atomic_inc_return(volatile atomic_t *v) |
1da177e4c Linux-2.6.12-rc2 |
77 78 79 |
{ unsigned long flags; int retval; |
8d20a541b [PATCH] CRIS upda... |
80 |
cris_atomic_save(v, flags); |
3c1d9303a CRIS: Fix bugs in... |
81 |
retval = ++(v->counter); |
8d20a541b [PATCH] CRIS upda... |
82 |
cris_atomic_restore(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
83 84 |
return retval; } |
d9b5444ee [PATCH] cris: "ex... |
85 |
static inline int atomic_dec_return(volatile atomic_t *v) |
1da177e4c Linux-2.6.12-rc2 |
86 87 88 |
{ unsigned long flags; int retval; |
8d20a541b [PATCH] CRIS upda... |
89 |
cris_atomic_save(v, flags); |
3c1d9303a CRIS: Fix bugs in... |
90 |
retval = --(v->counter); |
8d20a541b [PATCH] CRIS upda... |
91 |
cris_atomic_restore(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
92 93 |
return retval; } |
d9b5444ee [PATCH] cris: "ex... |
94 |
static inline int atomic_dec_and_test(volatile atomic_t *v) |
1da177e4c Linux-2.6.12-rc2 |
95 96 97 |
{ int retval; unsigned long flags; |
8d20a541b [PATCH] CRIS upda... |
98 |
cris_atomic_save(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
99 |
retval = --(v->counter) == 0; |
8d20a541b [PATCH] CRIS upda... |
100 |
cris_atomic_restore(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
101 102 |
return retval; } |
d9b5444ee [PATCH] cris: "ex... |
103 |
static inline int atomic_inc_and_test(volatile atomic_t *v) |
1da177e4c Linux-2.6.12-rc2 |
104 105 106 |
{ int retval; unsigned long flags; |
8d20a541b [PATCH] CRIS upda... |
107 |
cris_atomic_save(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
108 |
retval = ++(v->counter) == 0; |
8d20a541b [PATCH] CRIS upda... |
109 |
cris_atomic_restore(v, flags); |
1da177e4c Linux-2.6.12-rc2 |
110 111 |
return retval; } |
4a6dae6d3 [PATCH] atomic: c... |
112 113 114 115 116 117 118 119 120 121 122 123 |
static inline int atomic_cmpxchg(atomic_t *v, int old, int new) { int ret; unsigned long flags; cris_atomic_save(v, flags); ret = v->counter; if (likely(ret == old)) v->counter = new; cris_atomic_restore(v, flags); return ret; } |
ffbf670f5 [PATCH] mutex sub... |
124 |
#define atomic_xchg(v, new) (xchg(&((v)->counter), new)) |
f24219b4e atomic: move atom... |
125 |
static inline int __atomic_add_unless(atomic_t *v, int a, int u) |
8426e1f6a [PATCH] atomic: i... |
126 127 128 129 130 131 132 133 134 |
{ int ret; unsigned long flags; cris_atomic_save(v, flags); ret = v->counter; if (ret != u) v->counter += a; cris_atomic_restore(v, flags); |
f24219b4e atomic: move atom... |
135 |
return ret; |
8426e1f6a [PATCH] atomic: i... |
136 |
} |
8426e1f6a [PATCH] atomic: i... |
137 |
|
1da177e4c Linux-2.6.12-rc2 |
138 139 140 141 142 143 144 |
/* Atomic operations are already serializing */ #define smp_mb__before_atomic_dec() barrier() #define smp_mb__after_atomic_dec() barrier() #define smp_mb__before_atomic_inc() barrier() #define smp_mb__after_atomic_inc() barrier() #endif |