#ifndef __THREADS_H__
#define __THREADS_H__
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+/* need this for the _POSIX_SPIN_LOCKS define */
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
#ifdef PROFILING
#include "util-cpu.h"
#include "util-profiling-locks.h"
#endif
/** Spinlocks */
-#define SCSpinlock pthread_spinlock_t
/** If posix spin not supported, use mutex */
#if ((_POSIX_SPIN_LOCKS - 200112L) < 0L) || defined HELGRIND
-#define pthread_spinlock_t pthread_mutex_t
-#define pthread_spin_init(target,arg) SCMutexInit(target, NULL)
-#define pthread_spin_lock(spin) SCMutexLock(spin)
-#define pthread_spin_trylock(spin) SCMutexTrylock(spin)
-#define pthread_spin_unlock(spin) SCMutexUnlock(spin)
-#define pthread_spin_destroy(spin) SCMutexDestroy(spin)
-#endif /* End Spin not supported */
+#define SCSpinlock SCMutex
+#define SCSpinLock(spin) SCMutexLock((spin))
+#define SCSpinTrylock(spin) SCMutexTrylock((spin))
+#define SCSpinUnlock(spin) SCMutexUnlock((spin))
+#define SCSpinInit(spin, spin_attr) SCMutexInit((spin), NULL)
+#define SCSpinDestroy(spin) SCMutexDestroy((spin))
+
+#elif defined DBG_THREADS
+#define SCSpinlock pthread_spinlock_t
-#ifdef DBG_THREADS
#define SCSpinLock_dbg(spin) ({ \
printf("%16s(%s:%d): (thread:%"PRIuMAX") locking spin %p\n", __FUNCTION__, __FILE__, __LINE__, (uintmax_t)pthread_self(), spin); \
int ret = pthread_spin_lock(spin); \
#define SCSpinUnlock SCSpinUnlock_dbg
#define SCSpinInit SCSpinInit_dbg
#define SCSpinDestroy SCSpinDestroy_dbg
+
#elif defined PROFILE_LOCKING
+#define SCSpinlock pthread_spinlock_t
extern __thread uint64_t spin_lock_contention;
extern __thread uint64_t spin_lock_wait_ticks;
retl; \
})
-#define SCSpinLock(mut) SCSpinLock_profile(mut)
+#define SCSpinLock(mut) SCSpinLock_profile(mut)
#define SCSpinTrylock(spin) pthread_spin_trylock(spin)
#define SCSpinUnlock(spin) pthread_spin_unlock(spin)
#define SCSpinInit(spin, spin_attr) pthread_spin_init(spin, spin_attr)
#define SCSpinDestroy(spin) pthread_spin_destroy(spin)
#else /* if no dbg threads defined... */
+
+#define SCSpinlock pthread_spinlock_t
#define SCSpinLock(spin) pthread_spin_lock(spin)
#define SCSpinTrylock(spin) pthread_spin_trylock(spin)
#define SCSpinUnlock(spin) pthread_spin_unlock(spin)
#define SCSpinInit(spin, spin_attr) pthread_spin_init(spin, spin_attr)
#define SCSpinDestroy(spin) pthread_spin_destroy(spin)
+
#endif /* DBG_THREADS */
/*