X-Git-Url: http://rtime.felk.cvut.cz/gitweb/can-benchmark.git/blobdiff_plain/4dfed603d7350f31bc27eac347eb824cafaf0c42..b55ca3688e84d51f68d5d0270f962b041b96f065:/latester/latester.c diff --git a/latester/latester.c b/latester/latester.c index fb299aa..e4185b2 100644 --- a/latester/latester.c +++ b/latester/latester.c @@ -81,6 +81,8 @@ struct { unsigned enobufs; unsigned overrun; unsigned lost; + struct timespec tic, tac; + unsigned timeouts; } stats; int num_interfaces = 0; @@ -130,7 +132,7 @@ void sprint_canframe(char *buf , struct can_frame *cf, int sep) { } } -static inline struct msg_info *frame2info(struct can_frame *frame) +static inline uint16_t frame_index(struct can_frame *frame) { uint16_t idx; if (frame->can_dlc >= 2) { @@ -141,7 +143,12 @@ static inline struct msg_info *frame2info(struct can_frame *frame) error(1, 0, "%s error", __FUNCTION__); } - return &msg_infos[idx]; + return idx; +} + +static inline struct msg_info *frame2info(struct can_frame *frame) +{ + return &msg_infos[frame_index(frame)]; } static inline char *tstamp_str(const void *ctx, struct timespec *tstamp) @@ -187,33 +194,6 @@ void msg_info_print(FILE *f, struct msg_info *mi) talloc_free (local); } -int msg_info_store(FILE *f, struct msg_info *mi) -{ - struct timespec diff; - void *local = talloc_new (NULL); - static long num = 0; - -#define S(ts) tstamp_str(local, &ts) -#define DIFF(a, b) (timespec_subtract(&diff, &b, &a), S(diff)) - - switch (num_interfaces) { - case 2: - fprintf(f, "%ld %d %d %s\n", - num, mi->id, mi->length, - DIFF(mi->ts_sent, mi->ts_rx_final_kern)); - break; - case 3: - fprintf(f, "%ld %d %d %s\n", - num, mi->id, mi->length, - DIFF(mi->ts_rx_onwire_kern, mi->ts_rx_final_kern)); - break; - } -#undef S -#undef DIFF - talloc_free (local); -} - - /* Subtract the `struct timespec' values X and Y, storing the result in RESULT. Return 1 if the difference is negative, otherwise 0. */ @@ -251,13 +231,13 @@ static inline unsigned get_msg_latency_us(struct msg_info *mi) { struct timespec diff; switch (num_interfaces) { - case 2: + case 3: if (opt.userhist) 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); break; - case 3: + case 2: if (opt.userhist) timespec_subtract(&diff, &mi->ts_rx_final, &mi->ts_sent); else @@ -536,6 +516,7 @@ void *measure_thread(void *arg) struct timespec timeout; struct sockaddr_can addr; sigset_t set; + int consecutive_timeouts = 0; MEMSET_ZERO(pfd); @@ -582,6 +563,8 @@ void *measure_thread(void *arg) if (opt.oneattime) SEND(); + get_tstamp(&stats.tic); + while (!finish_flag && (opt.count == 0 || count < opt.count || msg_in_progress != 0)) { @@ -600,7 +583,13 @@ void *measure_thread(void *arg) SEND(); } } else { - error(1, 0, "poll timeout"); + /* Lost message - send a new one */ + stats.timeouts++; + consecutive_timeouts++; + if (consecutive_timeouts < 10) + SEND(); + else /* Something is really broken */ + finish_flag = 1; } break; default: // Event @@ -613,13 +602,16 @@ void *measure_thread(void *arg) } pfd[0].revents = 0; - if (num_interfaces == 3 && pfd[1].revents != 0) { + if (num_interfaces == 3 && pfd[1].revents & POLLIN) { process_on_wire_rx(pfd[1].fd); pfd[1].revents = 0; } + if (num_interfaces == 3 && pfd[1].revents & ~POLLIN) + error(1, 0, "Unexpected pfd[1].revents: 0x%04x\n", pfd[1].revents); i = (num_interfaces == 2) ? 1 : 2; - if (pfd[i].revents != 0) { + if (pfd[i].revents & POLLIN) { + consecutive_timeouts = 0; process_final_rx(pfd[i].fd); msg_in_progress--; pfd[i].revents = 0; @@ -628,9 +620,13 @@ void *measure_thread(void *arg) SEND(); } } + if (pfd[i].revents & ~POLLIN) + error(1, 0, "Unexpected pfd[%d].revents: 0x%04x\n", pfd[i].revents); } } + get_tstamp(&stats.tac); + for (i=0; i