⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atomic.h

📁 OTP是开放电信平台的简称
💻 H
字号:
/* * Native ethread atomics on x86/x86-64. * Author: Mikael Pettersson. * * This code requires a 486 or newer processor. */#ifndef ETHREAD_I386_ATOMIC_H#define ETHREAD_I386_ATOMIC_H/* An atomic is an aligned long accessed via locked operations. */typedef struct {    volatile long counter;} ethr_native_atomic_t;#ifdef __x86_64__#define LONG_SUFFIX "q"#else#define LONG_SUFFIX "l"#endifstatic ETHR_INLINE voidethr_native_atomic_init(ethr_native_atomic_t *var, long i){    var->counter = i;}#define ethr_native_atomic_set(v, i)	ethr_native_atomic_init((v), (i))static ETHR_INLINE longethr_native_atomic_read(ethr_native_atomic_t *var){    return var->counter;}static ETHR_INLINE voidethr_native_atomic_add(ethr_native_atomic_t *var, long incr){    __asm__ __volatile__(       "lock; add" LONG_SUFFIX " %1, %0"       : "=m"(var->counter)       : "ir"(incr), "m"(var->counter));}             static ETHR_INLINE voidethr_native_atomic_inc(ethr_native_atomic_t *var){    __asm__ __volatile__(	"lock; inc" LONG_SUFFIX " %0"	: "=m"(var->counter)	: "m"(var->counter));}static ETHR_INLINE voidethr_native_atomic_dec(ethr_native_atomic_t *var){    __asm__ __volatile__(	"lock; dec" LONG_SUFFIX " %0"	: "=m"(var->counter)	: "m"(var->counter));}static ETHR_INLINE longethr_native_atomic_add_return(ethr_native_atomic_t *var, long incr){    long tmp;    tmp = incr;    __asm__ __volatile__(	"lock; xadd" LONG_SUFFIX " %0, %1" /* xadd didn't exist prior to the 486 */	: "=r"(tmp)	: "m"(var->counter), "0"(tmp));    /* now tmp is the atomic's previous value */    return tmp + incr;}#define ethr_native_atomic_inc_return(var) ethr_native_atomic_add_return((var), 1)#define ethr_native_atomic_dec_return(var) ethr_native_atomic_add_return((var), -1)static ETHR_INLINE longethr_native_atomic_and_retold(ethr_native_atomic_t *var, long mask){    long tmp, old;    tmp = var->counter;    do {	old = tmp;	__asm__ __volatile__(	    "lock; cmpxchg" LONG_SUFFIX " %2, %3"	    : "=a"(tmp), "=m"(var->counter)	    : "r"(old & mask), "m"(var->counter), "0"(old));    } while (__builtin_expect(tmp != old, 0));    /* now tmp is the atomic's previous value */    return tmp;}static ETHR_INLINE longethr_native_atomic_or_retold(ethr_native_atomic_t *var, long mask){    long tmp, old;    tmp = var->counter;    do {	old = tmp;	__asm__ __volatile__(	    "lock; cmpxchg" LONG_SUFFIX " %2, %3"	    : "=a"(tmp), "=m"(var->counter)	    : "r"(old | mask), "m"(var->counter), "0"(old));    } while (__builtin_expect(tmp != old, 0));    /* now tmp is the atomic's previous value */    return tmp;}static ETHR_INLINE longethr_native_atomic_xchg(ethr_native_atomic_t *var, long val){       long tmp = val;    __asm__ __volatile__(	"xchg" LONG_SUFFIX " %0, %1"	: "=r"(tmp)	: "m"(var->counter), "0"(tmp));    /* now tmp is the atomic's previous value */     return tmp;} #undef LONG_SUFFIX#endif /* ETHREAD_I386_ATOMIC_H */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -