blob: 1ef2be13c48d3c79e29c96cf9ad4f5d7615bd559 (
plain) (
tree)
|
|
#include "spinlock.h"
static inline int32 exchangeAtomic(volatile int32* oldValueAddress, int32 newValue)
{
//no need to use lock instruction on xchg
asm volatile ("xchgl %0, %1"
: "=r"(newValue)
: "m"(*oldValueAddress), "0"(newValue)
: "memory");
return newValue;
}
void Spinlock_Init(Spinlock* spinlock)
{
*spinlock = 0;
}
void Spinlock_Lock(Spinlock* spinlock)
{
while (exchangeAtomic((int32*)spinlock, 1))
{
halt();
}
}
void Spinlock_Unlock(Spinlock* spinlock)
{
*spinlock = 0;
}
|