From 4ed5892afa1fbacb63f4c258aa182a17f76bed28 Mon Sep 17 00:00:00 2001
From: Vasiliy Soshnikov <dedok.mad@gmail.com>
Date: Thu, 27 Nov 2014 02:13:19 +0300
Subject: [PATCH] #638, checking/configuring in cmake pthread_yield and
 sched_yield; READLINE_ROOT for better readline control;

---
 CMakeLists.txt            |  3 +++
 cmake/FindReadline.cmake  | 17 +++++++++++++++--
 src/lib/small/quota.h     |  1 +
 src/trivia/config.h.cmake |  2 ++
 test/unit/quota.cc        | 16 +++++++++++++---
 5 files changed, 34 insertions(+), 5 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index e4f7b31e40..205f305a6e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -69,6 +69,9 @@ check_include_file(sys/prctl.h HAVE_PRCTL_H)
 
 check_symbol_exists(O_DSYNC fcntl.h HAVE_O_DSYNC)
 check_symbol_exists(fdatasync unistd.h HAVE_FDATASYNC)
+check_symbol_exists(pthread_yield pthread.h HAVE_PTHREAD_YIELD)
+check_symbol_exists(sched_yield sched.h HAVE_SCHED_YIELD)
+
 check_function_exists(memmem HAVE_MEMMEM)
 check_function_exists(memrchr HAVE_MEMRCHR)
 check_function_exists(sendfile HAVE_SENDFILE)
diff --git a/cmake/FindReadline.cmake b/cmake/FindReadline.cmake
index 10aad97f74..3aa742e0e1 100644
--- a/cmake/FindReadline.cmake
+++ b/cmake/FindReadline.cmake
@@ -7,8 +7,21 @@
 #
 include(FindTermcap)
 
-FIND_LIBRARY(READLINE_READLINE_LIBRARY NAMES readline)
-FIND_PATH(READLINE_INCLUDE_DIR readline/readline.h)
+if (DEFINED READLINE_ROOT)
+  set(_FIND_OPTS NO_CMAKE NO_CMAKE_SYSTEM_PATH)
+  FIND_LIBRARY(READLINE_READLINE_LIBRARY
+    NAMES readline
+    HINTS ${READLINE_ROOT}/lib
+    ${_FIND_OPTS})
+  FIND_PATH(READLINE_INCLUDE_DIR
+    NAMES readline/readline.h
+    HINTS ${READLINE_ROOT}/include
+    ${_FIND_OPTS})
+else()
+  FIND_LIBRARY(READLINE_READLINE_LIBRARY NAMES readline)
+  FIND_PATH(READLINE_INCLUDE_DIR readline/readline.h)
+endif()
+
 SET(READLINE_FOUND FALSE)
 
 IF (READLINE_READLINE_LIBRARY AND READLINE_INCLUDE_DIR)
diff --git a/src/lib/small/quota.h b/src/lib/small/quota.h
index 260578e7de..70ceb8407f 100644
--- a/src/lib/small/quota.h
+++ b/src/lib/small/quota.h
@@ -32,6 +32,7 @@
 #include <stdlib.h>
 #include <stdint.h>
 #include <assert.h>
+#include <unistd.h>
 
 #if defined(__cplusplus)
 extern "C" {
diff --git a/src/trivia/config.h.cmake b/src/trivia/config.h.cmake
index e04b7cb4b6..7c80772836 100644
--- a/src/trivia/config.h.cmake
+++ b/src/trivia/config.h.cmake
@@ -127,6 +127,8 @@
 #cmakedefine ENABLE_BUNDLED_LIBEIO 1
 #cmakedefine ENABLE_BUNDLED_LIBCORO 1
 
+#cmakedefine HAVE_PTHREAD_YIELD 1
+#cmakedefine HAVE_SCHED_YIELD 1
 
 #cmakedefine HAVE_PRCTL_H 1
 
diff --git a/test/unit/quota.cc b/test/unit/quota.cc
index 0f66a391bf..d76bff6896 100644
--- a/test/unit/quota.cc
+++ b/test/unit/quota.cc
@@ -1,6 +1,7 @@
 #include "small/quota.h"
 
 #include <pthread.h>
+
 #include "test.h"
 
 struct quota quota;
@@ -18,6 +19,15 @@ struct thread_data {
 pthread_t threads[THREAD_CNT];
 thread_data datum[THREAD_CNT];
 
+static inline void do_yield()
+{
+#ifdef HAVE_PTHREAD_YIELD
+  pthread_yield();
+#elif HAVE_SCHED_YIELD
+  sched_yield()
+#endif
+}
+
 void *thread_routine(void *vparam)
 {
 	struct thread_data *data = (struct thread_data *)vparam;
@@ -32,7 +42,7 @@ void *thread_routine(void *vparam)
 		}
 		ssize_t max = rand() % QUOTA_MAX;
 		max = quota_set(&quota, max);
-		pthread_yield();
+    do_yield();
 		if (max > 0) {
 			data->last_lim_set = max;
 			data->lim_change_success++;
@@ -42,7 +52,7 @@ void *thread_routine(void *vparam)
 			allocated_size = -1;
 			data->use_change = 0;
 			data->use_change_success++;
-			pthread_yield();
+      do_yield();
 		} else {
 			allocated_size = rand() % max + 1;
 			allocated_size = quota_use(&quota, allocated_size);
@@ -50,7 +60,7 @@ void *thread_routine(void *vparam)
 				data->use_change = allocated_size;
 				data->use_change_success++;
 			}
-			pthread_yield();
+      do_yield();
 		}
 	}
 	return (void *)check_fail_count;
-- 
GitLab