41 lines
532 B
C
41 lines
532 B
C
|
|
|
|
#include <sync.h>
|
|
|
|
|
|
void spinlock_init(spinlock_t* lock)
|
|
{
|
|
lock->locked = 0;
|
|
}
|
|
|
|
static inline int atomic_xchg(volatile int* addr, int newval)
|
|
{
|
|
int result;
|
|
|
|
asm volatile (
|
|
"xchg %0, %1"
|
|
: "=r"(result), "+m"(*addr)
|
|
: "0"(newval)
|
|
: "memory"
|
|
);
|
|
|
|
return result;
|
|
}
|
|
|
|
void spin_lock(spinlock_t* lock)
|
|
{
|
|
while (atomic_xchg(&lock->locked, 1))
|
|
{
|
|
while (lock->locked)
|
|
{
|
|
asm volatile("pause");
|
|
}
|
|
}
|
|
}
|
|
|
|
void spin_unlock(spinlock_t* lock)
|
|
{
|
|
__atomic_clear(&lock->locked, __ATOMIC_RELEASE);
|
|
}
|
|
|