#include union { struct { unsigned char val; unsigned char flag; }; unsigned short lock; } l = { 0,0 }; int main(int argc, char **argv) { int i; { { for (i = 0; i < 100000000; i++) { unsigned short inc = 2; if (l.val >= (0x100 - 2)) inc += -1 << 8; asm volatile("lock; xadd %1,%0" : "+m" (l.lock), "+r" (inc) : ); if (inc & 0x100) break; asm volatile("" : : : "memory"); } l.flag = 1; } } return 0; }