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

Author: Philippe Gerum <r...@xenomai.org>
Date:   Thu Jul 30 09:12:29 2015 +0200

testsuite/smokey: fail if out of TP schedule

---

 testsuite/smokey/sched-tp/sched-tp.c |   64 ++++++++++++++++++++++++++++++----
 1 file changed, 58 insertions(+), 6 deletions(-)

diff --git a/testsuite/smokey/sched-tp/sched-tp.c 
b/testsuite/smokey/sched-tp/sched-tp.c
index 4f5f7bc..f28de54 100644
--- a/testsuite/smokey/sched-tp/sched-tp.c
+++ b/testsuite/smokey/sched-tp/sched-tp.c
@@ -11,6 +11,7 @@
 #include <memory.h>
 #include <malloc.h>
 #include <unistd.h>
+#include <string.h>
 #include <signal.h>
 #include <pthread.h>
 #include <semaphore.h>
@@ -33,6 +34,18 @@ static pthread_t threadA, threadB, threadC;
 
 static sem_t barrier;
 
+static const char ref_schedule[] =
+       "CCCCCCCCCCBBBBBAACCCCCCCCCCBBBBBAACCCCCCCCCCBBBBBAACCCCCCCCCC"
+       "BBBBBAACCCCCCCCCCBBBBBAACCCCCCCCCCBBBBBAACCCCCCCCCCBBBBBAA"
+       "CCCCCCCCCCBBBBBAACCCCCCCCCCBBBBBAACCCCCCCCCCBBBBBAACCCCCCCCCC"
+       "BBBBBAACCCCCCCCCCBBBBBAACCCCCCCCCCBBBBBAACCCCCCCC";
+
+static char schedule[sizeof(ref_schedule) + 8], *curr = schedule;
+
+static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
+
+static int overflow;
+
 static void *thread_body(void *arg)
 {
        pthread_t me = pthread_self();
@@ -58,10 +71,22 @@ static void *thread_body(void *arg)
        sem_post(&barrier);
 
        for (;;) {
-               putchar('A' + part);
-               fflush(stdout);
+               /*
+                * The mutex is there in case the scheduler behaves in
+                * a really weird way so that we don't write out of
+                * bounds; otherwise no serialization should happen
+                * due to this lock.
+                */
+               pthread_mutex_lock(&lock);
+               if (curr >= schedule + sizeof(schedule)) {
+                       pthread_mutex_unlock(&lock);
+                       overflow = 1;
+                       break;
+               }
+               *curr++ = 'A' + part;
+               pthread_mutex_unlock(&lock);
                ts.tv_sec = 0;
-               ts.tv_nsec = 10000000;
+               ts.tv_nsec = 10500000;
                clock_nanosleep(CLOCK_MONOTONIC, 0, &ts, NULL);
        }
 
@@ -106,6 +131,7 @@ static int run_sched_tp(struct smokey_test *t, int argc, 
char *const argv[])
        union sched_config *p;
        int ret, n, policies;
        size_t len;
+       char *s;
 
        ret = cobalt_corectl(_CC_COBALT_GET_POLICIES, &policies, 
sizeof(policies));
        if (ret || (policies & _CC_COBALT_SCHED_TP) == 0)
@@ -136,6 +162,7 @@ static int run_sched_tp(struct smokey_test *t, int argc, 
char *const argv[])
        if (p == NULL)
                error(1, ENOMEM, "malloc");
 
+       p->tp.op = sched_tp_install;
        p->tp.nr_windows = NR_WINDOWS;
        p->tp.windows[0].offset.tv_sec = 0;
        p->tp.windows[0].offset.tv_nsec = 0;
@@ -158,10 +185,10 @@ static int run_sched_tp(struct smokey_test *t, int argc, 
char *const argv[])
        p->tp.windows[3].duration.tv_nsec = 230000000;
        p->tp.windows[3].ptid = -1;
 
-       /* Assign the TP schedule to CPU #0 */
+       /* Assign the TP schedule to CPU #0 */
        ret = sched_setconfig_np(0, SCHED_TP, p, len);
        if (ret)
-               error(1, ret, "sched_setconfig_np");
+               error(1, ret, "sched_setconfig_np(install)");
 
        memset(p, 0xa5, len);
 
@@ -183,11 +210,36 @@ static int run_sched_tp(struct smokey_test *t, int argc, 
char *const argv[])
        create_thread(threadA, 0);
        create_thread(threadB, 1);
        create_thread(threadC, 2);
-       sem_post(&barrier);
 
+       /* Start the TP schedule. */
+       len = sched_tp_confsz(0);
+       p->tp.op = sched_tp_start;
+       ret = sched_setconfig_np(0, SCHED_TP, p, len);
+       if (ret)
+               error(1, ret, "sched_setconfig_np(start)");
+
+       sem_post(&barrier);
        sleep(5);
        cleanup();
        sem_destroy(&barrier);
+       free(p);
+
+       if (overflow) {
+               smokey_warning("schedule overflowed");
+               return -EPROTO;
+       }
+
+       /*
+        * The first time window might be decreased for enough time to
+        * skip an iteration due to lingering inits, and a few more
+        * marks may be generated while we are busy stopping the
+        * threads, so we look for a valid sub-sequence.
+        */
+       s = strstr(ref_schedule, schedule);
+       if (s == NULL || s - ref_schedule > 1) {
+               smokey_warning("unexpected schedule:\n%s", schedule);
+               return -EPROTO;
+       }
 
        return 0;
 }


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

Reply via email to