diff --git a/include/pthread.h b/include/pthread.h index 38fce8d09c5..fa91c86241c 100644 --- a/include/pthread.h +++ b/include/pthread.h @@ -333,25 +333,46 @@ typedef struct pthread_mutex_s pthread_mutex_t; # endif #endif +#ifdef CONFIG_PTHREAD_MUTEX_DEFAULT_PRIO_INHERIT +# define PTHREAD_MUTEX_DEFAULT_PRIO_INHERIT SEM_PRIO_INHERIT +#else +# define PTHREAD_MUTEX_DEFAULT_PRIO_INHERIT 0 +#endif + +#ifdef CONFIG_PTHREAD_MUTEX_DEFAULT_PRIO_PROTECT +# define PTHREAD_MUTEX_DEFAULT_PRIO_PROTECT SEM_PRIO_PROTECT +#else +# define PTHREAD_MUTEX_DEFAULT_PRIO_PROTECT 0 +#endif + +#define PTHREAD_MUTEX_DEFAULT_PRIO_FLAGS (PTHREAD_MUTEX_DEFAULT_PRIO_INHERIT | \ + PTHREAD_MUTEX_DEFAULT_PRIO_PROTECT) + +#define PTHREAD_NXMUTEX_INITIALIZER { \ + NXSEM_INITIALIZER(1, SEM_TYPE_MUTEX | PTHREAD_MUTEX_DEFAULT_PRIO_FLAGS), \ + NXMUTEX_NO_HOLDER} +#define PTHREAD_NXRMUTEX_INITIALIZER {PTHREAD_NXMUTEX_INITIALIZER, 0} + #if defined(CONFIG_PTHREAD_MUTEX_TYPES) && !defined(CONFIG_PTHREAD_MUTEX_UNSAFE) # define PTHREAD_MUTEX_INITIALIZER {NULL, __PTHREAD_MUTEX_DEFAULT_FLAGS, \ PTHREAD_MUTEX_DEFAULT, \ - NXRMUTEX_INITIALIZER} + PTHREAD_NXRMUTEX_INITIALIZER} + # define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \ {NULL, __PTHREAD_MUTEX_DEFAULT_FLAGS, \ PTHREAD_MUTEX_RECURSIVE, \ - NXRMUTEX_INITIALIZER,} + PTHREAD_NXRMUTEX_INITIALIZER,} #elif defined(CONFIG_PTHREAD_MUTEX_TYPES) # define PTHREAD_MUTEX_INITIALIZER {PTHREAD_MUTEX_DEFAULT, \ - NXRMUTEX_INITIALIZER,} + PTHREAD_NXRMUTEX_INITIALIZER,} # define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \ {PTHREAD_MUTEX_RECURSIVE, \ - NXRMUTEX_INITIALIZER} + PTHREAD_NXRMUTEX_INITIALIZER} #elif !defined(CONFIG_PTHREAD_MUTEX_UNSAFE) # define PTHREAD_MUTEX_INITIALIZER {NULL, __PTHREAD_MUTEX_DEFAULT_FLAGS,\ - NXMUTEX_INITIALIZER} + PTHREAD_NXMUTEX_INITIALIZER} #else -# define PTHREAD_MUTEX_INITIALIZER {NXMUTEX_INITIALIZER} +# define PTHREAD_MUTEX_INITIALIZER {PTHREAD_NXMUTEX_INITIALIZER} #endif struct pthread_barrierattr_s diff --git a/sched/Kconfig b/sched/Kconfig index bdb64a65990..07b616d7944 100644 --- a/sched/Kconfig +++ b/sched/Kconfig @@ -879,7 +879,7 @@ endchoice # Default NORMAL mutex robustness choice prompt "Default pthread mutex protocol" - default PTHREAD_MUTEX_DEFAULT_PRIO_NONE + default PTHREAD_MUTEX_DEFAULT_PRIO_INHERIT config PTHREAD_MUTEX_DEFAULT_PRIO_NONE bool "PTHREAD_PRIO_NONE default" diff --git a/sched/pthread/pthread_mutexinit.c b/sched/pthread/pthread_mutexinit.c index cdf572a5055..02e3ab9fcdd 100644 --- a/sched/pthread/pthread_mutexinit.c +++ b/sched/pthread/pthread_mutexinit.c @@ -77,15 +77,15 @@ int pthread_mutex_init(FAR pthread_mutex_t *mutex, /* Were attributes specified? If so, use them */ #ifdef CONFIG_PTHREAD_MUTEX_TYPES - mutex->type = attr ? attr->type : PTHREAD_MUTEX_DEFAULT; + mutex->type = attr ? attr->type : PTHREAD_MUTEX_DEFAULT; #endif #ifndef CONFIG_PTHREAD_MUTEX_UNSAFE - mutex->flink = NULL; + mutex->flink = NULL; # ifdef CONFIG_PTHREAD_MUTEX_BOTH - mutex->flags = attr && attr->robust == PTHREAD_MUTEX_ROBUST ? - _PTHREAD_MFLAGS_ROBUST : 0; + mutex->flags = attr && attr->robust == PTHREAD_MUTEX_ROBUST ? + _PTHREAD_MFLAGS_ROBUST : 0; # else - mutex->flags = 0; + mutex->flags = 0; # endif #endif @@ -111,6 +111,15 @@ int pthread_mutex_init(FAR pthread_mutex_t *mutex, } # endif } + else + { + /* Set the default priority inheritance and protect flags according to + * config flags. + */ + + mutex_set_protocol(&mutex->mutex, + SEM_TYPE_MUTEX | PTHREAD_MUTEX_DEFAULT_PRIO_FLAGS); + } #endif return 0;