rendered paste bodyint cmpxchg(int oldval, int newval, lock_t * l)
{
int result;
asm volatile("cmpxchgl %2, %0" :
"+m" (*l), "=a" (result) :
"r"(newval), "1"(oldval) :
"cc");
return result;
}
int test_and_set(lock_t * l, int newval)
{
return cmpxchg(l->status, newval, &l->status);
}
void lock_acquire(lock_t * l)
{
int count;
for(;;) {
for(count = 1024; count > 0; count--) {
if(test_and_set(l, 1) == 0) {
// Got it
return;
}
}
// didn't get it, go to sleep
yield();
}
}
void lock_release(lock_t * l)
{
test_and_set(l, 0);
}