Module: xenomai-3 Branch: next Commit: 410a4cc1109ba4e0d05b7ece7b4a5210287e1183 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=410a4cc1109ba4e0d05b7ece7b4a5210287e1183
Author: Jan Kiszka <jan.kis...@siemens.com> Date: Wed May 2 18:33:00 2018 +0200 testsuite/smokey: Add cond + pp-mutex test This stresses the case of fast-path mutex acquire plus pthread_cond_wait with that mutex, which currently triggers a bug in xnsynch_release. Along this, drop the HAVE_PTHREAD_MUTEXATTR_SETPROTOCOL conditional - libboilerplate takes care of that. Signed-off-by: Jan Kiszka <jan.kis...@siemens.com> --- testsuite/smokey/posix-cond/posix-cond.c | 96 ++++++++++++++++++++++-------- 1 file changed, 72 insertions(+), 24 deletions(-) diff --git a/testsuite/smokey/posix-cond/posix-cond.c b/testsuite/smokey/posix-cond/posix-cond.c index 6c9a458..153c645 100644 --- a/testsuite/smokey/posix-cond/posix-cond.c +++ b/testsuite/smokey/posix-cond/posix-cond.c @@ -42,27 +42,21 @@ static inline unsigned long long timer_tsc2ns(unsigned long long tsc) return clockobj_tsc_to_ns(tsc); } -static int mutex_init(pthread_mutex_t *mutex, int type, int pi) +static int mutex_init(pthread_mutex_t *mutex, int type, int proto) { pthread_mutexattr_t mattr; int err; pthread_mutexattr_init(&mattr); pthread_mutexattr_settype(&mattr, type); -#ifdef HAVE_PTHREAD_MUTEXATTR_SETPROTOCOL - if (pi != 0) - pthread_mutexattr_setprotocol(&mattr, PTHREAD_PRIO_INHERIT); - - err = pthread_mutex_init(mutex, &mattr); -#else - if (pi != 0) { - err = ENOSYS; + err = pthread_mutexattr_setprotocol(&mattr, proto); + if (err) goto out; - } - err = pthread_mutex_init(mutex, &mattr); + if (proto == PTHREAD_PRIO_PROTECT) + pthread_mutexattr_setprioceiling(&mattr, 3); + err = pthread_mutex_init(mutex, &mattr); out: -#endif pthread_mutexattr_destroy(&mattr); return -err; @@ -217,7 +211,8 @@ static void autoinit_simple_condwait(void) smokey_trace("%s", __func__); - check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, 0), 0); + check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, + PTHREAD_PRIO_NONE), 0); check("mutex_lock", mutex_lock(&mutex), 0); check("thread_spawn", thread_spawn(&cond_signaler_tid, 2, cond_signaler, &cm), 0); @@ -246,7 +241,8 @@ static void simple_condwait(void) smokey_trace("%s", __func__); - check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, 0), 0); + check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, + PTHREAD_PRIO_NONE), 0); check("cond_init", cond_init(&cond, 0), 0); check("mutex_lock", mutex_lock(&mutex), 0); check("thread_spawn", @@ -271,7 +267,8 @@ static void relative_condwait(void) smokey_trace("%s", __func__); - check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, 0), 0); + check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, + PTHREAD_PRIO_NONE), 0); check("cond_init", cond_init(&cond, 0), 0); check("mutex_lock", mutex_lock(&mutex), 0); @@ -294,7 +291,8 @@ static void autoinit_absolute_condwait(void) smokey_trace("%s", __func__); - check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, 0), 0); + check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, + PTHREAD_PRIO_NONE), 0); check("mutex_lock", mutex_lock(&mutex), 0); start = timer_get_tsc(); @@ -316,7 +314,8 @@ static void absolute_condwait(void) smokey_trace("%s", __func__); - check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, 0), 0); + check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, + PTHREAD_PRIO_NONE), 0); check("cond_init", cond_init(&cond, 1), 0); check("mutex_lock", mutex_lock(&mutex), 0); @@ -373,7 +372,8 @@ static void sig_norestart_condwait(void) smokey_trace("%s", __func__); check_unix("sigaction", sigaction(SIGRTMIN, &sa, NULL), 0); - check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, 0), 0); + check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, + PTHREAD_PRIO_NONE), 0); check("cond_init", cond_init(&cond, 0), 0); check("mutex_lock", mutex_lock(&mutex), 0); check("thread_spawn", @@ -411,7 +411,8 @@ static void sig_restart_condwait(void) smokey_trace("%s", __func__); check_unix("sigaction", sigaction(SIGRTMIN, &sa, NULL), 0); - check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, 0), 0); + check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, + PTHREAD_PRIO_NONE), 0); check("cond_init", cond_init(&cond, 0), 0); check("mutex_lock", mutex_lock(&mutex), 0); check("thread_spawn", @@ -465,7 +466,8 @@ static void sig_norestart_condwait_mutex(void) smokey_trace("%s", __func__); check_unix("sigaction", sigaction(SIGRTMIN, &sa, NULL), 0); - check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, 0), 0); + check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, + PTHREAD_PRIO_NONE), 0); check("cond_init", cond_init(&cond, 0), 0); check("mutex_lock", mutex_lock(&mutex), 0); check("thread_spawn", @@ -505,7 +507,8 @@ static void sig_restart_condwait_mutex(void) smokey_trace("%s", __func__); check_unix("sigaction", sigaction(SIGRTMIN, &sa, NULL), 0); - check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, 0), 0); + check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, + PTHREAD_PRIO_NONE), 0); check("cond_init", cond_init(&cond, 0), 0); check("mutex_lock", mutex_lock(&mutex), 0); check("thread_spawn", @@ -561,7 +564,8 @@ static void sig_norestart_double(void) smokey_trace("%s", __func__); check_unix("sigaction", sigaction(SIGRTMIN, &sa, NULL), 0); - check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, 0), 0); + check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, + PTHREAD_PRIO_NONE), 0); check("cond_init", cond_init(&cond, 0), 0); check("mutex_lock", mutex_lock(&mutex), 0); check("thread_spawn", @@ -601,7 +605,8 @@ static void sig_restart_double(void) smokey_trace("%s", __func__); check_unix("sigaction", sigaction(SIGRTMIN, &sa, NULL), 0); - check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, 0), 0); + check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, + PTHREAD_PRIO_NONE), 0); check("cond_init", cond_init(&cond, 0), 0); check("mutex_lock", mutex_lock(&mutex), 0); check("thread_spawn", @@ -657,7 +662,8 @@ static void cond_destroy_whilewait(void) smokey_trace("%s", __func__); check_unix("sigaction", sigaction(SIGRTMIN, &sa, NULL), 0); - check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, 0), 0); + check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, + PTHREAD_PRIO_NONE), 0); check("cond_init", cond_init(&cond, 0), 0); check("mutex_lock", mutex_lock(&mutex), 0); check("thread_spawn", @@ -676,6 +682,47 @@ static void cond_destroy_whilewait(void) check("cond_destroy", cond_destroy(&cond), 0); } +static void *cond_delayed_signaler(void *cookie) +{ + struct cond_mutex *cm = cookie; + + thread_msleep(10); + + check("mutex_lock", mutex_lock(cm->mutex), 0); + check("cond_signal", cond_signal(cm->cond), 0); + check("mutex_unlock", mutex_unlock(cm->mutex), 0); + + return NULL; +} + +static void cond_ppmutex(void) +{ + pthread_cond_t cond = PTHREAD_COND_INITIALIZER; + pthread_mutex_t mutex; + struct cond_mutex cm = { + .mutex = &mutex, + .cond = &cond, + }; + pthread_t cond_signaler_tid; + + smokey_trace("%s", __func__); + + check("mutex_init", mutex_init(&mutex, PTHREAD_MUTEX_DEFAULT, + PTHREAD_PRIO_PROTECT), 0); + check("thread_spawn", + thread_spawn(&cond_signaler_tid, 3, cond_delayed_signaler, + &cm), 0); + + thread_msleep(1); + check("mutex_lock", mutex_lock(&mutex), 0); + + check("cond_wait", cond_wait(&cond, &mutex, 0), 0); + check("mutex_unlock", mutex_unlock(&mutex), 0); + check("thread_join", thread_join(cond_signaler_tid), 0); + check("mutex_destroy", mutex_destroy(&mutex), 0); + check("cond_destroy", cond_destroy(&cond), 0); +} + int run_posix_cond(struct smokey_test *t, int argc, char *const argv[]) { struct sched_param sparam; @@ -696,6 +743,7 @@ int run_posix_cond(struct smokey_test *t, int argc, char *const argv[]) sig_norestart_double(); sig_restart_double(); cond_destroy_whilewait(); + cond_ppmutex(); return 0; } _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git