summaryrefslogtreecommitdiff
path: root/src/bootchart
diff options
context:
space:
mode:
authorDaniel Mack <daniel@zonque.org>2015-07-21 15:30:47 +0200
committerDaniel Mack <daniel@zonque.org>2015-07-21 18:37:06 +0200
commit0a327854f8613b7a52a80c1f3f8fc3100fb9df58 (patch)
tree636a532c16276594fa6d9129b7ee25911e1528d2 /src/bootchart
parent81fc63daa49e2a902cce62ba8fcc7783f0ba1908 (diff)
bootchart: fix negative 'timeleft' condition
Fix the overrun case in sample acquistion and negative number calculations. Reported by Stefan Sauer. Fixes #642
Diffstat (limited to 'src/bootchart')
-rw-r--r--src/bootchart/bootchart.c16
1 files changed, 6 insertions, 10 deletions
diff --git a/src/bootchart/bootchart.c b/src/bootchart/bootchart.c
index 3360bc85be..1625d51fa8 100644
--- a/src/bootchart/bootchart.c
+++ b/src/bootchart/bootchart.c
@@ -387,9 +387,6 @@ int main(int argc, char *argv[]) {
for (samples = 0; !exiting && samples < arg_samples_len; samples++) {
int res;
double sample_stop;
- struct timespec req;
- time_t newint_s;
- long newint_ns;
double elapsed;
double timeleft;
@@ -427,18 +424,17 @@ int main(int argc, char *argv[]) {
elapsed = (sample_stop - sampledata->sampletime) * 1000000000.0;
timeleft = interval - elapsed;
- newint_s = (time_t)(timeleft / 1000000000.0);
- newint_ns = (long)(timeleft - (newint_s * 1000000000.0));
-
/*
* check if we have not consumed our entire timeslice. If we
* do, don't sleep and take a new sample right away.
* we'll lose all the missed samples and overrun our total
* time
*/
- if (newint_ns > 0 || newint_s > 0) {
- req.tv_sec = newint_s;
- req.tv_nsec = newint_ns;
+ if (timeleft > 0) {
+ struct timespec req;
+
+ req.tv_sec = (time_t)(timeleft / 1000000000.0);
+ req.tv_nsec = (long)(timeleft - (req.tv_sec * 1000000000.0));
res = nanosleep(&req, NULL);
if (res) {
@@ -452,7 +448,7 @@ int main(int argc, char *argv[]) {
} else {
overrun++;
/* calculate how many samples we lost and scrap them */
- arg_samples_len -= (int)(newint_ns / interval);
+ arg_samples_len -= (int)(-timeleft / interval);
}
LIST_PREPEND(link, head, sampledata);
}