mirror of
https://github.com/apache/nuttx.git
synced 2026-05-20 20:44:39 +08:00
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:
committed by
Xiang Xiao
parent
d7681cc815
commit
06d00b4c88
+27
-6
@@ -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
@@ -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"
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user