diff options
author | Bjoern Brandenburg <bbb@mpi-sws.org> | 2016-07-20 07:16:57 -0400 |
---|---|---|
committer | Bjoern Brandenburg <bbb@mpi-sws.org> | 2016-07-20 07:42:41 -0400 |
commit | a77898c74f599af64b029bf97ca82bf23c29fcd5 (patch) | |
tree | 8bb4a2ee55c291304f7da34fe9598a520ff77deb | |
parent | 9a8d7e447bbd1525f9f9f4660977072219bbc726 (diff) |
rtspin: add -T (use clock_nanosleep) option
This make rtspin use the regular Linux API for periodic activations
instead of the LITMUS^RT-specifc sleep_next_period() API.
-rw-r--r-- | bin/rtspin.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/bin/rtspin.c b/bin/rtspin.c index d33e9b3..498603f 100644 --- a/bin/rtspin.c +++ b/bin/rtspin.c | |||
@@ -62,6 +62,8 @@ const char *usage_msg = | |||
62 | " default w/o -S: periodic job releases\n" | 62 | " default w/o -S: periodic job releases\n" |
63 | " default if FILE is omitted: read from STDIN\n" | 63 | " default if FILE is omitted: read from STDIN\n" |
64 | "\n" | 64 | "\n" |
65 | " -T use clock_nanosleep() instead of sleep_next_period()\n" | ||
66 | "\n" | ||
65 | " -X PROTOCOL access a shared resource protected by a locking protocol\n" | 67 | " -X PROTOCOL access a shared resource protected by a locking protocol\n" |
66 | " -L CS-LENGTH simulate a critical section length of CS-LENGTH milliseconds\n" | 68 | " -L CS-LENGTH simulate a critical section length of CS-LENGTH milliseconds\n" |
67 | " -Q RESOURCE-ID access the resource identified by RESOURCE-ID\n" | 69 | " -Q RESOURCE-ID access the resource identified by RESOURCE-ID\n" |
@@ -276,7 +278,7 @@ static void job(double exec_time, double program_end, int lock_od, double cs_len | |||
276 | } | 278 | } |
277 | } | 279 | } |
278 | 280 | ||
279 | #define OPTSTR "p:c:wlveo:F:s:m:q:r:X:L:Q:iRu:Bhd:C:S::" | 281 | #define OPTSTR "p:c:wlveo:F:s:m:q:r:X:L:Q:iRu:Bhd:C:S::T" |
280 | int main(int argc, char** argv) | 282 | int main(int argc, char** argv) |
281 | { | 283 | { |
282 | int ret; | 284 | int ret; |
@@ -310,6 +312,9 @@ int main(int argc, char** argv) | |||
310 | int sporadic = 0; /* trigger jobs sporadically? */ | 312 | int sporadic = 0; /* trigger jobs sporadically? */ |
311 | int event_fd = -1; /* file descriptor for sporadic events */ | 313 | int event_fd = -1; /* file descriptor for sporadic events */ |
312 | 314 | ||
315 | int linux_sleep = 0; /* use Linux API for periodic activations? */ | ||
316 | lt_t next_release; | ||
317 | |||
313 | int verbose = 0; | 318 | int verbose = 0; |
314 | unsigned int job_no; | 319 | unsigned int job_no; |
315 | struct control_page* cp; | 320 | struct control_page* cp; |
@@ -379,6 +384,9 @@ int main(int argc, char** argv) | |||
379 | "for STDIN."); | 384 | "for STDIN."); |
380 | } | 385 | } |
381 | break; | 386 | break; |
387 | case 'T': | ||
388 | linux_sleep = 1; | ||
389 | break; | ||
382 | case 'm': | 390 | case 'm': |
383 | nr_of_pages = atoi(optarg); | 391 | nr_of_pages = atoi(optarg); |
384 | break; | 392 | break; |
@@ -576,6 +584,10 @@ int main(int argc, char** argv) | |||
576 | start = wctime(); | 584 | start = wctime(); |
577 | } | 585 | } |
578 | 586 | ||
587 | if (cp) | ||
588 | next_release = cp->release + period; | ||
589 | else | ||
590 | next_release = litmus_clock() + period; | ||
579 | 591 | ||
580 | /* main job loop */ | 592 | /* main job loop */ |
581 | cur_job = 0; | 593 | cur_job = 0; |
@@ -645,7 +657,16 @@ int main(int argc, char** argv) | |||
645 | /* wait for periodic job activation (unless sporadic) */ | 657 | /* wait for periodic job activation (unless sporadic) */ |
646 | if (!sporadic) { | 658 | if (!sporadic) { |
647 | /* periodic job activations */ | 659 | /* periodic job activations */ |
648 | sleep_next_period(); | 660 | if (linux_sleep) { |
661 | /* Use vanilla Linux API. This looks to the | ||
662 | * active LITMUS^RT plugin like a | ||
663 | * self-suspension. */ | ||
664 | lt_sleep_until(next_release); | ||
665 | next_release += period; | ||
666 | } else | ||
667 | /* Use LITMUS^RT API: some plugins optimize | ||
668 | * this by not actually suspending the task. */ | ||
669 | sleep_next_period(); | ||
649 | } | 670 | } |
650 | } | 671 | } |
651 | 672 | ||