Correct the pthread mutex priority inheritance default setting

After pthread mutexes changed to nxmutex, the priority inheritance
was set on by default; even if one tried to control it with
CONFIG_PTHREAD_MUTEX_DEFAULT_PRIO_INHERIT.

Also the CONFIG_PTHREAD_MUTEX_DEFAULT_PRIO_PROTECT is not effective.

Fix this by setting the default mutex priority adjustment flags according
to CONFIG_PTHREAD_MUTEX_DEFAULT_PRIO_INHERIT and CONFIG_PTHREAD_MUTEX_DEFAULT_PRIO_PROTECT.

Signed-off-by: Jukka Laitinen <jukka.laitinen@tii.ae>
This commit is contained in:
Jukka Laitinen
2025-03-25 13:21:49 +02:00
committed by Xiang Xiao
parent d7681cc815
commit 06d00b4c88
3 changed files with 42 additions and 12 deletions
+27 -6
View File
@@ -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
+1 -1
View File
@@ -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"
+14 -5
View File
@@ -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;