跑的很欢的 代码 到了 gcc version 4.1.2
下面 __sync_bool_compare_and_swap 找不到了。。。
加了 -march 也不管用 。。
干脆自己写一个吧
参考gcc 的atomic.h
#define LOCK_PREFIX "lock;" #define __sync_bool_compare_and_swap(mem, oldval, newval) \ ({ __typeof (*mem) ret; \ __asm __volatile (LOCK_PREFIX "cmpxchg %2, %1" \ : "=a" (ret), "=m" (*mem) \ : "r" (newval), "m" (*mem), "0" (oldval)); \ ret; })
写了一个 。。。
运行。。。。。lock free 变成死循环了。。。gdb 汇编调试之
发现返回值不对。。。。
看了看nginx的实现 发现需要 setz %返回寄存器。。
加上吧。。。
写道
/tmp/ccyACQUP.s:55: Error: suffix or operands invalid for `setz'
/tmp/ccyACQUP.s:103: Error: suffix or operands invalid for `setz'
/tmp/ccyACQUP.s:103: Error: suffix or operands invalid for `setz'
报错。。。。崩溃。。。 Google之 发现这也是高版本才可以 asm ("setz %n");
折腾了半天 发现只能
重新修改
#define LOCK_PREFIX "lock;" #define __sync_bool_compare_and_swap(mem, oldval, newval) \ ({ __typeof (*mem) ret; \ __asm __volatile (LOCK_PREFIX "cmpxchgl %2, %1;sete %%al; movzbl %%al,%%eax" \ : "=a" (ret), "=m" (*mem) \ : "r" (newval), "m" (*mem), "a" (oldval)\ :"memory"); \ ret; })
一切正常。。。
有需要的人 拿去用吧。。。有问题留言