Rev 534 | Rev 627 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 534 | Rev 625 | ||
---|---|---|---|
Line 29... | Line 29... | ||
29 | #ifndef __ia64_ATOMIC_H__ |
29 | #ifndef __ia64_ATOMIC_H__ |
30 | #define __ia64_ATOMIC_H__ |
30 | #define __ia64_ATOMIC_H__ |
31 | 31 | ||
32 | #include <arch/types.h> |
32 | #include <arch/types.h> |
33 | 33 | ||
34 | typedef volatile __u64 atomic_t; |
34 | typedef struct { volatile __u64 count; } atomic_t; |
35 | 35 | ||
36 | static inline atomic_t atomic_add(atomic_t *val, int imm) |
36 | static inline atomic_t atomic_add(atomic_t *val, int imm) |
37 | { |
37 | { |
38 | atomic_t v; |
38 | atomic_t v; |
39 | 39 | ||
40 | 40 | ||
41 | __asm__ volatile ("fetchadd8.rel %0 = %1, %2\n" : "=r" (v), "+m" (*val) : "i" (imm)); |
41 | __asm__ volatile ("fetchadd8.rel %0 = %1, %2\n" : "=r" (v), "+m" (val->count) : "i" (imm)); |
42 | 42 | ||
43 | return v; |
43 | return v; |
44 | } |
44 | } |
45 | 45 | ||
- | 46 | static inline void atomic_set(atomic_t *val, __u64 i) |
|
- | 47 | { |
|
- | 48 | val->count = i; |
|
- | 49 | } |
|
- | 50 | ||
- | 51 | static inline __u32 atomic_get(atomic_t *val) |
|
- | 52 | { |
|
- | 53 | return val->count; |
|
- | 54 | } |
|
- | 55 | ||
46 | static inline void atomic_inc(atomic_t *val) { atomic_add(val, 1); } |
56 | static inline void atomic_inc(atomic_t *val) { atomic_add(val, 1); } |
47 | static inline void atomic_dec(atomic_t *val) { atomic_add(val, -1); } |
57 | static inline void atomic_dec(atomic_t *val) { atomic_add(val, -1); } |
48 | 58 | ||
49 | 59 | ||
50 | static inline atomic_t atomic_inc_pre(atomic_t *val) { return atomic_add(val, 1); } |
60 | static inline atomic_t atomic_inc_pre(atomic_t *val) { return atomic_add(val, 1); } |