diff --git a/modules/libcom/src/env/envDefs.h b/modules/libcom/src/env/envDefs.h index 3bf64c861..159154b99 100644 --- a/modules/libcom/src/env/envDefs.h +++ b/modules/libcom/src/env/envDefs.h @@ -76,6 +76,7 @@ LIBCOM_API extern const ENV_PARAM EPICS_IOC_LOG_FILE_COMMAND; LIBCOM_API extern const ENV_PARAM IOCSH_PS1; LIBCOM_API extern const ENV_PARAM IOCSH_HISTSIZE; LIBCOM_API extern const ENV_PARAM IOCSH_HISTEDIT_DISABLE; +LIBCOM_API extern const ENV_PARAM EPICS_MUTEX_USE_PRIORITY_INHERITANCE; LIBCOM_API extern const ENV_PARAM *env_param_list[]; struct in_addr; diff --git a/modules/libcom/src/osi/os/posix/osdMutex.c b/modules/libcom/src/osi/os/posix/osdMutex.c index 33a9594ce..401f59395 100644 --- a/modules/libcom/src/osi/os/posix/osdMutex.c +++ b/modules/libcom/src/osi/os/posix/osdMutex.c @@ -23,6 +23,7 @@ #include #include #include +#include #define EPICS_PRIVATE_API @@ -34,6 +35,7 @@ #include "errlog.h" #include "epicsStdio.h" #include "epicsAssert.h" +#include "envDefs.h" #define checkStatus(status,message) \ if((status)) { \ @@ -69,21 +71,27 @@ static void globalAttrInit() status = pthread_mutexattr_settype(&globalAttrRecursive, PTHREAD_MUTEX_RECURSIVE); checkStatusQuit(status, "pthread_mutexattr_settype(&globalAttrRecursive, PTHREAD_MUTEX_RECURSIVE)", "globalAttrInit"); #if defined _POSIX_THREAD_PRIO_INHERIT - status = pthread_mutexattr_setprotocol(&globalAttrDefault, PTHREAD_PRIO_INHERIT); - if (errVerbose) checkStatus(status, "pthread_mutexattr_setprotocol(&globalAttrDefault, PTHREAD_PRIO_INHERIT)"); - status = pthread_mutexattr_setprotocol(&globalAttrRecursive, PTHREAD_PRIO_INHERIT); - if (errVerbose) checkStatus(status, "pthread_mutexattr_setprotocol(&globalAttrRecursive, PTHREAD_PRIO_INHERIT)"); - if (status == 0) { - /* Can we really use PTHREAD_PRIO_INHERIT? */ - pthread_mutex_t temp; - status = pthread_mutex_init(&temp, &globalAttrRecursive); - if (errVerbose) checkStatus(status, "pthread_mutex_init(&temp, &globalAttrRecursive)"); - if (status != 0) { - /* No, PTHREAD_PRIO_INHERIT does not work, fall back to PTHREAD_PRIO_NONE */; - pthread_mutexattr_setprotocol(&globalAttrDefault, PTHREAD_PRIO_NONE); - pthread_mutexattr_setprotocol(&globalAttrRecursive, PTHREAD_PRIO_NONE); - } else { - pthread_mutex_destroy(&temp); + { + const char *p = envGetConfigParamPtr(&EPICS_MUTEX_USE_PRIORITY_INHERITANCE); + char c = p ? toupper(p[0]) : 'N'; + if ( 'T' == c || 'Y' == c || '1' == c ) { + status = pthread_mutexattr_setprotocol(&globalAttrDefault, PTHREAD_PRIO_INHERIT); + if (errVerbose) checkStatus(status, "pthread_mutexattr_setprotocol(&globalAttrDefault, PTHREAD_PRIO_INHERIT)"); + status = pthread_mutexattr_setprotocol(&globalAttrRecursive, PTHREAD_PRIO_INHERIT); + if (errVerbose) checkStatus(status, "pthread_mutexattr_setprotocol(&globalAttrRecursive, PTHREAD_PRIO_INHERIT)"); + if (status == 0) { + /* Can we really use PTHREAD_PRIO_INHERIT? */ + pthread_mutex_t temp; + status = pthread_mutex_init(&temp, &globalAttrRecursive); + if (errVerbose) checkStatus(status, "pthread_mutex_init(&temp, &globalAttrRecursive)"); + if (status != 0) { + /* No, PTHREAD_PRIO_INHERIT does not work, fall back to PTHREAD_PRIO_NONE */; + pthread_mutexattr_setprotocol(&globalAttrDefault, PTHREAD_PRIO_NONE); + pthread_mutexattr_setprotocol(&globalAttrRecursive, PTHREAD_PRIO_NONE); + } else { + pthread_mutex_destroy(&temp); + } + } } } #endif