#ifndef SP_LOCK_H_ #define SP_LOCK_H_ /* * sophia database * sphia.org * * Copyright (c) Dmitry Simonenko * BSD License */ #include typedef uint8_t spspinlock; #if defined(__x86_64__) || defined(__i386) || defined(_X86_) # define CPU_PAUSE __asm__ ("pause") #else # define CPU_PAUSE do { } while(0) #endif static inline void sp_lockinit(volatile spspinlock *l) { *l = 0; } static inline void sp_lockfree(volatile spspinlock *l) { *l = 0; } static inline void sp_lock(volatile spspinlock *l) { if (__sync_lock_test_and_set(l, 1) != 0) { unsigned int spin_count = 0U; for (;;) { CPU_PAUSE; if (*l == 0U && __sync_lock_test_and_set(l, 1) == 0) break; if (++spin_count > 100U) usleep(0); } } } static inline void sp_unlock(volatile spspinlock *l) { __sync_lock_release(l); } #if 0 #include typedef pthread_spinlock_t spspinlock; static inline void sp_lockinit(volatile spspinlock *l) { pthread_spin_init(l, 0); } static inline void sp_lockfree(volatile spspinlock *l) { pthread_spin_destroy(l); } static inline void sp_lock(volatile spspinlock *l) { pthread_spin_lock(l); } static inline void sp_unlock(volatile spspinlock *l) { pthread_spin_unlock(l); } #endif #endif