|
|
commit c6eccf6137fae2c2f158af6bdc393d70d832b9e9
Author: Albrecht Schlosser <albrechts.fltk@online.de>
AuthorDate: Wed Jul 21 12:12:26 2021 +0200
Commit: Albrecht Schlosser <albrechts.fltk@online.de>
CommitDate: Wed Jul 21 12:16:20 2021 +0200
Call pthread's recursive mutex on Linux (Issue #245)
Add CMake test for PTHREAD_MUTEX_RECURSIVE
Add autoconf/configure compile test for PTHREAD_MUTEX_RECURSIVE
Replace "#ifdef PTHREAD_MUTEX_RECURSIVE"
with "#ifdef HAVE_PTHREAD_MUTEX_RECURSIVE"
and define HAVE_PTHREAD_MUTEX_RECURSIVE in config.h
CMake/pthread_mutex_recursive.c | 7 +++++++
CMake/resources.cmake | 14 +++++++++++++-
configh.cmake.in | 6 ++++++
configh.in | 6 ++++++
configure.ac | 18 ++++++++++++++++++
src/drivers/Posix/Fl_Posix_System_Driver.cxx | 14 +++++++-------
6 files changed, 57 insertions(+), 8 deletions(-)
diff --git CMake/pthread_mutex_recursive.c CMake/pthread_mutex_recursive.c
new file mode 100644
index 0000000..2a05882
--- /dev/null
+++ CMake/pthread_mutex_recursive.c
@@ -0,0 +1,7 @@
+/*
+ FLTK feature test: do we have PTHREAD_MUTEX_RECURSIVE ?
+*/
+#include <pthread.h>
+int main() {
+ return PTHREAD_MUTEX_RECURSIVE;
+}
diff --git CMake/resources.cmake CMake/resources.cmake
index 57173f2..7ea839d 100644
--- CMake/resources.cmake
+++ CMake/resources.cmake
@@ -71,6 +71,17 @@ else ()
fl_find_header (HAVE_PTHREAD_H pthread.h)
endif (WIN32 AND NOT CYGWIN)
+# Do we have PTHREAD_MUTEX_RECURSIVE ?
+
+if (HAVE_PTHREAD_H)
+ try_compile(HAVE_PTHREAD_MUTEX_RECURSIVE
+ ${CMAKE_CURRENT_BINARY_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/CMake/pthread_mutex_recursive.c
+ )
+else ()
+ set (HAVE_PTHREAD_MUTEX_RECURSIVE 0)
+endif ()
+
# Special case for Microsoft Visual Studio generator (MSVC):
#
# The header files <GL/glu.h> and <locale.h> are located in the SDK's
@@ -139,7 +150,8 @@ endif (NOT HAVE_DIRENT_H)
mark_as_advanced (HAVE_ALSA_ASOUNDLIB_H HAVE_DIRENT_H HAVE_DLFCN_H)
mark_as_advanced (HAVE_GL_GLU_H)
mark_as_advanced (HAVE_LIBPNG_PNG_H HAVE_LOCALE_H HAVE_NDIR_H)
-mark_as_advanced (HAVE_OPENGL_GLU_H HAVE_PNG_H HAVE_PTHREAD_H)
+mark_as_advanced (HAVE_OPENGL_GLU_H HAVE_PNG_H)
+mark_as_advanced (HAVE_PTHREAD_H HAVE_PTHREAD_MUTEX_RECURSIVE)
mark_as_advanced (HAVE_STDIO_H HAVE_STRINGS_H HAVE_SYS_DIR_H)
mark_as_advanced (HAVE_SYS_NDIR_H HAVE_SYS_SELECT_H)
mark_as_advanced (HAVE_SYS_STDTYPES_H HAVE_XDBE_H)
diff --git configh.cmake.in configh.cmake.in
index 9bb7231..61bcfdb 100644
--- configh.cmake.in
+++ configh.cmake.in
@@ -345,6 +345,12 @@
#cmakedefine HAVE_PTHREAD_H 1
/*
+ * Do we have PTHREAD_MUTEX_RECURSIVE?
+ */
+
+#cmakedefine HAVE_PTHREAD_MUTEX_RECURSIVE 1
+
+/*
* Do we have the ALSA library?
*/
diff --git configh.in configh.in
index 46121b2..8dc3448 100644
--- configh.in
+++ configh.in
@@ -345,6 +345,12 @@
#undef HAVE_PTHREAD_H
/*
+ * Do we have PTHREAD_MUTEX_RECURSIVE?
+ */
+
+#undef HAVE_PTHREAD_MUTEX_RECURSIVE
+
+/*
* Do we have the ALSA library?
*/
diff --git configure.ac configure.ac
index 0543c45..68ca0a5 100644
--- configure.ac
+++ configure.ac
@@ -870,10 +870,28 @@ AS_IF([test "x$enable_threads" != xno -a x$check_pthread = xyes], [
])
])
done
+
+ dnl Check if we have PTHREAD_MUTEX_RECURSIVE
+ AC_CACHE_CHECK([whether we have PTHREAD_MUTEX_RECURSIVE], ac_cv_pthread_mutex_recursive,[
+ AC_LANG_PUSH([C])
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#include <pthread.h>
+ ]], [[
+ return PTHREAD_MUTEX_RECURSIVE;
+ ]])],
+ [ac_cv_pthread_mutex_recursive=yes],
+ [ac_cv_pthread_mutex_recursive=no])
+ AC_LANG_POP([])
+ ])
+ AS_IF([test x$ac_cv_pthread_mutex_recursive = xyes], [
+ AC_DEFINE([HAVE_PTHREAD_MUTEX_RECURSIVE])
+ ])
])
])
AC_SUBST([PTHREAD_FLAGS])
+AC_SUBST([HAVE_PTHREAD_MUTEX_RECURSIVE])
dnl Define OS-specific stuff...
diff --git src/drivers/Posix/Fl_Posix_System_Driver.cxx src/drivers/Posix/Fl_Posix_System_Driver.cxx
index 68ae758..b1a3023 100644
--- src/drivers/Posix/Fl_Posix_System_Driver.cxx
+++ src/drivers/Posix/Fl_Posix_System_Driver.cxx
@@ -193,7 +193,7 @@ static void* quadruple_dlopen(const char *libname)
}
return ptr;
}
-#endif
+#endif // HAVE_DLSYM && HAVE_DLFCN_H && !defined (__APPLE_CC__)
/**
@@ -332,7 +332,7 @@ static void unlock_function_std() {
if (!--counter) pthread_mutex_unlock(&fltk_mutex);
}
-# ifdef PTHREAD_MUTEX_RECURSIVE
+# ifdef HAVE_PTHREAD_MUTEX_RECURSIVE
static bool lock_function_init_rec() {
pthread_mutexattr_t attrib;
pthread_mutexattr_init(&attrib);
@@ -352,7 +352,7 @@ static void lock_function_rec() {
static void unlock_function_rec() {
pthread_mutex_unlock(&fltk_mutex);
}
-# endif // PTHREAD_MUTEX_RECURSIVE
+# endif // HAVE_PTHREAD_MUTEX_RECURSIVE
void Fl_Posix_System_Driver::awake(void* msg) {
if (thread_filedes[1]) {
@@ -402,18 +402,18 @@ int Fl_Posix_System_Driver::lock() {
// Set lock/unlock functions for this system, using a system-supplied
// recursive mutex if supported...
-# ifdef PTHREAD_MUTEX_RECURSIVE
+# ifdef HAVE_PTHREAD_MUTEX_RECURSIVE
if (!lock_function_init_rec()) {
fl_lock_function = lock_function_rec;
fl_unlock_function = unlock_function_rec;
} else {
-# endif // PTHREAD_MUTEX_RECURSIVE
+# endif // HAVE_PTHREAD_MUTEX_RECURSIVE
lock_function_init_std();
fl_lock_function = lock_function_std;
fl_unlock_function = unlock_function_std;
-# ifdef PTHREAD_MUTEX_RECURSIVE
+# ifdef HAVE_PTHREAD_MUTEX_RECURSIVE
}
-# endif // PTHREAD_MUTEX_RECURSIVE
+# endif // HAVE_PTHREAD_MUTEX_RECURSIVE
}
fl_lock_function();
[ Direct Link to Message ] | |
|
| |