]> rtime.felk.cvut.cz Git - can-benchmark.git/blobdiff - latester/latester.c
Do not call poll with negative timeout
[can-benchmark.git] / latester / latester.c
index f57de3a765604f23f2932cdb64698b8b274e5fd9..c980f247ac9841b3aa4755aa3966880c2550865e 100644 (file)
@@ -72,6 +72,11 @@ struct options opt = {
        .length = 2,
 };
 
+struct {
+       unsigned enobufs;
+       unsigned overrun;
+} stats;
+
 int num_interfaces = 0;
 int count = 0;                 /* Number of sent messages */
 int completion_pipe[2];
@@ -397,7 +402,10 @@ static inline void get_next_timeout(struct timespec *timeout)
                        last.tv_nsec -= 1000000000;
                        last.tv_sec++;
                }
-               timespec_subtract(timeout, &last, &now);
+               if (timespec_subtract(timeout, &last, &now) /* is negative */) {
+                       stats.overrun++;
+                       memset(timeout, 0, sizeof(*timeout));
+               }
        } else if (opt.timeout_ms != 0) {
                timeout->tv_sec = opt.timeout_ms/1000;
                timeout->tv_nsec = (opt.timeout_ms%1000)*1000000;
@@ -539,6 +547,7 @@ void *measure_thread(void *arg)
                ret = send_frame(pfd[0].fd);                            \
                if (ret != sizeof(struct can_frame)) {                  \
                        if (ret == -1 && errno == ENOBUFS && opt.period_us == 0 && !opt.oneattime) { \
+                               stats.enobufs++;                        \
                                /* Ignore this error - pfifo_fast qeuue is full */ \
                        } else                                          \
                                error(1, errno, "send_frame (line %d)", __LINE__); \
@@ -746,5 +755,10 @@ int main(int argc, const char *argv[])
        if (opt.file)
                fclose(opt.file);
 
+       if (stats.overrun)
+               printf("overrun=%d\n", stats.overrun);
+       if (stats.enobufs)
+               printf("enobufs=%d\n", stats.enobufs);
+
        return 0;
 }