[Xenomai-git] Philippe Gerum : testsuite/smokey: fail if out of TP schedule

2015-08-15 Thread git repository hosting
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[] =
+   CCBAACCBAACCBAACC
+   BAACCBAACCBAACCBAA
+   CCBAACCBAACCBAACC
+   BAACCBAACCBAA;
+
+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 = 1000;
+   ts.tv_nsec = 1050;
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 = 23000;
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


[Xenomai-git] Philippe Gerum : testsuite/smokey: fail if out of TP schedule

2015-07-31 Thread git repository hosting
Module: xenomai-3
Branch: next
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[] =
+   CCBAACCBAACCBAACC
+   BAACCBAACCBAACCBAA
+   CCBAACCBAACCBAACC
+   BAACCBAACCBAA;
+
+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 = 1000;
+   ts.tv_nsec = 1050;
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 = 23000;
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