X-Git-Url: http://rtime.felk.cvut.cz/gitweb/can-benchmark.git/blobdiff_plain/481e40ab64b66837af06aaefb14a2d8b45c01530..cf9bd660b3c10cff6e81af6fb4e42d3569229514:/latester/latester.c diff --git a/latester/latester.c b/latester/latester.c index b3f2002..c980f24 100644 --- a/latester/latester.c +++ b/latester/latester.c @@ -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]; @@ -232,9 +237,9 @@ static inline unsigned get_msg_latency_us(struct msg_info *mi) struct timespec diff; if (num_interfaces == 3) if (opt.userhist) - timespec_subtract(&diff, &mi->ts_rx_final_kern, &mi->ts_rx_onwire_kern); - else timespec_subtract(&diff, &mi->ts_rx_final, &mi->ts_rx_onwire); + else + timespec_subtract(&diff, &mi->ts_rx_final_kern, &mi->ts_rx_onwire_kern); else if (opt.userhist) timespec_subtract(&diff, &mi->ts_rx_final, &mi->ts_sent); @@ -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; @@ -532,13 +540,14 @@ void *measure_thread(void *arg) pfd[i].events = POLLIN; } - set_sched_policy_and_prio(SCHED_FIFO, 99); + set_sched_policy_and_prio(SCHED_FIFO, 40); #define SEND() \ do { \ 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; }