2010-11-12 18:26:36 +08:00
|
|
|
#include "pthread_spin.h"
|
|
|
|
|
|
|
|
int pthread_spin_init (pthread_spinlock_t *lock, int pshared)
|
|
|
|
{
|
2010-11-15 08:25:37 +08:00
|
|
|
if (!lock) return EINVAL;
|
|
|
|
|
|
|
|
lock->lock = 0;
|
2010-11-12 18:26:36 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int pthread_spin_destroy (pthread_spinlock_t *lock)
|
|
|
|
{
|
2010-11-15 08:25:37 +08:00
|
|
|
if (!lock) return EINVAL;
|
|
|
|
|
2010-11-12 18:26:36 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2010-11-15 08:25:37 +08:00
|
|
|
int pthread_spin_lock (pthread_spinlock_t *lock)
|
2010-11-12 18:26:36 +08:00
|
|
|
{
|
2010-11-15 08:25:37 +08:00
|
|
|
if (!lock) return EINVAL;
|
|
|
|
|
|
|
|
while (!(lock->lock))
|
|
|
|
{
|
|
|
|
lock->lock = 1;
|
|
|
|
}
|
|
|
|
|
2010-11-12 18:26:36 +08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2010-11-15 08:25:37 +08:00
|
|
|
int pthread_spin_trylock (pthread_spinlock_t *lock)
|
2010-11-12 18:26:36 +08:00
|
|
|
{
|
2010-11-15 08:25:37 +08:00
|
|
|
if (!lock) return EINVAL;
|
|
|
|
|
|
|
|
if (!(lock->lock))
|
|
|
|
{
|
|
|
|
lock->lock = 1;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return EBUSY;
|
2010-11-12 18:26:36 +08:00
|
|
|
}
|
|
|
|
|
2010-11-15 08:25:37 +08:00
|
|
|
int pthread_spin_unlock (pthread_spinlock_t *lock)
|
2010-11-12 18:26:36 +08:00
|
|
|
{
|
2010-11-15 08:25:37 +08:00
|
|
|
if (!lock) return EINVAL;
|
|
|
|
if (!(lock->lock)) return EPERM;
|
|
|
|
|
|
|
|
lock->lock = 0;
|
|
|
|
|
2010-11-12 18:26:36 +08:00
|
|
|
return 0;
|
|
|
|
}
|