Module: xenomai-3
Branch: next
Commit: af70be8df24128e8f32bc64aea243705c82636b3
URL:    
http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=af70be8df24128e8f32bc64aea243705c82636b3

Author: Philippe Gerum <r...@xenomai.org>
Date:   Sun Jul 26 12:18:18 2015 +0200

testsuite/latency: do not inherit the main scheduling parameters

We don't want the display thread to inherit the scheduling parameters
set for the main() thread via --main-prio, particularly if SCHED_FIFO.

In addition, fix sloppy error handling so that a non-zero return value
is passed back on failure.

---

 testsuite/latency/latency.c |  201 ++++++++++++++++---------------------------
 1 file changed, 72 insertions(+), 129 deletions(-)

diff --git a/testsuite/latency/latency.c b/testsuite/latency/latency.c
index ff86b09..fa19c56 100644
--- a/testsuite/latency/latency.c
+++ b/testsuite/latency/latency.c
@@ -26,6 +26,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
+#include <error.h>
 #include <signal.h>
 #include <sched.h>
 #include <time.h>
@@ -117,30 +118,22 @@ static void *latency(void *cookie)
 
        snprintf(task_name, sizeof(task_name), "sampling-%d", getpid());
        err = pthread_setname_np(pthread_self(), task_name);
-       if (err) {
-               fprintf(stderr, "latency: setting name: error code %d\n", err);
-               return NULL;
-       }
+       if (err)
+               error(1, err, "pthread_setname_np(latency)");
 
        tfd = timerfd_create(CLOCK_MONOTONIC, 0);
-       if (tfd == -1) {
-               fprintf(stderr, "latency: timerfd_create: %m\n");
-               return NULL;
-       }
+       if (tfd == -1)
+               error(1, errno, "timerfd_create()");
 
 #ifdef CONFIG_XENO_COBALT
        err = pthread_setmode_np(0, PTHREAD_WARNSW, NULL);
-       if (err) {
-               fprintf(stderr, "latency: setting WARNSW: error code %d\n", 
err);
-               return NULL;
-       }
+       if (err)
+               error(1, err, "pthread_setmode_np()");
 #endif
 
        err = clock_gettime(CLOCK_MONOTONIC, &expected);
-       if (err) {
-               fprintf(stderr, "latency: clock_gettime: %m\n");
-               return NULL;
-       }
+       if (err)
+               error(1, errno, "clock_gettime()");
 
        fault_threshold = CONFIG_XENO_DEFAULT_PERIOD;
        nsamples = (long long)ONE_BILLION / period_ns;
@@ -155,11 +148,8 @@ static void *latency(void *cookie)
        timer_conf.it_interval.tv_nsec = period_ns % ONE_BILLION;
 
        err = timerfd_settime(tfd, TFD_TIMER_ABSTIME, &timer_conf, NULL);
