Wednesday, February 18, 2009

simple spin lock

typedef struct{
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


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)
{
while( !g_atomic_int_compare_and_exchange(&s->spin, HAS_LOCK, MUST_WAIT) );
}

void my_spin_unlock(my_spinlock_t * s)
{
s->spin = HAS_LOCK;
}

No comments:

Post a Comment