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 39... Line 39...
39
 
39
 
40
#define atomic_inc_post(x) atomic_add(x, 1)
40
#define atomic_inc_post(x) atomic_add(x, 1)
41
#define atomic_dec_post(x) atomic_add(x, -1)
41
#define atomic_dec_post(x) atomic_add(x, -1)
42
 
42
 
43
 
43
 
44
typedef volatile __u32 atomic_t;
44
typedef struct { volatile __u32 count; } atomic_t;
45
 
45
 
46
/* Atomic addition of immediate value.
46
/* Atomic addition of immediate value.
47
 *
47
 *
48
 * @param val Memory location to which will be the immediate value added.
48
 * @param val Memory location to which will be the immediate value added.
49
 * @param i Signed immediate that will be added to *val.
49
 * @param i Signed immediate that will be added to *val.
Line 60... Line 60...
60
        "   addiu %0, %0, %3\n" /* same as addi, but never traps on overflow */
60
        "   addiu %0, %0, %3\n" /* same as addi, but never traps on overflow */
61
        "       move %2, %0\n"
61
        "       move %2, %0\n"
62
        "   sc %0, %1\n"
62
        "   sc %0, %1\n"
63
        "   beq %0, %4, 1b\n"   /* if the atomic operation failed, try again */
63
        "   beq %0, %4, 1b\n"   /* if the atomic operation failed, try again */
64
        /*  nop */      /* nop is inserted automatically by compiler */
64
        /*  nop */      /* nop is inserted automatically by compiler */
65
        : "=r" (tmp), "=m" (*val), "=r" (v)
65
        : "=r" (tmp), "=m" (val->count), "=r" (v)
66
        : "i" (i), "i" (0)
66
        : "i" (i), "i" (0)
67
        );
67
        );
68
 
68
 
69
    return v;
69
    return v;
70
}
70
}
71
 
71
 
-
 
72
/* Reads/writes are atomic on mips for 4-bytes */
-
 
73
 
-
 
74
static inline void atomic_set(atomic_t *val, __u32 i)
-
 
75
{
-
 
76
    val->count = i;
-
 
77
}
-
 
78
 
-
 
79
static inline __u32 atomic_get(atomic_t *val)
-
 
80
{
-
 
81
    return val->count;
-
 
82
}
72
 
83
 
73
#endif
84
#endif