Skip to content

Commit

Permalink
Add feature test macro to enable pthread_mutexattr_settype()
Browse files Browse the repository at this point in the history
Signed-off-by: Joseph Schuchart <[email protected]>
  • Loading branch information
devreal committed Jul 10, 2024
1 parent 7e14e2b commit 7530ec7
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 34 deletions.
40 changes: 40 additions & 0 deletions opal/mca/threads/pthreads/threads_pthreads_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@
* $HEADER$
*/

/* needed for pthread_mutexattr_settype */
#define _GNU_SOURCE

#include <unistd.h>
#include <pthread.h>

#include "opal/constants.h"
#include "opal/mca/threads/threads.h"
Expand All @@ -38,3 +42,39 @@ int opal_tsd_key_create(opal_tsd_key_t *key, opal_tsd_destructor_t destructor)
rc = pthread_key_create(key, destructor);
return 0 == rc ? OPAL_SUCCESS : OPAL_ERR_IN_ERRNO;
}


int opal_thread_internal_mutex_init_recursive(opal_thread_internal_mutex_t *p_mutex)
{
int ret;
#if OPAL_ENABLE_DEBUG
pthread_mutexattr_t mutex_attr;
ret = pthread_mutexattr_init(&mutex_attr);
if (0 != ret)
return OPAL_ERR_IN_ERRNO;
ret = pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE);
if (0 != ret) {
ret = pthread_mutexattr_destroy(&mutex_attr);
assert(0 == ret);
return OPAL_ERR_IN_ERRNO;
}
ret = pthread_mutex_init(p_mutex, &mutex_attr);
if (0 != ret) {
ret = pthread_mutexattr_destroy(&mutex_attr);
assert(0 == ret);
return OPAL_ERR_IN_ERRNO;
}
ret = pthread_mutexattr_destroy(&mutex_attr);
assert(0 == ret);
#else
pthread_mutexattr_t mutex_attr;
ret = pthread_mutexattr_init(&mutex_attr);
if (0 != ret) {
return OPAL_ERR_IN_ERRNO;
}
pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE);
ret = pthread_mutex_init(p_mutex, &mutex_attr);
pthread_mutexattr_destroy(&mutex_attr);
#endif
return 0 == ret ? OPAL_SUCCESS : OPAL_ERR_IN_ERRNO;
}
39 changes: 5 additions & 34 deletions opal/mca/threads/pthreads/threads_pthreads_mutex.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,48 +61,19 @@ typedef pthread_mutex_t opal_thread_internal_mutex_t;
# define OPAL_THREAD_INTERNAL_RECURSIVE_MUTEX_INITIALIZER PTHREAD_RECURSIVE_MUTEX_INITIALIZER
#endif


int opal_thread_internal_mutex_init_recursive(opal_thread_internal_mutex_t *p_mutex);

static inline int opal_thread_internal_mutex_init(opal_thread_internal_mutex_t *p_mutex,
bool recursive)
{
int ret;
#if OPAL_ENABLE_DEBUG
if (recursive) {
pthread_mutexattr_t mutex_attr;
ret = pthread_mutexattr_init(&mutex_attr);
if (0 != ret)
return OPAL_ERR_IN_ERRNO;
ret = pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE);
if (0 != ret) {
ret = pthread_mutexattr_destroy(&mutex_attr);
assert(0 == ret);
return OPAL_ERR_IN_ERRNO;
}
ret = pthread_mutex_init(p_mutex, &mutex_attr);
if (0 != ret) {
ret = pthread_mutexattr_destroy(&mutex_attr);
assert(0 == ret);
return OPAL_ERR_IN_ERRNO;
}
ret = pthread_mutexattr_destroy(&mutex_attr);
assert(0 == ret);
} else {
ret = pthread_mutex_init(p_mutex, NULL);
}
#else
if (recursive) {
pthread_mutexattr_t mutex_attr;
ret = pthread_mutexattr_init(&mutex_attr);
if (0 != ret) {
return OPAL_ERR_IN_ERRNO;
}
pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE);
ret = pthread_mutex_init(p_mutex, &mutex_attr);
pthread_mutexattr_destroy(&mutex_attr);
return opal_thread_internal_mutex_init_recursive(p_mutex);
} else {
ret = pthread_mutex_init(p_mutex, NULL);
return 0 == ret ? OPAL_SUCCESS : OPAL_ERR_IN_ERRNO;
}
#endif
return 0 == ret ? OPAL_SUCCESS : OPAL_ERR_IN_ERRNO;
}

static inline void opal_thread_internal_mutex_lock(opal_thread_internal_mutex_t *p_mutex)
Expand Down

0 comments on commit 7530ec7

Please sign in to comment.