-       if (err) {
-               fprintf(stderr, "latency: failed to set periodic, code %d\n",
-                       errno);
-               return NULL;
-       }
+       if (err)
+               error(1, errno, "timerfd_settime()");
 
        for (;;) {
                int32_t minj = TEN_MILLIONS, maxj = -TEN_MILLIONS, dt;
@@ -190,13 +180,8 @@ static void *latency(void *cookie)
                                minj = dt;
                        sumj += dt;
 
-                       if (err < 0) {
-                               fprintf(stderr,
-                                       "latency: wait period failed, code 
%d\n",
-                                       errno);
-                               exit(EXIT_FAILURE); /* Timer
-                                                    * stopped. */
-                       }
+                       if (err < 0)
+                               error(1, errno, "read()");
                        if (ticks > 1)
                                overrun += ticks - 1;
                        expected.tv_nsec += (ticks * period_ns) % ONE_BILLION;
@@ -253,23 +238,15 @@ static void *display(void *cookie)
 
        snprintf(task_name, sizeof(task_name), "display-%d", getpid());
        err = pthread_setname_np(pthread_self(), task_name);
-       if (err) {
-               fprintf(stderr, "latency: can not set task name: error %d\n",
-                       err);
-               return NULL;
-       }
+       if (err)
+               error(1, err, "pthread_setname_np(display)");
 
        if (test_mode == USER_TASK) {
                snprintf(sem_name, sizeof(sem_name), "/dispsem-%d", getpid());
-
                sem_unlink(sem_name); /* may fail */
                display_sem = sem_open(sem_name, O_CREAT | O_EXCL, 0666, 0);
-               if (display_sem == SEM_FAILED) {
-                       fprintf(stderr,
-                               "latency: cannot create semaphore: %m\n");
-                       return NULL;
-               }
-
+               if (display_sem == SEM_FAILED)
+                       error(1, errno, "sem_open()");
        } else {
                struct rttst_tmbench_config config;
 
@@ -286,13 +263,8 @@ static void *display(void *cookie)
                config.freeze_max = freeze_max;
 
                err = ioctl(benchdev, RTTST_RTIOC_TMBENCH_START, &config);
-
-               if (err) {
-                       fprintf(stderr,
-                               "latency: failed to start in-kernel timer 
benchmark, code %d\n",
-                               err);
-                       return NULL;
-               }
+               if (err)
+                       error(1, errno, "ioctl(RTTST_RTIOC_TMBENCH_START)");
        }
 
        time(&start);
@@ -312,9 +284,7 @@ static void *display(void *cookie)
 
                        if (err < 0) {
                                if (errno != EIDRM)
-                                       fprintf(stderr,
-                                               "latency: failed to pend on 
semaphore, code %d\n",
-                                               errno);
+                                       error(1, errno, "sem_wait()");
 
                                return NULL;
                        }
@@ -334,9 +304,8 @@ static void *display(void *cookie)
 
                        if (err < 0) {
                                if (errno != EIDRM)
-                                       fprintf(stderr,
-                                               "latency: failed to call 
RTTST_RTIOC_INTERM_BENCH_RES, code %d\n",
-                                               errno);
+                                       error(1, errno,
+                                             
"ioctl(RTTST_RTIOC_INTERM_BENCH_RES)");
 
                                return NULL;
                        }
@@ -646,10 +615,34 @@ void application_usage(void)
                );
 }
 
+static void setup_sched_parameters(pthread_attr_t *attr, int prio)
+{
+       struct sched_param p;
+       int ret;
+       
+       ret = pthread_attr_init(attr);
+       if (ret)
+               error(1, ret, "pthread_attr_init()");
+
+       ret = pthread_attr_setinheritsched(attr, PTHREAD_EXPLICIT_SCHED);
+       if (ret)
+               error(1, ret, "pthread_attr_setinheritsched()");
+
+       ret = pthread_attr_setschedpolicy(attr, prio ? SCHED_FIFO : 
SCHED_OTHER);
+       if (ret)
+               error(1, ret, "pthread_attr_setschedpolicy()");
+
+       p.sched_priority = prio;
+       ret = pthread_attr_setschedparam(attr, &p);
+       if (ret)
+               error(1, ret, "pthread_attr_setschedparam()");
+}
+
 int main(int argc, char *const *argv)
 {
        struct sigaction sa __attribute__((unused));
-       int c, err, sig, cpu = 0;
+       int c, ret, sig, cpu = 0;
+       pthread_attr_t tattr;
        cpu_set_t cpus;
        sigset_t mask;
 
@@ -682,10 +675,9 @@ int main(int argc, char *const *argv)
                case 'p':
 
                        period_ns = atoi(optarg) * 1000LL;
-                       if (period_ns > ONE_BILLION) {
-                               fprintf(stderr, "latency: invalid period (> 
1s).\n");
-                               exit(2);
-                       }
+                       if (period_ns > ONE_BILLION)
+                               error(1, EINVAL,
+                                     "period cannot be longer than 1s");
                        break;
 
                case 'l':
@@ -716,10 +708,8 @@ int main(int argc, char *const *argv)
 
                case 'c':
                        cpu = atoi(optarg);
-                       if (cpu < 0 || cpu >= CPU_SETSIZE) {
-                               fprintf(stderr, "latency: invalid CPU #%d\n", 
cpu);
-                               return 1;
-                       }
+                       if (cpu < 0 || cpu >= CPU_SETSIZE)
+                               error(1, EINVAL, "invalid CPU #%d", cpu);
                        break;
 
                case 'P':
@@ -736,15 +726,12 @@ int main(int argc, char *const *argv)
                }
 
        if (!test_duration && quiet) {
-               fprintf(stderr,
-                       "latency: -q only works if -T has been given.\n");
+               warning("-q requires -T, ignoring -q");
                quiet = 0;
        }
 
