[Xenomai-git] Jan Kiszka : testsuite: Add timed mutex test
Module: xenomai-jki Branch: for-upstream Commit: 766431f4982bb03708590ab3672f9f00d2754530 URL: http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=766431f4982bb03708590ab3672f9f00d2754530 Author: Jan Kiszka jan.kis...@siemens.com Date: Tue Mar 2 22:35:13 2010 +0100 testsuite: Add timed mutex test Add test for timeouts while waiting on a mutexe. At this chance, also tag the output on errors more clearly. Signed-off-by: Jan Kiszka jan.kis...@siemens.com --- src/testsuite/unit/mutex-torture.c | 133 1 files changed, 104 insertions(+), 29 deletions(-) diff --git a/src/testsuite/unit/mutex-torture.c b/src/testsuite/unit/mutex-torture.c index ebdd4f2..ebcb882 100644 --- a/src/testsuite/unit/mutex-torture.c +++ b/src/testsuite/unit/mutex-torture.c @@ -27,17 +27,18 @@ #include asm-generic/bits/current.h /* For internal use, do not use in your code. */ -#define MUTEX_CREATE 1 -#define MUTEX_LOCK 2 -#define MUTEX_TRYLOCK 3 -#define MUTEX_UNLOCK 4 -#define MUTEX_DESTROY 5 -#define COND_CREATE6 -#define COND_SIGNAL7 -#define COND_WAIT 8 -#define COND_DESTROY 9 -#define THREAD_DETACH 10 -#define THREAD_CREATE 11 +#define MUTEX_CREATE 1 +#define MUTEX_LOCK 2 +#define MUTEX_TRYLOCK 3 +#define MUTEX_TIMED_LOCK 4 +#define MUTEX_UNLOCK 5 +#define MUTEX_DESTROY 6 +#define COND_CREATE7 +#define COND_SIGNAL8 +#define COND_WAIT 9 +#define COND_DESTROY 10 +#define THREAD_DETACH 11 +#define THREAD_CREATE 12 #define NS_PER_MS 100 @@ -51,6 +52,16 @@ typedef RT_TASK thread_t; typedef RT_COND cond_t; #endif /* __NATIVE_SKIN__ */ +void timespec_add(struct timespec *ts, unsigned long long value) +{ + ts-tv_sec += value / 10; + ts-tv_nsec += value % 10; + if (ts-tv_nsec 10) { + ts-tv_sec++; + ts-tv_nsec -= 10; + } +} + void ms_sleep(int time) { #ifdef XENO_POSIX @@ -82,14 +93,16 @@ void check_current_prio(int expected_prio) RT_TASK_INFO task_info; if ((ret = rt_task_inquire(NULL, task_info)) 0) { - fprintf(stderr, Task inquire: %i (%s)\n, -ret, strerror(-ret)); + fprintf(stderr, + FAILURE: Task inquire: %i (%s)\n, -ret, strerror(-ret)); exit(EXIT_FAILURE); } current_prio = task_info.cprio; #endif /* __NATIVE_SKIN__ */ if (current_prio != expected_prio) { - fprintf(stderr, current prio (%d) != expected prio (%d)\n, + fprintf(stderr, + FAILURE: current prio (%d) != expected prio (%d)\n, current_prio, expected_prio); exit(EXIT_FAILURE); } @@ -105,7 +118,8 @@ void check_current_mode(int expected_primary_mode) current_in_primary = !(xeno_get_current_mode() XNRELAX); if (current_in_primary != expected_primary_mode) { - fprintf(stderr, current mode (%d) != expected mode (%d)\n, + fprintf(stderr, + FAILURE: current mode (%d) != expected mode (%d)\n, current_in_primary, expected_primary_mode); exit(EXIT_FAILURE); } @@ -122,16 +136,18 @@ void yield(void) int dispatch(const char *service_name, int service_type, int check, ...) { + unsigned long long timeout; thread_t *thread; cond_t *cond; void *handler; va_list ap; int status; + mutex_t *mutex; #ifdef XENO_POSIX struct sched_param param; pthread_attr_t threadattr; pthread_mutexattr_t mutexattr; - pthread_mutex_t *mutex; + struct timespec ts; #else /* __NATIVE_SKIN__ */ int prio; #endif /* __NATIVE_SKIN__ */ @@ -174,6 +190,18 @@ int dispatch(const char *service_name, int service_type, int check, ...) #endif /* __NATIVE_SKIN__ */ break; + case MUTEX_TIMED_LOCK: + mutex = va_arg(ap, mutex_t *); + timeout = va_arg(ap, unsigned long long); +#ifdef XENO_POSIX + clock_gettime(CLOCK_REALTIME, ts); + timespec_add(ts, timeout); + status = pthread_mutex_timedlock(mutex, ts); +#else /* __NATIVE_SKIN__ */ + status = -rt_mutex_acquire(mutex, timeout); +#endif /* __NATIVE_SKIN__ */ + break; + case MUTEX_UNLOCK: #ifdef XENO_POSIX status = pthread_mutex_unlock(va_arg(ap, pthread_mutex_t *)); @@ -264,7 +292,7 @@ int dispatch(const char *service_name, int service_type, int check, ...) va_end(ap); if (status 0 check) { - fprintf(stderr, %s: %i (%s)\n, + fprintf(stderr, FAILURE: %s: %i (%s)\n, service_name, status,
[Xenomai-git] Jan Kiszka : testsuite: Add timed mutex test
Module: xenomai-jki Branch: queues/assorted Commit: 766431f4982bb03708590ab3672f9f00d2754530 URL: http://git.xenomai.org/?p=xenomai-jki.git;a=commit;h=766431f4982bb03708590ab3672f9f00d2754530 Author: Jan Kiszka jan.kis...@siemens.com Date: Tue Mar 2 22:35:13 2010 +0100 testsuite: Add timed mutex test Add test for timeouts while waiting on a mutexe. At this chance, also tag the output on errors more clearly. Signed-off-by: Jan Kiszka jan.kis...@siemens.com --- src/testsuite/unit/mutex-torture.c | 133 1 files changed, 104 insertions(+), 29 deletions(-) diff --git a/src/testsuite/unit/mutex-torture.c b/src/testsuite/unit/mutex-torture.c index ebdd4f2..ebcb882 100644 --- a/src/testsuite/unit/mutex-torture.c +++ b/src/testsuite/unit/mutex-torture.c @@ -27,17 +27,18 @@ #include asm-generic/bits/current.h /* For internal use, do not use in your code. */ -#define MUTEX_CREATE 1 -#define MUTEX_LOCK 2 -#define MUTEX_TRYLOCK 3 -#define MUTEX_UNLOCK 4 -#define MUTEX_DESTROY 5 -#define COND_CREATE6 -#define COND_SIGNAL7 -#define COND_WAIT 8 -#define COND_DESTROY 9 -#define THREAD_DETACH 10 -#define THREAD_CREATE 11 +#define MUTEX_CREATE 1 +#define MUTEX_LOCK 2 +#define MUTEX_TRYLOCK 3 +#define MUTEX_TIMED_LOCK 4 +#define MUTEX_UNLOCK 5 +#define MUTEX_DESTROY 6 +#define COND_CREATE7 +#define COND_SIGNAL8 +#define COND_WAIT 9 +#define COND_DESTROY 10 +#define THREAD_DETACH 11 +#define THREAD_CREATE 12 #define NS_PER_MS 100 @@ -51,6 +52,16 @@ typedef RT_TASK thread_t; typedef RT_COND cond_t; #endif /* __NATIVE_SKIN__ */ +void timespec_add(struct timespec *ts, unsigned long long value) +{ + ts-tv_sec += value / 10; + ts-tv_nsec += value % 10; + if (ts-tv_nsec 10) { + ts-tv_sec++; + ts-tv_nsec -= 10; + } +} + void ms_sleep(int time) { #ifdef XENO_POSIX @@ -82,14 +93,16 @@ void check_current_prio(int expected_prio) RT_TASK_INFO task_info; if ((ret = rt_task_inquire(NULL, task_info)) 0) { - fprintf(stderr, Task inquire: %i (%s)\n, -ret, strerror(-ret)); + fprintf(stderr, + FAILURE: Task inquire: %i (%s)\n, -ret, strerror(-ret)); exit(EXIT_FAILURE); } current_prio = task_info.cprio; #endif /* __NATIVE_SKIN__ */ if (current_prio != expected_prio) { - fprintf(stderr, current prio (%d) != expected prio (%d)\n, + fprintf(stderr, + FAILURE: current prio (%d) != expected prio (%d)\n, current_prio, expected_prio); exit(EXIT_FAILURE); } @@ -105,7 +118,8 @@ void check_current_mode(int expected_primary_mode) current_in_primary = !(xeno_get_current_mode() XNRELAX); if (current_in_primary != expected_primary_mode) { - fprintf(stderr, current mode (%d) != expected mode (%d)\n, + fprintf(stderr, + FAILURE: current mode (%d) != expected mode (%d)\n, current_in_primary, expected_primary_mode); exit(EXIT_FAILURE); } @@ -122,16 +136,18 @@ void yield(void) int dispatch(const char *service_name, int service_type, int check, ...) { + unsigned long long timeout; thread_t *thread; cond_t *cond; void *handler; va_list ap; int status; + mutex_t *mutex; #ifdef XENO_POSIX struct sched_param param; pthread_attr_t threadattr; pthread_mutexattr_t mutexattr; - pthread_mutex_t *mutex; + struct timespec ts; #else /* __NATIVE_SKIN__ */ int prio; #endif /* __NATIVE_SKIN__ */ @@ -174,6 +190,18 @@ int dispatch(const char *service_name, int service_type, int check, ...) #endif /* __NATIVE_SKIN__ */ break; + case MUTEX_TIMED_LOCK: + mutex = va_arg(ap, mutex_t *); + timeout = va_arg(ap, unsigned long long); +#ifdef XENO_POSIX + clock_gettime(CLOCK_REALTIME, ts); + timespec_add(ts, timeout); + status = pthread_mutex_timedlock(mutex, ts); +#else /* __NATIVE_SKIN__ */ + status = -rt_mutex_acquire(mutex, timeout); +#endif /* __NATIVE_SKIN__ */ + break; + case MUTEX_UNLOCK: #ifdef XENO_POSIX status = pthread_mutex_unlock(va_arg(ap, pthread_mutex_t *)); @@ -264,7 +292,7 @@ int dispatch(const char *service_name, int service_type, int check, ...) va_end(ap); if (status 0 check) { - fprintf(stderr, %s: %i (%s)\n, + fprintf(stderr, FAILURE: %s: %i (%s)\n, service_name, status,