]> rtime.felk.cvut.cz Git - can-benchmark.git/blobdiff - latester/latester.c
Fix periodic mode in latester
[can-benchmark.git] / latester / latester.c
index a4f825c577fd68b0e7955efd9066b577539e40c1..8b1fb866c21fff7e0c0b1cbf10ba205dd99bd1fb 100644 (file)
@@ -427,26 +427,34 @@ static inline void send_and_check(int s)
        }
 }
 
        }
 }
 
-static inline void get_next_timeout(struct timespec *timeout)
+static inline void get_next_timeout(struct timespec *timeout, bool advance)
 {
        struct timespec now;
        static struct timespec last = {-1, 0 };
 
        clock_gettime(CLOCK_MONOTONIC, &now);
 
 {
        struct timespec now;
        static struct timespec last = {-1, 0 };
 
        clock_gettime(CLOCK_MONOTONIC, &now);
 
-       if (last.tv_sec == -1)
+       if (last.tv_sec == -1) {
                last = now;
                last = now;
+               last.tv_nsec = last.tv_nsec/1000000*1000000;
+       }
        if (opt.period_us != 0) {
        if (opt.period_us != 0) {
-               last.tv_sec += opt.period_us/1000000;
-               last.tv_nsec += (opt.period_us%1000000)*1000;
-               while (last.tv_nsec >= 1000000000) {
-                       last.tv_nsec -= 1000000000;
-                       last.tv_sec++;
+               if (advance) {
+                       last.tv_sec += opt.period_us/1000000;
+                       last.tv_nsec += (opt.period_us%1000000)*1000;
+                       while (last.tv_nsec >= 1000000000) {
+                               last.tv_nsec -= 1000000000;
+                               last.tv_sec++;
+                       }
                }
                if (timespec_subtract(timeout, &last, &now) /* is negative */) {
                        stats.overrun++;
                        memset(timeout, 0, sizeof(*timeout));
                }
                }
                if (timespec_subtract(timeout, &last, &now) /* is negative */) {
                        stats.overrun++;
                        memset(timeout, 0, sizeof(*timeout));
                }
+/*             printf("next %ld.%06ld  now %ld.%06ld  --> timeout %ld.%06ld\n", */
+/*                    last.tv_sec, last.tv_nsec/1000, */
+/*                    now.tv_sec, now.tv_nsec/1000, */
+/*                    timeout->tv_sec, timeout->tv_nsec/1000); */
        } else if (opt.timeout_ms != 0) {
                timeout->tv_sec = opt.timeout_ms/1000;
                timeout->tv_nsec = (opt.timeout_ms%1000)*1000000;
        } else if (opt.timeout_ms != 0) {
                timeout->tv_sec = opt.timeout_ms/1000;
                timeout->tv_nsec = (opt.timeout_ms%1000)*1000000;
@@ -596,11 +604,12 @@ void *measure_thread(void *arg)
                SEND();
 
        get_tstamp(&stats.tic);
                SEND();
 
        get_tstamp(&stats.tic);
-
+       ret = 0;
        while (!finish_flag &&
               (opt.count == 0 || count < opt.count || msg_in_progress != 0)) {
 
        while (!finish_flag &&
               (opt.count == 0 || count < opt.count || msg_in_progress != 0)) {
 
-               get_next_timeout(&timeout);
+               get_next_timeout(&timeout, ret == 0);
+               //printf("timeout %ld.%06ld\n", timeout.tv_sec, timeout.tv_nsec/1000);
                //printf("ppoll"); fflush(stdout);
                ret = ppoll(pfd, num_interfaces, &timeout, NULL);
                //printf("=%d\n", ret);
                //printf("ppoll"); fflush(stdout);
                ret = ppoll(pfd, num_interfaces, &timeout, NULL);
                //printf("=%d\n", ret);