aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMac Mollison <mollison@cs.unc.edu>2011-01-14 12:15:02 -0500
committerMac Mollison <mollison@cs.unc.edu>2011-01-14 12:20:05 -0500
commit4a2b128f0db282896552ba3dc311c0241ea819e4 (patch)
treeb100c117b5912dc99ef043a11c6a3ff2e2c56b62
parent4da230a57a7d6abbe1b3248ae46c9f5983c4083c (diff)
Remove loop_length featureswip-no-loop-length
A large amount of code was devoted to computing the duration of one complete run of the spin loop, and related auxiliary featues. This code was (essentially) obsoleted when we started using the POSIX clock_gettime() function to control how long spinning occurs. This patch removes this obsolete code.
-rw-r--r--bin/rtspin.c100
1 files changed, 2 insertions, 98 deletions
diff --git a/bin/rtspin.c b/bin/rtspin.c
index 3e22ffe..01855ab 100644
--- a/bin/rtspin.c
+++ b/bin/rtspin.c
@@ -112,8 +112,6 @@ static void get_exec_times(const char *file, const int column,
112 112
113#define NUMS 4096 113#define NUMS 4096
114static int num[NUMS]; 114static int num[NUMS];
115static double loop_length = 1.0;
116static char* progname;
117 115
118static int loop_once(void) 116static int loop_once(void)
119{ 117{
@@ -125,18 +123,11 @@ static int loop_once(void)
125 123
126static int loop_for(double exec_time, double emergency_exit) 124static int loop_for(double exec_time, double emergency_exit)
127{ 125{
128 double t = 0;
129 int tmp = 0; 126 int tmp = 0;
130/* while (t + loop_length < exec_time) {
131 tmp += loop_once();
132 t += loop_length;
133 }
134*/
135 double start = cputime(); 127 double start = cputime();
136 double now = cputime(); 128 double now = cputime();
137 while (now + loop_length < start + exec_time) { 129 while (now < start + exec_time) {
138 tmp += loop_once(); 130 tmp += loop_once();
139 t += loop_length;
140 now = cputime(); 131 now = cputime();
141 if (emergency_exit && wctime() > emergency_exit) { 132 if (emergency_exit && wctime() > emergency_exit) {
142 /* Oops --- this should only be possible if the execution time tracking 133 /* Oops --- this should only be possible if the execution time tracking
@@ -150,64 +141,6 @@ static int loop_for(double exec_time, double emergency_exit)
150 return tmp; 141 return tmp;
151} 142}
152 143
153static void fine_tune(double interval)
154{
155 double start, end, delta;
156
157 start = wctime();
158 loop_for(interval, 0);
159 end = wctime();
160 delta = (end - start - interval) / interval;
161 if (delta != 0)
162 loop_length = loop_length / (1 - delta);
163}
164
165static void configure_loop(void)
166{
167 double start;
168
169 /* prime cache */
170 loop_once();
171 loop_once();
172 loop_once();
173
174 /* measure */
175 start = wctime();
176 loop_once(); /* hope we didn't get preempted */
177 loop_length = wctime();
178 loop_length -= start;
179
180 /* fine tune */
181 fine_tune(0.1);
182 fine_tune(0.1);
183 fine_tune(0.1);
184}
185
186static void show_loop_length(void)
187{
188 printf("%s/%d: loop_length=%f (%ldus)\n",
189 progname, getpid(), loop_length,
190 (long) (loop_length * 1000000));
191}
192
193static void debug_delay_loop(void)
194{
195 double start, end, delay;
196 show_loop_length();
197 while (1) {
198 for (delay = 0.5; delay > 0.01; delay -= 0.01) {
199 start = wctime();
200 loop_for(delay, 0);
201 end = wctime();
202 printf("%6.4fs: looped for %10.8fs, delta=%11.8fs, error=%7.4f%%\n",
203 delay,
204 end - start,
205 end - start - delay,
206 100 * (end - start - delay) / delay);
207 }
208 }
209}
210
211static int job(double exec_time, double program_end) 144static int job(double exec_time, double program_end)
212{ 145{
213 if (wctime() > program_end) 146 if (wctime() > program_end)
@@ -221,7 +154,7 @@ static int job(double exec_time, double program_end)
221 154
222#define OPTSTR "p:c:wld:veo:f:s:" 155#define OPTSTR "p:c:wld:veo:f:s:"
223 156
224int main(int argc, char** argv) 157int main(int argc, char** argv)
225{ 158{
226 int ret; 159 int ret;
227 lt_t wcet; 160 lt_t wcet;
@@ -231,9 +164,6 @@ int main(int argc, char** argv)
231 int cpu = 0; 164 int cpu = 0;
232 int opt; 165 int opt;
233 int wait = 0; 166 int wait = 0;
234 int test_loop = 0;
235 int skip_config = 0;
236 int verbose = 0;
237 int column = 1; 167 int column = 1;
238 const char *file = NULL; 168 const char *file = NULL;
239 int want_enforcement = 0; 169 int want_enforcement = 0;
@@ -243,8 +173,6 @@ int main(int argc, char** argv)
243 task_class_t class = RT_CLASS_HARD; 173 task_class_t class = RT_CLASS_HARD;
244 int cur_job, num_jobs; 174 int cur_job, num_jobs;
245 175
246 progname = argv[0];
247
248 while ((opt = getopt(argc, argv, OPTSTR)) != -1) { 176 while ((opt = getopt(argc, argv, OPTSTR)) != -1) {
249 switch (opt) { 177 switch (opt) {
250 case 'w': 178 case 'w':
@@ -262,18 +190,6 @@ int main(int argc, char** argv)
262 case 'e': 190 case 'e':
263 want_enforcement = 1; 191 want_enforcement = 1;
264 break; 192 break;
265 case 'l':
266 test_loop = 1;
267 break;
268 case 'd':
269 /* manually configure delay per loop iteration
270 * unit: microseconds */
271 loop_length = atof(optarg) / 1000000;
272 skip_config = 1;
273 break;
274 case 'v':
275 verbose = 1;
276 break;
277 case 'o': 193 case 'o':
278 column = atoi(optarg); 194 column = atoi(optarg);
279 break; 195 break;
@@ -293,15 +209,6 @@ int main(int argc, char** argv)
293 } 209 }
294 } 210 }
295 211
296
297 if (!skip_config)
298 configure_loop();
299
300 if (test_loop) {
301 debug_delay_loop();
302 return 0;
303 }
304
305 if (file) { 212 if (file) {
306 get_exec_times(file, column, &num_jobs, &exec_times); 213 get_exec_times(file, column, &num_jobs, &exec_times);
307 214
@@ -354,9 +261,6 @@ int main(int argc, char** argv)
354 if (ret < 0) 261 if (ret < 0)
355 bail_out("could not setup rt task params"); 262 bail_out("could not setup rt task params");
356 263
357 if (verbose)
358 show_loop_length();
359
360 init_litmus(); 264 init_litmus();
361 265
362 ret = task_mode(LITMUS_RT_TASK); 266 ret = task_mode(LITMUS_RT_TASK);