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
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
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}
char clod_spinlock
Definition thread.h:124
void clod_spinlock_lock(clod_spinlock *spinlock)
Definition spinlock.c:5
void clod_spinlock_unlock(clod_spinlock *spinlock)
Definition spinlock.c:26
Definition lock.c:21