-       if ((test_mode < USER_TASK) || (test_mode > TIMER_HANDLER)) {
-               fprintf(stderr, "latency: invalid test mode.\n");
-               exit(2);
-       }
+       if (test_mode < USER_TASK || test_mode > TIMER_HANDLER)
+               error(1, EINVAL, "invalid test mode");
 
        time(&test_start);
 
@@ -795,76 +782,32 @@ int main(int argc, char *const *argv)
 
        if (test_mode != USER_TASK) {
                benchdev = open("/dev/rtdm/timerbench", O_RDWR);
-               if (benchdev < 0) {
-                       fprintf(stderr,
-                               "latency: cannot open /dev/rtdm/timerbench: 
%m\n"
-                               "(modprobe xeno_timerbench?)\n");
-                       return 0;
-               }
+               if (benchdev < 0)
+                       error(1, errno, "open sampler device (modprobe 
xeno_timerbench?)");
        }
 
-       err = pthread_create(&display_task, NULL, &display, NULL);
-       if (err) {
-               fprintf(stderr,
-                       "latency: failed to create display task, code %d\n",
-                       err);
-               return 0;
-       }
+       setup_sched_parameters(&tattr, 0);
 
-       if (test_mode == USER_TASK) {
-               pthread_attr_t tattr;
-               struct sched_param sp;
-
-               err = pthread_attr_init(&tattr);
-               if (err) {
-                       fprintf(stderr, "latency: pthread_attr_init: %d\n",
-                               err);
-                       return 0;
-               }
-               err = pthread_attr_setinheritsched(&tattr,
-                                               PTHREAD_EXPLICIT_SCHED);
-               if (err) {
-                       fprintf(stderr, "latency: set explicit sched: %d\n",
-                               err);
-                       return 0;
-               }
-               if (priority)
-                       err = pthread_attr_setschedpolicy(&tattr, SCHED_FIFO);
-               else
-                       err = pthread_attr_setschedpolicy(&tattr, SCHED_OTHER);
+       ret = pthread_create(&display_task, &tattr, display, NULL);
+       if (ret)
+               error(1, ret, "pthread_create(display)");
 
-               if (err) {
-                       fprintf(stderr, "latency: set scheduling policy: %d\n",
-                               err);
-                       return 0;
-               }
-
-               sp.sched_priority = priority;
-               err = pthread_attr_setschedparam(&tattr, &sp);
-               if (err) {
-                       fprintf(stderr, "latency: set scheduling param: %d\n",
-                               err);
-                       return 0;
-               }
+       pthread_attr_destroy(&tattr);
 
+       if (test_mode == USER_TASK) {
+               setup_sched_parameters(&tattr, priority);
                CPU_ZERO(&cpus);
                CPU_SET(cpu, &cpus);
-               err = pthread_attr_setaffinity_np(&tattr, sizeof(cpus), &cpus);
-               if (err) {
-                       fprintf(stderr,
-                               "latency: failed to set CPU affinity, code 
%d\n", err);
-                               return 0;
-               }
 
-               err = pthread_create(&latency_task, &tattr, &latency, NULL);
-               pthread_attr_destroy(&tattr);
+               ret = pthread_attr_setaffinity_np(&tattr, sizeof(cpus), &cpus);
+               if (ret)
+                       error(1, ret, "pthread_attr_setaffinity_np()");
 
-               if (err) {
-                       fprintf(stderr,
-                               "latency: failed to create latency task, code 
%d\n",
-                               err);
-                       return 0;
-               }
+               ret = pthread_create(&latency_task, &tattr, latency, NULL);
+               if (ret)
+                       error(1, ret, "pthread_create(latency)");
+
+               pthread_attr_destroy(&tattr);
        }
 
        __STD(sigwait(&mask, &sig));


_______________________________________________
Xenomai-git mailing list
Xenomai-git@xenomai.org
http://xenomai.org/mailman/listinfo/xenomai-git

Reply via email to