一些内核同步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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值