1/*
2 * Copyright 2010, Lucian Adrian Grijincu, lucian.grijincu@gmail.com.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include <pthread.h>
8
9#include <arch_cpu_defs.h>
10
11#include "pthread_private.h"
12
13
14#define UNLOCKED	0
15#define LOCKED		1
16
17
18int
19pthread_spin_init(pthread_spinlock_t* lock, int pshared)
20{
21	// This implementation of spinlocks doesn't differentiate
22	// between spin locks used by threads in the same process or
23	// between threads of different processes.
24
25	lock->lock = UNLOCKED;
26	return 0;
27}
28
29
30int
31pthread_spin_destroy(pthread_spinlock_t* lock)
32{
33	return 0;
34}
35
36
37int
38pthread_spin_lock(pthread_spinlock_t* lock)
39{
40	while (atomic_test_and_set((int32*)&lock->lock, LOCKED, UNLOCKED)
41			== LOCKED) {
42		SPINLOCK_PAUSE(); // spin
43			// TODO: On UP machines we should thread_yield() in the loop.
44	}
45	return 0;
46}
47
48
49int
50pthread_spin_trylock(pthread_spinlock_t* lock)
51{
52	if (atomic_test_and_set((int32*)&lock->lock, LOCKED, UNLOCKED) == LOCKED)
53		return EBUSY;
54	return 0;
55}
56
57
58int
59pthread_spin_unlock(pthread_spinlock_t* lock)
60{
61	lock->lock = UNLOCKED;
62	return 0;
63}
64