X-Git-Url: http://rtime.felk.cvut.cz/gitweb/can-benchmark.git/blobdiff_plain/43d1fc38b83d1aadfd22263a5930caaf8e0c584c..8fffb6b47784e561197f78dd8424f2cd2a1fcd1e:/latester/latester.c diff --git a/latester/latester.c b/latester/latester.c index 6a78872..24015f1 100644 --- a/latester/latester.c +++ b/latester/latester.c @@ -62,6 +62,7 @@ struct options { char *name; int length; int userhist; + int quiet; /* Temporary variables */ FILE *f_msgs; @@ -80,6 +81,7 @@ struct { unsigned enobufs; unsigned overrun; unsigned lost; + struct timespec tic, tac; } stats; int num_interfaces = 0; @@ -162,12 +164,14 @@ void msg_info_print(FILE *f, struct msg_info *mi) #define S(ts) tstamp_str(local, &ts) #define DIFF(a, b) (timespec_subtract(&diff, &b, &a), S(diff)) - if (num_interfaces == 2) + switch (num_interfaces) { + case 2: fprintf(f, "%ld: %s %s -> %s (%s) %s = %s (%s)\n", num, S(mi->ts_sent), sent, S(mi->ts_rx_final_kern), S(mi->ts_rx_final), received, DIFF(mi->ts_sent, mi->ts_rx_final_kern), DIFF(mi->ts_sent, mi->ts_rx_final)); - else + break; + case 3: fprintf(f, "%ld: %s %s -> %s (%s) -> %s (%s) %s = %s (%s), %s (%s)\n", num, S(mi->ts_sent), sent, S(mi->ts_rx_onwire_kern), S(mi->ts_rx_onwire), @@ -176,6 +180,8 @@ void msg_info_print(FILE *f, struct msg_info *mi) DIFF(mi->ts_sent, mi->ts_rx_onwire), DIFF(mi->ts_rx_onwire_kern, mi->ts_rx_final_kern), DIFF(mi->ts_rx_onwire, mi->ts_rx_final)); + break; + } #undef S #undef DIFF num++; @@ -191,14 +197,18 @@ int msg_info_store(FILE *f, struct msg_info *mi) #define S(ts) tstamp_str(local, &ts) #define DIFF(a, b) (timespec_subtract(&diff, &b, &a), S(diff)) - if (num_interfaces == 2) + 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)); - else + 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); @@ -241,16 +251,22 @@ void dbg_print_timespec(char *msg, struct timespec *tv) static inline unsigned get_msg_latency_us(struct msg_info *mi) { struct timespec diff; - if (num_interfaces == 3) + switch (num_interfaces) { + case 2: 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); - else + break; + case 3: if (opt.userhist) timespec_subtract(&diff, &mi->ts_rx_final, &mi->ts_sent); else timespec_subtract(&diff, &mi->ts_rx_final_kern, &mi->ts_sent); + break; + default: + return 0; + } return diff.tv_sec * 1000000 + diff.tv_nsec/1000; } @@ -387,7 +403,7 @@ int send_frame(int socket) ret = write(socket, &frame, sizeof(frame)); trace_off(ret); - if (ret == -1) + if (ret == -1 || num_interfaces == 1) msg_info_free(mi); return ret; } @@ -567,6 +583,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)) { @@ -616,6 +634,8 @@ void *measure_thread(void *arg) } } + get_tstamp(&stats.tac); + for (i=0; i 3) - error(1, 0, "-d option must be given exactly 2 or 3 times"); + if (num_interfaces < 1 || num_interfaces > 3) + error(1, 0, "-d option must only be given one, two or three times"); if (opt.oneattime && opt.period_us) error(1, 0, "oneattime and period cannot be specified at the same time"); @@ -693,8 +714,13 @@ int parse_options(int argc, const char *argv[]) void print_progress() { - printf("\rSent %5d, in progress %5d", count, msg_in_progress); - fflush(stdout); + if (! opt.quiet) { + if (num_interfaces > 1) + printf("\rSent %5d, in progress %5d", count, msg_in_progress); + else + printf("\rSent %5d", count); + fflush(stdout); + } } int main(int argc, const char *argv[]) @@ -765,7 +791,8 @@ int main(int argc, const char *argv[]) } } print_progress(); - printf("\n"); + if (!opt.quiet) + printf("\n"); stats.lost = msg_in_progress; @@ -778,16 +805,24 @@ int main(int argc, const char *argv[]) fclose(opt.f_hist); fclose(opt.f_msgs); + + fprintf(opt.f_stat, "cmdline='"); + for (i=0; i