blob: 4a113d1aef97a76a11f9f02fde0073a6b348b51a (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
#include "../globals.h"
#include "spin_lock.h"
/*
* Your average spin lock.
*/
// #define TRACE
spin_lock::spin_lock() {
unlock();
}
spin_lock::~spin_lock() {
}
static inline unsigned xchg32(void *ptr, unsigned x) {
__asm__ __volatile__("xchgl %0,%1"
:"=r" ((unsigned) x)
:"m" (*(volatile unsigned *)ptr), "0" (x)
:"memory");
return x;
}
void spin_lock::lock() {
while (true) {
if (!xchg32(&ticket, 1)) {
return;
}
while (ticket) {
pause();
}
}
#ifdef TRACE
printf(" lock: %d", ticket);
#endif
}
void spin_lock::unlock() {
ticket = 0;
#ifdef TRACE
printf("unlock:");
#endif
}
void spin_lock::pause() {
asm volatile("pause\n" : : : "memory");
}
|