From 6dbeba577f4d54255895956b510f937ec9cd4228 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Thu, 21 Nov 2019 11:44:01 +0100 Subject: [PATCH] pthread-mutex: Fix errors in C++ mode. * m4/pthread-mutex.m4 (gl_PTHREAD_MUTEX): Test whether pthread_mutexattr_getrobust exists. If not, define PTHREAD_MUTEXATTR_ROBUST_UNIMPLEMENTED. * lib/pthread-mutex.c (pthread_mutexattr_getrobust, pthread_mutexattr_setrobust): Define also if exists but PTHREAD_MUTEXATTR_ROBUST_UNIMPLEMENTED. * modules/pthread-mutex (configure.ac): Compile pthread-mutex.c also when exists but pthread_mutexattr_getrobust needs a gnulib definition. --- ChangeLog | 13 +++++++++++++ lib/pthread-mutex.c | 19 +++++++++++++++++++ m4/pthread-mutex.m4 | 29 ++++++++++++++++++++++++++++- modules/pthread-mutex | 3 ++- 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1217f31755..4d99aca6a8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2019-11-21 Bruno Haible + + pthread-mutex: Fix errors in C++ mode. + * m4/pthread-mutex.m4 (gl_PTHREAD_MUTEX): Test whether + pthread_mutexattr_getrobust exists. If not, define + PTHREAD_MUTEXATTR_ROBUST_UNIMPLEMENTED. + * lib/pthread-mutex.c (pthread_mutexattr_getrobust, + pthread_mutexattr_setrobust): Define also if exists but + PTHREAD_MUTEXATTR_ROBUST_UNIMPLEMENTED. + * modules/pthread-mutex (configure.ac): Compile pthread-mutex.c also + when exists but pthread_mutexattr_getrobust needs a gnulib + definition. + 2019-11-19 Bruno Haible threads-h tests: Fix typo. diff --git a/lib/pthread-mutex.c b/lib/pthread-mutex.c index 7a6fc1a722..96a225daee 100644 --- a/lib/pthread-mutex.c +++ b/lib/pthread-mutex.c @@ -82,6 +82,25 @@ pthread_mutexattr_destroy (pthread_mutexattr_t *attr _GL_UNUSED) return 0; } +#elif PTHREAD_MUTEXATTR_ROBUST_UNIMPLEMENTED + +int +pthread_mutexattr_getrobust (const pthread_mutexattr_t *attr, int *robustp) +{ + *robustp = PTHREAD_MUTEX_STALLED; + return 0; +} + +int +pthread_mutexattr_setrobust (pthread_mutexattr_t *attr, int robust) +{ + if (!(robust == PTHREAD_MUTEX_STALLED || robust == PTHREAD_MUTEX_ROBUST)) + return EINVAL; + if (!(robust == PTHREAD_MUTEX_STALLED)) + return ENOTSUP; + return 0; +} + #endif #if (defined _WIN32 && ! defined __CYGWIN__) && USE_WINDOWS_THREADS diff --git a/m4/pthread-mutex.m4 b/m4/pthread-mutex.m4 index c7d74f96e5..abe5f2ffd8 100644 --- a/m4/pthread-mutex.m4 +++ b/m4/pthread-mutex.m4 @@ -1,4 +1,4 @@ -# pthread-mutex.m4 serial 1 +# pthread-mutex.m4 serial 2 dnl Copyright (C) 2019 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -39,6 +39,33 @@ AC_DEFUN([gl_PTHREAD_MUTEX], dnl HAVE_PTHREAD_MUTEX_TIMEDLOCK is set in pthread_mutex_timedlock.m4. HAVE_PTHREAD_MUTEX_UNLOCK=0 HAVE_PTHREAD_MUTEX_DESTROY=0 + else + AC_CACHE_CHECK([for pthread_mutexattr_getrobust], + [gl_cv_func_pthread_mutexattr_getrobust], + [saved_LIBS="$LIBS" + LIBS="$LIBS $LIBMULTITHREAD" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [[extern + #ifdef __cplusplus + "C" + #endif + int pthread_mutexattr_getrobust (void); + int main () + { + return pthread_mutexattr_getrobust (); + } + ]])], + [gl_cv_func_pthread_mutexattr_getrobust=yes], + [gl_cv_func_pthread_mutexattr_getrobust=no]) + LIBS="$saved_LIBS" + ]) + if test $gl_cv_func_pthread_mutexattr_getrobust = no; then + HAVE_PTHREAD_MUTEXATTR_GETROBUST=0 + HAVE_PTHREAD_MUTEXATTR_SETROBUST=0 + AC_DEFINE([PTHREAD_MUTEXATTR_ROBUST_UNIMPLEMENTED], [1], + [Define if the 'robust' attribute of pthread_mutex* doesn't exist.]) + fi fi fi ]) diff --git a/modules/pthread-mutex b/modules/pthread-mutex index 8e64a9e2eb..71496b7f9c 100644 --- a/modules/pthread-mutex +++ b/modules/pthread-mutex @@ -13,7 +13,8 @@ windows-timedrecmutex [test $gl_threads_api = windows] configure.ac: gl_PTHREAD_MUTEX -if test $HAVE_PTHREAD_MUTEX_INIT = 0 || test $REPLACE_PTHREAD_MUTEX_INIT = 1; then +if test $HAVE_PTHREAD_MUTEX_INIT = 0 || test $REPLACE_PTHREAD_MUTEX_INIT = 1 \ + || test $HAVE_PTHREAD_MUTEXATTR_GETROBUST = 0 || test $REPLACE_PTHREAD_MUTEXATTR_GETROBUST = 1; then AC_LIBOBJ([pthread-mutex]) fi gl_PTHREAD_MODULE_INDICATOR([pthread-mutex]) -- 2.39.5