diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/spinlock.h | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/lib/spinlock.h b/lib/spinlock.h new file mode 100644 index 0000000..75af28a --- /dev/null +++ b/lib/spinlock.h @@ -0,0 +1,27 @@ +#ifndef JOVE_LIB_SPINLOCK_H +#define JOVE_LIB_SPINLOCK_H 1 + +#include <stdatomic.h> + +typedef struct Spinlock +{ + atomic_flag flg; + + const char *locker_file; + const char *locker_func; + int locker_line; +} spinlock_t; + +#define spinlock_acquire(lock) \ + while(atomic_flag_test_and_set_explicit(&lock.flg, memory_order_acquire)) \ + __builtin_ia32_pause(); \ + lock.locker_file = __FILE__; \ + lock.locker_func = __FUNCTION__; \ + lock.locker_line = __LINE__ + +#define spinlock_release(lock) \ + atomic_flag_clear_explicit(&lock.flg, memory_order_release); \ + lock.locker_file = lock.locker_func = NULL; \ + lock.locker_line = -1 + +#endif |