summaryrefslogtreecommitdiff
path: root/lib/libc/include/atomic.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/include/atomic.h')
-rw-r--r--lib/libc/include/atomic.h23
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/libc/include/atomic.h b/lib/libc/include/atomic.h
new file mode 100644
index 00000000..94cd34db
--- /dev/null
+++ b/lib/libc/include/atomic.h
@@ -0,0 +1,23 @@
+#ifndef __LIBC_ATOMIC_H
+#define __LIBC_ATOMIC_H
+
+#include <stdatomic.h>
+
+#define LIBC_LOCK(__lock) __libc_lock(&__lock)
+#define LIBC_UNLOCK(__lock) atomic_flag_clear(&__lock)
+
+static __inline void __libc_lock(volatile atomic_flag *lock)
+{
+ while (atomic_flag_test_and_set_explicit(lock, memory_order_acquire)) {
+ unsigned int spins = 1;
+ do {
+ for (unsigned int i = 0; i < spins; i++)
+ __asm__ volatile("pause");
+ if (spins < 64)
+ spins *= 2;
+ } while (atomic_flag_test_and_set_explicit(
+ lock, memory_order_relaxed));
+ }
+}
+
+#endif