Subversion Repositories HelenOS-historic

Rev

Rev 1024 | Rev 1107 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1024 Rev 1104
Line 28... Line 28...
28
 
28
 
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
#include <typedefs.h>
33
 
34
 
34
typedef struct { volatile __u64 count; } atomic_t;
-
 
35
 
35
 
36
/** Atomic addition.
36
/** Atomic addition.
37
 *
37
 *
38
 * @param val Atomic value.
38
 * @param val Atomic value.
39
 * @param imm Value to add.
39
 * @param imm Value to add.
40
 *
40
 *
41
 * @return Value before addition.
41
 * @return Value before addition.
42
 */
42
 */
43
static inline count_t atomic_add(atomic_t *val, int imm)
43
static inline long atomic_add(atomic_t *val, int imm)
44
{
44
{
45
    count_t v;
45
    long v;
46
 
46
 
47
    __asm__ volatile ("fetchadd8.rel %0 = %1, %2\n" : "=r" (v), "+m" (val->count) : "i" (imm));
47
    __asm__ volatile ("fetchadd8.rel %0 = %1, %2\n" : "=r" (v), "+m" (val->count) : "i" (imm));
48
 
48
 
49
    return v;
49
    return v;
50
}
50
}
51
 
51
 
52
static inline void atomic_set(atomic_t *val, __u64 i)
-
 
53
{
-
 
54
    val->count = i;
-
 
55
}
-
 
56
 
-
 
57
static inline __u32 atomic_get(atomic_t *val)
-
 
58
{
-
 
59
    return val->count;
-
 
60
}
-
 
61
 
-
 
62
static inline void atomic_inc(atomic_t *val) { atomic_add(val, 1); }
52
static inline void atomic_inc(atomic_t *val) { atomic_add(val, 1); }
63
static inline void atomic_dec(atomic_t *val) { atomic_add(val, -1); }
53
static inline void atomic_dec(atomic_t *val) { atomic_add(val, -1); }
64
 
54
 
65
static inline count_t atomic_preinc(atomic_t *val) { return atomic_add(val, 1) + 1; }
55
static inline long atomic_preinc(atomic_t *val) { return atomic_add(val, 1) + 1; }
66
static inline count_t atomic_predec(atomic_t *val) { return atomic_add(val, -1) - 1; }
56
static inline long atomic_predec(atomic_t *val) { return atomic_add(val, -1) - 1; }
67
 
57
 
68
static inline count_t atomic_postinc(atomic_t *val) { return atomic_add(val, 1); }
58
static inline long atomic_postinc(atomic_t *val) { return atomic_add(val, 1); }
69
static inline count_t atomic_postdec(atomic_t *val) { return atomic_add(val, -1); }
59
static inline long atomic_postdec(atomic_t *val) { return atomic_add(val, -1); }
70
 
60
 
71
#endif
61
#endif