Subversion Repositories HelenOS-historic

Rev

Rev 534 | Rev 627 | Go to most recent revision | Show entire file | Ignore 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); }