libclod
C library for interacting with NBTs, region files, LOD data and other things.
Loading...
Searching...
No Matches
mutex.c
1#include <clod/thread.h>
2#include <clod/sys/futex.h>
3#include "debug.h"
4#include "yield.h"
5
6#define FUTEX_TIMEOUT_US (1000 * 1000)
7
8#define ZERO 0
9#define LOCKED 1
10#define WAITER 2
11
13 while (1) {
14 int lock = clod_atomic_load(mutex);
15 while (lock & LOCKED) {
16 for (int i = 0; i < 500 && lock & LOCKED; i++) {
17 clod_pause();
18 lock = clod_atomic_load(mutex);
19 }
20
21 if (lock & LOCKED && clod_atomic_cas(mutex, &lock, lock + WAITER)) {
22 clod_futex_wait(mutex, lock + WAITER, FUTEX_TIMEOUT_US);
23 lock = clod_atomic_add(mutex, -WAITER);
24 }
25 }
26
27 if (clod_atomic_cas(mutex, &lock, lock + 1))
28 return;
29 }
30}
31
33 #if CLOD_DEBUG_THREAD
34 if (!(clod_atomic_load(mutex) & 1)) {
35 debug(CLOD_DEBUG_THREAD, "called clod_mutex_unlock on an unlocked mutex.");
36 }
37 #endif
38
39 int lock = clod_atomic_add(mutex, -1);
40 if (lock) {
41 clod_futex_wake_one(mutex);
42 }
43}
void clod_mutex_unlock(clod_mutex *mutex)
Definition mutex.c:32
void clod_mutex_lock(clod_mutex *mutex)
Definition mutex.c:12
int clod_mutex
Definition thread.h:188
Definition lock.c:21