FLTK logo

[master] c6eccf6 - Call pthread's recursive mutex on Linux (Issue #245)

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 All Forums  |  Back to fltk.commit  ]
 
Previous Message ]Next Message ]

[master] c6eccf6 - Call pthread's recursive mutex on Linux (Issue #245) "Albrecht Schlosser" Jul 21, 2021  
 
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 ]
 
     
Previous Message ]Next Message ]
 
 

Comments are owned by the poster. All other content is copyright 1998-2024 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.