Move the statistics calculation out of the periodic threads to avoid
performing those computation at an RT priority thus impacting the other
threads.

  This allows for a nicer output (not intermingled) as the stats are
displayed once all the threads have exited.

Signed-off-by: Sebastien Dugue <[EMAIL PROTECTED]>
Cc: Darren Hart <[EMAIL PROTECTED]>
Cc: Tim Chavez <[EMAIL PROTECTED]>
---
 .../func/periodic_cpu_load/periodic_cpu_load.c     |   74 +++++++++++++-------
 1 files changed, 48 insertions(+), 26 deletions(-)

diff --git a/testcases/realtime/func/periodic_cpu_load/periodic_cpu_load.c 
b/testcases/realtime/func/periodic_cpu_load/periodic_cpu_load.c
index 6a6cd54..ba65699 100644
--- a/testcases/realtime/func/periodic_cpu_load/periodic_cpu_load.c
+++ b/testcases/realtime/func/periodic_cpu_load/periodic_cpu_load.c
@@ -56,6 +56,7 @@
 #define CALC_LOOPS_B (50*100)
 #define CALC_LOOPS_C (72*100)
 
+#define NUM_GROUPS 3
 #define THREADS_PER_GROUP 4
 
 //#define ITERATIONS 100 /* short functional test run */
@@ -64,6 +65,11 @@
 // FIXME: need some kind of passing criteria calculation
 //#define PASS_US 100
 
+int fail[THREADS_PER_GROUP * NUM_GROUPS];
+stats_container_t dat[THREADS_PER_GROUP * NUM_GROUPS];
+stats_quantiles_t quantiles[THREADS_PER_GROUP * NUM_GROUPS];
+static const char groupname[NUM_GROUPS] = "ABC";
+
 static int run_jvmsim = 0;
 static int ret = 0;
 
@@ -120,47 +126,31 @@ void *periodic_thread(void *thread)
        nsec_t period = parg->period;
        void*(*func)(void*) = parg->func;
 
-       stats_container_t dat;
-       stats_quantiles_t quantiles;
-
        int i = 0;
-       int fail = 0;
        nsec_t next;
        nsec_t exe_start, exe_end, exe_time;
 
-       stats_container_init(&dat, ITERATIONS);
-       stats_quantiles_init(&quantiles, 3);
-
        next = rt_gettime();
        while (i < parg->iterations) {
                next += period;
                if (rt_gettime() > next) {
                        printf("TID %d missed period, aborting\n", t->id);
-                       fail = 1;
+                       fail[t->id] = 1;
                        break;
                }
                exe_start = rt_gettime();
                func(parg->arg);
                exe_end = rt_gettime();
                exe_time = exe_end - exe_start;
-               dat.records[i].x = i;
-               dat.records[i].y = exe_time/NS_PER_US;
+               dat[t->id].records[i].x = i;
+               dat[t->id].records[i].y = exe_time/NS_PER_US;
 
                i++;
                rt_nanosleep(next - rt_gettime());
        }
 
-       printf("\nTID %d (prio %d) complete\n", t->id, t->priority);
-       printf("  Execution Time Statistics:\n");
-       printf("        Min: %ld us\n", stats_min(&dat));
-       printf("        Max: %ld us\n", stats_max(&dat));
-       printf("        Avg: %f us\n", stats_avg(&dat));
-       printf("     StdDev: %f us\n\n", stats_stddev(&dat));
-       printf("  Quantiles:\n");
-       stats_quantiles_calc(&dat, &quantiles);
-       stats_quantiles_print(&quantiles);
-       printf("Criteria:TID %d missed a period\n",t->id);
-       printf("Result: %s\n", fail ? "FAIL":"PASS");
+       printf("TID %d (%c - prio %d) complete\n", t->id, groupname[t->id>>2],
+              t->priority);
 
        return NULL;
 }
@@ -188,6 +178,7 @@ int main(int argc, char *argv[])
        printf("  threads: %d\n", THREADS_PER_GROUP);
        printf("  priority: %d\n", PRIO_C);
        printf("  period: %d ms\n", PERIOD_C/NS_PER_MS);
+       printf("\n");
 
        if (run_jvmsim) {
                printf("jvmsim enabled\n");
@@ -196,20 +187,51 @@ int main(int argc, char *argv[])
                printf("jvmsim disabled\n");
        }
 
-       struct periodic_arg parg_a = { PERIOD_A, ITERATIONS, calc, (void 
*)CALC_LOOPS_A };
-       struct periodic_arg parg_b = { PERIOD_B, ITERATIONS, calc, (void 
*)CALC_LOOPS_B };
-       struct periodic_arg parg_c = { PERIOD_C, ITERATIONS, calc, (void 
*)CALC_LOOPS_C };
-       for (i=0; i < THREADS_PER_GROUP; i++) {
+       for (i=0; i<(THREADS_PER_GROUP * NUM_GROUPS); i++) {
+               stats_container_init(&dat[i], ITERATIONS);
+               stats_quantiles_init(&quantiles[i], log10(ITERATIONS));
+       }
+
+       struct periodic_arg parg_a = {PERIOD_A, ITERATIONS, calc, (void 
*)CALC_LOOPS_A };
+       struct periodic_arg parg_b = {PERIOD_B, ITERATIONS, calc, (void 
*)CALC_LOOPS_B };
+       struct periodic_arg parg_c = {PERIOD_C, ITERATIONS, calc, (void 
*)CALC_LOOPS_C };
+
+       for (i=0; i < THREADS_PER_GROUP; i++)
                create_fifo_thread(periodic_thread, (void*)&parg_a, PRIO_A);
+       for (i=0; i < THREADS_PER_GROUP; i++)
                create_fifo_thread(periodic_thread, (void*)&parg_b, PRIO_B);
+       for (i=0; i < THREADS_PER_GROUP; i++)
                create_fifo_thread(periodic_thread, (void*)&parg_c, PRIO_C);
-       }
 
        join_threads();
 
+       printf("\nExecution Time Statistics:\n\n");
+
+       for (i=0; i<(THREADS_PER_GROUP * NUM_GROUPS); i++) {
+               printf("TID %d (%c)\n", i, groupname[i>>2]);
+               printf("  Min: %ld us\n", stats_min(&dat[i]));
+               printf("  Max: %ld us\n", stats_max(&dat[i]));
+               printf("  Avg: %f us\n", stats_avg(&dat[i]));
+               printf("  StdDev: %f us\n\n", stats_stddev(&dat[i]));
+               printf("  Quantiles:\n");
+               stats_quantiles_calc(&dat[i], &quantiles[i]);
+               stats_quantiles_print(&quantiles[i]);
+               printf("Criteria: TID %d did not miss a period\n", i);
+               printf("Result: %s\n", fail[i] ? "FAIL":"PASS");
+               printf("\n");
+
+               if (fail[i])
+                       ret = 1;
+       }
+
        // FIXME: define pass criteria
        // printf("\nCriteria: latencies < %d us\n", PASS_US);
        // printf("Result: %s\n", ret ? "FAIL" : "PASS");
 
+       for (i=0; i<(THREADS_PER_GROUP * NUM_GROUPS); i++) {
+               stats_container_free(&dat[i]);
+               stats_quantiles_free(&quantiles[i]);
+       }
+
        return ret;
 }
-- 
1.5.4.rc2.84.gf85fd-dirty


-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to