aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjoern Brandenburg <bbb@mpi-sws.org>2014-09-16 04:28:08 -0400
committerBjoern Brandenburg <bbb@mpi-sws.org>2016-03-16 10:33:14 -0400
commitbe24daf0a97247fa3e97ef63e5e4b0efb3d7ec20 (patch)
tree8a714af3f24ef8a0ee663dfe0af54904f598ffcd
parent3d2d58b9e57a876bf57d4daf54ffbe2a15ce55fa (diff)
resctl: support specifying open intervals [$start,$end)
-rw-r--r--bin/resctl.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/bin/resctl.c b/bin/resctl.c
index 52cf6c0..6b05851 100644
--- a/bin/resctl.c
+++ b/bin/resctl.c
@@ -74,18 +74,25 @@ static struct lt_interval* parse_td_intervals(int argc, char** argv,
74 int i, matched; 74 int i, matched;
75 struct lt_interval *slots = malloc(sizeof(slots[0]) * argc); 75 struct lt_interval *slots = malloc(sizeof(slots[0]) * argc);
76 double start, end; 76 double start, end;
77 char closing_paren[2];
78 int closed;
77 79
78 *num_intervals = 0; 80 *num_intervals = 0;
79 for (i = 0; i < argc; i++) { 81 for (i = 0; i < argc; i++) {
80 matched = sscanf(argv[i], "[%lf,%lf]", &start, &end); 82 matched = sscanf(argv[i], "[%lf,%lf%1[])]",
81 if (matched != 2) { 83 &start, &end, closing_paren);
84 if (matched != 3) {
82 fprintf(stderr, "could not parse '%s' as interval\n", argv[i]); 85 fprintf(stderr, "could not parse '%s' as interval\n", argv[i]);
83 exit(5); 86 exit(5);
84 } 87 }
88
89 closed = closing_paren[0] == ']';
90
85 if (start < 0) { 91 if (start < 0) {
86 fprintf(stderr, "interval %s: must not start before zero\n", argv[i]); 92 fprintf(stderr, "interval %s: must not start before zero\n", argv[i]);
87 exit(5); 93 exit(5);
88 } 94 }
95
89 if (end <= start) { 96 if (end <= start) {
90 fprintf(stderr, "interval %s: end before start\n", argv[i]); 97 fprintf(stderr, "interval %s: end before start\n", argv[i]);
91 exit(5); 98 exit(5);
@@ -94,13 +101,17 @@ static struct lt_interval* parse_td_intervals(int argc, char** argv,
94 slots[i].start = ms2ns(start); 101 slots[i].start = ms2ns(start);
95 slots[i].end = ms2ns(end); 102 slots[i].end = ms2ns(end);
96 103
104 if (!closed)
105 slots[i].end--;
106
97 if (i > 0 && slots[i - 1].end >= slots[i].start) { 107 if (i > 0 && slots[i - 1].end >= slots[i].start) {
98 fprintf(stderr, "interval %s: overlaps with previous interval\n", argv[i]); 108 fprintf(stderr, "interval %s: overlaps with previous interval\n", argv[i]);
99 exit(5); 109 exit(5);
100 } 110 }
101 111
102 if (slots[i].end >= major_cycle) { 112 if (slots[i].end >= major_cycle) {
103 fprintf(stderr, "interval %s: exceeds major cycle length\n", argv[i]); 113 fprintf(stderr, "interval %s: exceeds major cycle length (%llu >= %llu)\n", argv[i],
114 slots[i].end, major_cycle);
104 exit(5); 115 exit(5);
105 } 116 }
106 117