From a0b3124f80f5696cbf070b3b714533ab4012398d Mon Sep 17 00:00:00 2001
From: James Le Cuirot <chewi@gentoo.org>
Date: Tue, 10 Mar 2020 21:10:48 +0000
Subject: [PATCH] Use -pthread flag and simplify pthread build logic

Sometimes -lpthread is not enough. This has caused build failures on
Gentoo Linux in the past.

The logic also seems needlessly complex. We check for HAVE_PTHREAD on
UNIX platforms even though CMake errors out if pthreads are not
found. Similarly, we have a fallback for HAVE_PTHREAD_SIGNAL being
false even though we always set it to true.
---
 CMakeLists.txt                             | 11 ++++-------
 res/config.h.in                            |  6 ------
 src/lib/arch/Arch.h                        |  4 +---
 src/lib/arch/unix/ArchMultithreadPosix.cpp | 13 -------------
 4 files changed, 5 insertions(+), 29 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8e10776e..ae7ccb21 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -123,12 +123,10 @@ if (UNIX)
     check_type_size (short SIZEOF_SHORT)
 
     # pthread is used on both Linux and Mac
-    check_library_exists ("pthread" pthread_create "" HAVE_PTHREAD)
-    if (HAVE_PTHREAD)
-        list (APPEND libs pthread)
-    else()
-        message (FATAL_ERROR "Missing library: pthread")
-    endif()
+    set (CMAKE_THREAD_PREFER_PTHREAD TRUE)
+    set (THREADS_PREFER_PTHREAD_FLAG TRUE)
+    find_package (Threads REQUIRED)
+    list (APPEND libs Threads::Threads)
 
     # curl is used on both Linux and Mac
     find_package (CURL)
@@ -269,7 +267,6 @@ if (UNIX)
     set (HAVE_CXX_EXCEPTIONS 1)
     set (HAVE_CXX_MUTABLE 1)
     set (HAVE_CXX_STDLIB 1)
-    set (HAVE_PTHREAD_SIGNAL 1)
     set (SELECT_TYPE_ARG1 int)
     set (SELECT_TYPE_ARG234 " (fd_set *)")
     set (SELECT_TYPE_ARG5 " (struct timeval *)")
diff --git a/res/config.h.in b/res/config.h.in
index f3a72449..2bd3b3bf 100644
--- a/res/config.h.in
+++ b/res/config.h.in
@@ -55,12 +55,6 @@
 /* Define if you have a POSIX `sigwait` function. */
 #cmakedefine HAVE_POSIX_SIGWAIT ${HAVE_POSIX_SIGWAIT}
 
-/* Define if you have POSIX threads libraries and header files. */
-#cmakedefine HAVE_PTHREAD ${HAVE_PTHREAD}
-
-/* Define if you have `pthread_sigmask` and `pthread_kill` functions. */
-#cmakedefine HAVE_PTHREAD_SIGNAL ${HAVE_PTHREAD_SIGNAL}
-
 /* Define if your compiler defines socklen_t. */
 #cmakedefine HAVE_SOCKLEN_T ${HAVE_SOCKLEN_T}
 
diff --git a/src/lib/arch/Arch.h b/src/lib/arch/Arch.h
index c062d6f3..940a2e3a 100644
--- a/src/lib/arch/Arch.h
+++ b/src/lib/arch/Arch.h
@@ -54,9 +54,7 @@
 #    include "arch/unix/ArchConsoleUnix.h"
 #    include "arch/unix/ArchDaemonUnix.h"
 #    include "arch/unix/ArchLogUnix.h"
-#    if HAVE_PTHREAD
-#        include "arch/unix/ArchMultithreadPosix.h"
-#    endif
+#    include "arch/unix/ArchMultithreadPosix.h"
 #    include "arch/unix/ArchNetworkBSD.h"
 #    include "arch/unix/ArchSleepUnix.h"
 #    include "arch/unix/ArchStringUnix.h"
diff --git a/src/lib/arch/unix/ArchMultithreadPosix.cpp b/src/lib/arch/unix/ArchMultithreadPosix.cpp
index c9ddc6ce..4866edce 100644
--- a/src/lib/arch/unix/ArchMultithreadPosix.cpp
+++ b/src/lib/arch/unix/ArchMultithreadPosix.cpp
@@ -36,17 +36,6 @@
 
 #define SIGWAKEUP SIGUSR1
 
-#if !HAVE_PTHREAD_SIGNAL
-    // boy, is this platform broken.  forget about pthread signal
-    // handling and let signals through to every process.  barrier
-    // will not terminate cleanly when it gets SIGTERM or SIGINT.
-#    define pthread_sigmask sigprocmask
-#    define pthread_kill(tid_, sig_) kill(0, (sig_))
-#    define sigwait(set_, sig_)
-#    undef HAVE_POSIX_SIGWAIT
-#    define HAVE_POSIX_SIGWAIT 1
-#endif
-
 static
 void
 setSignalSet(sigset_t* sigset)
@@ -344,9 +333,7 @@ ArchMultithreadPosix::newThread(ThreadFunc func, void* data)
     // can't tell the difference.
     if (!m_newThreadCalled) {
         m_newThreadCalled = true;
-#if HAVE_PTHREAD_SIGNAL
         startSignalHandler();
-#endif
     }
 
     // note that the child thread will wait until we release this mutex
-- 
2.24.1

