INCLUDE(CheckIncludeFiles)
INCLUDE(CheckFunctionExists)
INCLUDE(CheckSymbolExists)
+INCLUDE(CheckCSourceCompiles)
INCLUDE(CheckLibraryExists)
INCLUDE(FindPkgConfig)
CHECK_SYMBOL_EXISTS(CLOCK_PROCESS_CPUTIME_ID time.h HAVE_CLOCK_PROCESS_CPUTIME_ID)
CHECK_SYMBOL_EXISTS(CLOCK_VIRTUAL time.h HAVE_CLOCK_VIRTUAL)
+CHECK_C_SOURCE_COMPILES ("#include <sys/types.h>
+ int main (int argc, char **argv) {
+ __asm __volatile(\"pause\");
+ return 0;
+ }" HAVE_ASM_PAUSE)
+
IF(NOT HAVE_COMPATIBLE_QUEUE_H)
INCLUDE_DIRECTORIES(compat)
ENDIF(NOT HAVE_COMPATIBLE_QUEUE_H)
#cmakedefine WITH_GPERF_TOOLS 1
+#cmakedefine HAVE_ASM_PAUSE 1
+
#define RVERSION "${RSPAMD_VERSION}"
#define RSPAMD_MASTER_SITE_URL "${RSPAMD_MASTER_SITE_URL}"
/* Spin again */
g_atomic_int_set (&mutex->spin, MUTEX_SPIN_COUNT);
}
-#ifdef HAVE_NANOSLEEP
+#ifdef HAVE_ASM_PAUSE
+ __asm __volatile("pause");
+#elif defined(HAVE_SCHED_YIELD)
+ (void)sched_yield ();
+#elif defined(HAVE_NANOSLEEP)
struct timespec ts;
ts.tv_sec = 0;
ts.tv_nsec = MUTEX_SLEEP_TIME;
/* Spin */
while (nanosleep (&ts, &ts) == -1 && errno == EINTR);
-#endif
-#ifdef HAVE_SCHED_YIELD
- (void)sched_yield ();
-#endif
-#if !defined(HAVE_NANOSLEEP) && !defined(HAVE_SCHED_YIELD)
+#else
# error No methods to spin are defined
#endif
return 1;
void
memory_pool_runlock_rwlock (memory_pool_rwlock_t *lock)
{
- memory_pool_unlock_mutex (lock->__r_lock);
+ if (g_atomic_int_get (&lock->__r_lock->lock)) {
+ (void)g_atomic_int_dec_and_test (&lock->__r_lock->lock);
+ }
}
void