From e089e5d0babf73e020107d2cb91dbdcae4a12f8b Mon Sep 17 00:00:00 2001 From: Oliver Hartkopp Date: Thu, 25 Feb 2010 20:53:19 +0000 Subject: [PATCH] Added commandline option '-p ' to enable polling on the writing socket. Inspired by Marc Kleine-Budde :-) --- cangen.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/cangen.c b/cangen.c index fd9e9a5..df6b77f 100644 --- a/cangen.c +++ b/cangen.c @@ -51,6 +51,7 @@ #include #include #include +#include #include #include #include @@ -92,6 +93,8 @@ void print_usage(char *prg) " generation mode - see below)\n"); fprintf(stderr, " -D (CAN data (payload)" " generation mode - see below)\n"); + fprintf(stderr, " -p (poll on -ENOBUFS to write frames" + " with ms)\n"); fprintf(stderr, " -i (ignore -ENOBUFS return values on" " write() syscalls)\n"); fprintf(stderr, " -x (disable local loopback of " @@ -114,6 +117,8 @@ void print_usage(char *prg) fprintf(stderr, "(fixed CAN data payload and length)\n"); fprintf(stderr, "%s vcan0 -g 0 -i -x ", prg); fprintf(stderr, "(full load test ignoring -ENOBUFS)\n"); + fprintf(stderr, "%s vcan0 -g 0 -p 10 -x ", prg); + fprintf(stderr, "(full load test with polling, 10ms timeout)\n"); fprintf(stderr, "%s vcan0 ", prg); fprintf(stderr, "(my favourite default :)\n\n"); } @@ -126,6 +131,7 @@ void sigterm(int signo) int main(int argc, char **argv) { unsigned long gap = DEFAULT_GAP; + unsigned long polltimeout = 0; unsigned char ignore_enobufs = 0; unsigned char extended = 0; unsigned char id_mode = MODE_RANDOM; @@ -137,6 +143,7 @@ int main(int argc, char **argv) int opt; int s; /* socket */ + struct pollfd fds; struct sockaddr_can addr; static struct can_frame frame; @@ -150,7 +157,7 @@ int main(int argc, char **argv) signal(SIGHUP, sigterm); signal(SIGINT, sigterm); - while ((opt = getopt(argc, argv, "ig:eI:L:D:xvh?")) != -1) { + while ((opt = getopt(argc, argv, "ig:eI:L:D:xp:vh?")) != -1) { switch (opt) { case 'i': @@ -209,6 +216,10 @@ int main(int argc, char **argv) loopback_disable = 1; break; + case 'p': + polltimeout = strtoul(optarg, NULL, 10); + break; + case '?': case 'h': default: @@ -284,6 +295,11 @@ int main(int argc, char **argv) return 1; } + if (polltimeout) { + fds.fd = s; + fds.events = POLLOUT; + } + while (running) { if (id_mode == MODE_RANDOM) { @@ -331,11 +347,18 @@ int main(int argc, char **argv) perror("write"); return 1; } - if (!ignore_enobufs) { + if (!ignore_enobufs && !polltimeout) { perror("write"); return 1; } - enobufs_count++; + if (polltimeout) { + /* wait for the write socket (with timeout) */ + if (poll(&fds, 1, polltimeout) < 0) { + perror("poll"); + return 1; + } + } else + enobufs_count++; } else if (nbytes < sizeof(struct can_frame)) { fprintf(stderr, "write: incomplete CAN frame\n"); -- 2.39.2