From: Michal Sojka Date: Tue, 30 Nov 2010 09:15:42 +0000 (+0100) Subject: Latester can write all measure times to the file X-Git-Tag: fix-allnoconfig~311 X-Git-Url: http://rtime.felk.cvut.cz/gitweb/can-benchmark.git/commitdiff_plain/119d82ff6134622d288d16b507b3a314d8508aea Latester can write all measure times to the file --- diff --git a/gw-tests/gw-nop.sh b/gw-tests/gw-nop.sh index afd53f9..4f9dafb 100755 --- a/gw-tests/gw-nop.sh +++ b/gw-tests/gw-nop.sh @@ -5,7 +5,7 @@ main() { gw="cangw -A -s can0 -d can1" sshgw $gw - latester -d can0 -d can1 -d can2 -o -c $COUNT -h hist.dat + latester -d can0 -d can1 -d can2 -o -c $COUNT -h hist.dat -f time.dat } plot_cmds() { diff --git a/latester/latester.c b/latester/latester.c index dcfb729..63d96e5 100644 --- a/latester/latester.c +++ b/latester/latester.c @@ -10,8 +10,11 @@ #include #include #include +#include +#include #include #include +#include #include #include #include @@ -19,18 +22,16 @@ #include #include #include +#include +#include +#include #include #include -//#include +#include #include -#include -#include -#include + #include #include -#include -#include -#include #include "histogram.h" @@ -56,8 +57,8 @@ struct options { unsigned timeout_ms; unsigned count; unsigned oneattime; - char *file; - char *histogram_fn; + FILE *file; + FILE *histogram; }; struct options opt = { @@ -69,6 +70,7 @@ struct options opt = { int num_interfaces = 0; int count = 0; /* Number of sent messages */ +int completion_pipe[2]; struct msg_info { canid_t id; @@ -128,6 +130,27 @@ void print_msg_info(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); + +#define S(ts) tstamp_str(local, &ts) +#define DIFF(a, b) (timespec_subtract(&diff, &b, &a), S(diff)) + + if (num_interfaces == 2) + fprintf(f, "%d %d %s\n", + mi->id, mi->length, + DIFF(mi->ts_sent, mi->ts_rx_final_kern)); + else + fprintf(f, "%d %d %s\n", + mi->id, mi->length, + DIFF(mi->ts_rx_onwire_kern, mi->ts_rx_final_kern)); +#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. */ @@ -335,17 +358,19 @@ void process_final_rx(int s) struct timespec ts_kern, ts_user, ts_diff; struct can_frame frame; struct msg_info *mi; + int ret; + receive(s, &frame, &ts_kern, &ts_user); mi = frame2info(&frame); mi->ts_rx_final_kern = ts_kern; mi->ts_rx_final = ts_user; - if (opt.histogram_fn) + if (opt.histogram) histogram_add(&histogram, get_msg_latency_us(mi)); - if (0 && !opt.file) - print_msg_info(mi); - msg_info_free(mi); + ret = write(completion_pipe[1], &mi, sizeof(mi)); + if (ret == -1) + error(1, errno, "completion_pipe write"); } void *measure_thread(void *arg) @@ -474,8 +499,8 @@ struct poptOption optionsTable[] = { { "timeout",'t', POPT_ARG_INT|POPT_ARGFLAG_SHOW_DEFAULT, &opt.timeout_ms,0, "Timeout when period is zero", "ms"}, { "oneattime",'o', POPT_ARG_NONE, &opt.oneattime,0, "Send the next message only when the previous was finally received"}, { "verbose",'v', POPT_ARG_NONE, NULL, 'v', "Send the next message only when the previous was finally received"}, -// { "file", 'f', POPT_ARG_STRING, &opt.file, 0, "File where to store results", "filename"}, - { "histogram", 'h', POPT_ARG_STRING, &opt.histogram_fn, 0, "Store histogram in file", "filename"}, + { "file", 'f', POPT_ARG_STRING, NULL, 'f', "File where to store results", "filename"}, + { "histogram", 'h', POPT_ARG_STRING, NULL, 'h', "Store histogram in file", "filename"}, POPT_AUTOHELP { NULL, 0, 0, NULL, 0 } }; @@ -494,6 +519,16 @@ int parse_options(int argc, const char *argv[]) case 'd': num_interfaces++; break; + case 'f': + opt.file = fopen(poptGetOptArg(optCon), "w"); + if (!opt.file) + error(1, errno, "fopen: %s", poptGetOptArg(optCon)); + break; + case 'h': + opt.histogram = fopen(poptGetOptArg(optCon), "w"); + if (!opt.histogram) + error(1, errno, "fopen: %s", poptGetOptArg(optCon)); + break; } } if (c < -1) @@ -518,7 +553,6 @@ int main(int argc, const char *argv[]) pthread_t thread; sigset_t set; int ret; - FILE *fhist; parse_options(argc, argv); @@ -527,32 +561,60 @@ int main(int argc, const char *argv[]) signal(SIGINT, term_handler); signal(SIGTERM, term_handler); - if (opt.histogram_fn) { + if (opt.histogram) { histogram_init(&histogram, 1000000, 1); - fhist = fopen(opt.histogram_fn, "w"); - if (fhist == NULL) - error(1, errno, "open %s", opt.histogram_fn); } - + ret = pipe(completion_pipe); + if (ret == -1) + error(1, errno, "pipe"); + ret = fcntl(completion_pipe[1], F_SETFL, O_NONBLOCK); + if (ret == -1) + error(1, errno, "pipe fcntl"); + pthread_create(&thread, 0, measure_thread, NULL); + struct timespec next, now, diff; + clock_gettime(CLOCK_MONOTONIC, &next); while (!finish_flag && (opt.count == 0 || count < opt.count)) { - if (1 || opt.file) { + struct pollfd pfd[1]; + pfd[0].fd = completion_pipe[0]; + pfd[0].events = POLLIN; + ret = poll(pfd, 1, 100); + if (ret == -1 && !INTERRUPTED_SYSCALL(errno)) + error(1, errno, "poll main"); + if (ret > 0 && (pfd[0].revents & POLLIN)) { + struct msg_info *mi; + read(completion_pipe[0], &mi, sizeof(mi)); + if (opt.file) + msg_info_store(opt.file, mi); + msg_info_free(mi); + } + + clock_gettime(CLOCK_MONOTONIC, &now); + if (timespec_subtract(&diff, &next, &now)) { printf("\rMessage %d", count); fflush(stdout); + next.tv_nsec += 100000000; + while (next.tv_nsec >= 1000000000) { + next.tv_nsec -= 1000000000; + next.tv_sec++; + } } - usleep(100000); } - if (1 || opt.file) - printf("\rMessage %d\n", count); + printf("\rMessage %d\n", count); pthread_join(thread, NULL); - if (opt.histogram_fn) { - histogram_fprint(&histogram, fhist); - fclose(fhist); + close(completion_pipe[0]); + close(completion_pipe[1]); + + if (opt.histogram) { + histogram_fprint(&histogram, opt.histogram); + fclose(opt.histogram); } + if (opt.file) + fclose(opt.file); return 0; }