aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorBjoern Brandenburg <bbb@mpi-sws.org>2014-06-12 07:32:21 -0400
committerBjoern Brandenburg <bbb@mpi-sws.org>2014-06-12 08:16:10 -0400
commit54ab0e29794e9f22aacd206102d9e4d643e28efe (patch)
treed0d5bcfbe0b207aa099e7233818ec83fea9ab763 /tests
parentaabfa10d86f2be6416eabedd03f52b548379f2d6 (diff)
Add test cases for enforcement of periods of periodic tasks
Diffstat (limited to 'tests')
-rw-r--r--tests/sched.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/tests/sched.c b/tests/sched.c
index 6fd6d89..a91e736 100644
--- a/tests/sched.c
+++ b/tests/sched.c
@@ -1,6 +1,7 @@
1#include <sys/wait.h> /* for waitpid() */ 1#include <sys/wait.h> /* for waitpid() */
2#include <unistd.h> 2#include <unistd.h>
3#include <stdio.h> 3#include <stdio.h>
4#include <math.h>
4 5
5#include "tests.h" 6#include "tests.h"
6#include "litmus.h" 7#include "litmus.h"
@@ -76,4 +77,86 @@ TESTCASE(preempt_on_resume, P_FP | PSN_EDF,
76 ASSERT( status == SIGUSR2); 77 ASSERT( status == SIGUSR2);
77} 78}
78 79
80#define PERIOD 100 /* in ms */
81#define JOBS 10
82#define ACCEPTABLE_MARGIN 5 /* in ms --- must be largish for QEMU */
79 83
84TESTCASE(jobs_are_rate_limited, LITMUS,
85 "periodic jobs are rate-limited (w/o synchronous release)")
86{
87 struct rt_task params;
88 double start, end, actual_delta_ms;
89 int i;
90
91 init_rt_task_param(&params);
92 params.cpu = 0;
93 params.exec_cost = ms2ns(40);
94 params.period = ms2ns(PERIOD);
95 params.release_policy = TASK_PERIODIC;
96
97 SYSCALL( set_rt_task_param(gettid(), &params) );
98 SYSCALL( be_migrate_to_cpu(params.cpu) );
99 SYSCALL( task_mode(LITMUS_RT_TASK) );
100
101 start = wctime();
102 for (i = 0; i < JOBS; i++)
103 SYSCALL( sleep_next_period() );
104 end = wctime();
105
106 SYSCALL( task_mode(BACKGROUND_TASK) );
107
108 actual_delta_ms = (end - start) * 1000.0;
109 if (fabs(JOBS * PERIOD - actual_delta_ms) > ACCEPTABLE_MARGIN)
110 fprintf(stderr, "actual_delta_ms:%.4f expected:%.4f\n",
111 actual_delta_ms, (double) (JOBS * PERIOD));
112 ASSERT( fabs(JOBS * PERIOD - actual_delta_ms) <= ACCEPTABLE_MARGIN);
113}
114
115TESTCASE(jobs_are_rate_limited_synch, LITMUS,
116 "periodic jobs are rate-limited (w/ synchronous release)")
117{
118 struct rt_task params;
119 double start, end, actual_delta_ms;
120 int i;
121 int child, status, waiters;
122 lt_t delay = ms2ns(100);
123
124 child = FORK_TASK(
125 init_rt_task_param(&params);
126 params.cpu = 0;
127 params.exec_cost = ms2ns(5);
128 params.period = ms2ns(PERIOD);
129 params.release_policy = TASK_PERIODIC;
130
131 SYSCALL( set_rt_task_param(gettid(), &params) );
132 SYSCALL( be_migrate_to_cpu(params.cpu) );
133 SYSCALL( task_mode(LITMUS_RT_TASK) );
134
135 SYSCALL( wait_for_ts_release() );
136
137 start = wctime();
138 for (i = 0; i < JOBS; i++)
139 SYSCALL( sleep_next_period() );
140 end = wctime();
141
142 SYSCALL( task_mode(BACKGROUND_TASK) );
143
144 actual_delta_ms = (end - start) * 1000.0;
145 if (fabs(JOBS * PERIOD - actual_delta_ms) > ACCEPTABLE_MARGIN)
146 fprintf(stderr, "actual_delta_ms:%.4f expected:%.4f\n",
147 actual_delta_ms, (double) (JOBS * PERIOD));
148 ASSERT( fabs(JOBS * PERIOD - actual_delta_ms) <= ACCEPTABLE_MARGIN);
149 );
150
151 do {
152 waiters = get_nr_ts_release_waiters();
153 ASSERT( waiters >= 0 );
154 } while (waiters != 1);
155
156 waiters = release_ts(&delay);
157
158
159 /* wait for child to exit */
160 SYSCALL( waitpid(child, &status, 0) );
161 ASSERT( status == 0 );
162}