typedef struct{
volatile int spin;
}my_spinlock_t;
int my_spin_init(my_spinlock_t * s, void *);
void my_spin_lock(my_spinlock_t * s);
void my_spin_unlock(my_spinlock_t * s);
void my_spin_dump(my_spinlock_t * s);
#define HAS_LOCK 0
#define MUST_WAIT 1
#define BACKOFF_BASE 100000
inline int g_atomic_int_exchange_and_add (int *atomic, int val)
{
int result;
__asm__ __volatile__ ("lock; xaddl %0,%1"
: "=r" (result), "=m" (*atomic)
: "0" (val), "m" (*atomic));
return result;
}
inline int g_atomic_int_compare_and_exchange (int *atomic, int oldval, int newval)
{
int result;
__asm__ __volatile__ ("lock; cmpxchgl %2, %1"
: "=a" (result), "=m" (*atomic)
: "r" (newval), "m" (*atomic), "0" (oldval));
return result == oldval;
}
int my_spin_init(my_spinlock_t * s, void *p)
{
s->spin = HAS_LOCK;
return 0;
}
void my_spin_lock(my_spinlock_t * s)
{
volatile int i;
while( !g_atomic_int_compare_and_exchange(&s->spin, HAS_LOCK, MUST_WAIT) ){
for(i=BACKOFF_BASE;i;i--);
}
}
void my_spin_unlock(my_spinlock_t * s)
{
s->spin = HAS_LOCK;
}
void my_spin_lock(my_spinlock_t * s)
{
volatile int i;
while( !g_atomic_int_compare_and_exchange(&s->spin, HAS_LOCK, MUST_WAIT) ){
while(s->spin == MUST_WAIT)
for(i=BACKOFF_BASE;i;i--);
}
}
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment