Fix detection of spin locks supported. Clean up how we handle falling back to mutex if spinlocks aren't supported.

pull/218/head
Victor Julien 12 years ago
parent df3d10865a
commit 389c48f222

@ -27,6 +27,15 @@
#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"
@ -313,19 +322,19 @@ extern __thread uint64_t mutex_lock_cnt;
#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); \
@ -420,7 +429,9 @@ extern __thread uint64_t mutex_lock_cnt;
#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;
@ -452,18 +463,21 @@ extern __thread uint64_t spin_lock_cnt;
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 */
/*

Loading…
Cancel
Save