一些内核同步API (1)

typedef struct{        //原子操作是最小执行单位
int counter;     //值
}atomic_t

//将原子变量v增加i
static inline void atomic_add(int i, atomic_t *v)
{
asm volatile(LOCK_PREFIX "addl %1,%0"
     : "+m" (v->counter)
     : "ir" (i));
}


//将原子变量v增加i,判断增加后v是不是负数
static inline int atomic_add_negative(int i, atomic_t *v)
{
GEN_BINARY_RMWcc(LOCK_PREFIX "addl", v->counter, "er", i, "%0", "s");
}


//将原子变量v增加i,并返回加后的值
static inline int atomic_add_return(int i, atomic_t *v)
{
return i + xadd(&v->counter, i);
}


//u不等于v,则将v+a
static inline int __atomic_add_unless(atomic_t *v, int a, int u)
{
int c, old;
c = atomic_read(v);
for (;;) {
if (unlikely(c == (u)))
break;
old = atomic_cmpxchg((v), c, c + (a));
if (likely(old == c))
break;
c = old;
}
return c;
}


//将old与v所在的内存中的值相比较,如果相等,则将new存到v所表示的地址单元中
//如果不相等,则该地址的值不变

static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
{
return cmpxchg(&v->counter, old, new);
}


//将原子变量v减1
static inline void atomic_dec(atomic_t *v)
{
asm volatile(LOCK_PREFIX "decl %0"
     : "+m" (v->counter));
}


//将原子变量v减1,并判断减1后是否为0,返回1警告是0,⚠
static inline int atomic_dec_and_test(atomic_t *v)
{
GEN_UNARY_RMWcc(LOCK_PREFIX "decl", v->counter, "%0", "e");
}


//同atomic_dec,atomic_dec_and_test
static inline void atomic_inc(atomic_t *v)
{
asm volatile(LOCK_PREFIX "incl %0"
     : "+m" (v->counter));
}
static inline int atomic_inc_and_test(atomic_t *v)
{
GEN_UNARY_RMWcc(LOCK_PREFIX "incl", v->counter, "%0", "e");
}


//读原子值
static inline int atomic_read(const atomic_t *v)
{
return ACCESS_ONCE((v)->counter);
}


//设置v的值为i,无返回值
static inline void atomic_set(atomic_t *v, int i)
{
v->counter = i;
}


//同atomic_add,atomic_add_return
static inline void atomic_sub(int i, atomic_t *v)
{
asm volatile(LOCK_PREFIX "subl %1,%0"
     : "+m" (v->counter)
     : "ir" (i));
}
static inline int atomic_sub_and_test(int i, atomic_t *v)
{
GEN_BINARY_RMWcc(LOCK_PREFIX "subl", v->counter, "er", i, "%0", "e");
}
static inline int atomic_sub_return(int i, atomic_t *v)
{
return atomic_add_return(-i, v);
}

猜你喜欢

转载自blog.csdn.net/dummkopfer/article/details/80554711