libclod
C library for interacting with NBTs, region files, LOD data and other things.
Loading...
Searching...
No Matches
spinlock.c
1
#include "debug.h"
2
#include <
clod/thread.h
>
3
#include "yield.h"
4
5
void
clod_spinlock_lock
(
clod_spinlock
*spinlock) {
6
clod_spinlock
lock
= 0;
7
while
(!clod_atomic_cas(spinlock, &
lock
, 1)) {
8
#if CLOD_DEBUG_THREAD
9
if
(
lock
!= 0 &&
lock
!= 1) {
10
debug(CLOD_DEBUG_THREAD,
"called clod_spinlock_lock on an invalid value."
);
11
}
12
#endif
13
14
for
(
int
i = 0; i < 500; i++) {
15
clod_pause();
16
lock
= 0;
17
if
(clod_atomic_cas(spinlock, &
lock
, 1))
18
return
;
19
}
20
21
clod_yield();
22
lock
= 0;
23
}
24
}
25
26
void
clod_spinlock_unlock
(
clod_spinlock
*spinlock) {
27
#if CLOD_DEBUG_THREAD
28
clod_spinlock
expected = 1;
29
if
(!clod_atomic_cas(spinlock, &expected, 0)) {
30
debug(CLOD_DEBUG_THREAD,
"called clod_spinlock_unlock on an unlocked spinlock."
);
31
}
32
#else
33
clod_atomic_store(spinlock, 0);
34
#endif
35
}
clod_spinlock
char clod_spinlock
Definition
thread.h:124
clod_spinlock_lock
void clod_spinlock_lock(clod_spinlock *spinlock)
Definition
spinlock.c:5
clod_spinlock_unlock
void clod_spinlock_unlock(clod_spinlock *spinlock)
Definition
spinlock.c:26
lock
Definition
lock.c:21
thread.h
src
thread
spinlock.c
Generated by
1.16.1