diff options
Diffstat (limited to 'components/pthreads/pthread_spin.c')
| -rw-r--r-- | components/pthreads/pthread_spin.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/components/pthreads/pthread_spin.c b/components/pthreads/pthread_spin.c index 4332ec1db8..c38c611616 100644 --- a/components/pthreads/pthread_spin.c +++ b/components/pthreads/pthread_spin.c @@ -2,25 +2,50 @@ int pthread_spin_init (pthread_spinlock_t *lock, int pshared)
{
+ if (!lock) return EINVAL;
+
+ lock->lock = 0;
return 0;
}
int pthread_spin_destroy (pthread_spinlock_t *lock)
{
+ if (!lock) return EINVAL;
+
return 0;
}
-int pthread_spin_lock (pthread_spinlock_t * lock)
+int pthread_spin_lock (pthread_spinlock_t *lock)
{
+ if (!lock) return EINVAL;
+
+ while (!(lock->lock))
+ {
+ lock->lock = 1;
+ }
+
return 0;
}
-int pthread_spin_trylock (pthread_spinlock_t * lock)
+int pthread_spin_trylock (pthread_spinlock_t *lock)
{
- return 0;
+ if (!lock) return EINVAL;
+
+ if (!(lock->lock))
+ {
+ lock->lock = 1;
+ return 0;
+ }
+
+ return EBUSY;
}
-int pthread_spin_unlock (pthread_spinlock_t * lock)
+int pthread_spin_unlock (pthread_spinlock_t *lock)
{
+ if (!lock) return EINVAL;
+ if (!(lock->lock)) return EPERM;
+
+ lock->lock = 0;
+
return 0;
}
|
