latester: Do not fail on a single lost message in "oneatatime" mode
authorMichal Sojka <sojkam1@fel.cvut.cz>
Fri, 10 Dec 2010 16:55:54 +0000 (17:55 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Fri, 10 Dec 2010 16:55:54 +0000 (17:55 +0100)
Also exit after 10 consecutive lost messages (i.e. after 10 seconds
by default)

latester/latester.c

index a6873b9..bdd539c 100644 (file)
@@ -82,6 +82,7 @@ struct {
        unsigned overrun;
        unsigned lost;
        struct timespec tic, tac;
+       unsigned timeouts;
 } stats;
 
 int num_interfaces = 0;
@@ -510,6 +511,7 @@ void *measure_thread(void *arg)
        struct timespec timeout;
        struct sockaddr_can addr;
        sigset_t set;
+       int consecutive_timeouts = 0;
 
        MEMSET_ZERO(pfd);
 
@@ -576,7 +578,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
@@ -596,6 +604,7 @@ void *measure_thread(void *arg)
 
                        i = (num_interfaces == 2) ? 1 : 2;
                        if (pfd[i].revents != 0) {
+                               consecutive_timeouts = 0;
                                process_final_rx(pfd[i].fd);
                                msg_in_progress--;
                                pfd[i].revents = 0;
@@ -797,6 +806,9 @@ int main(int argc, const char *argv[])
        fprintf(opt.f_stat, "lost=%d\n", stats.lost);
        if (stats.lost && !opt.quiet)
                printf("lost=%d\n", stats.lost);
+       fprintf(opt.f_stat, "timeouts=%d\n", stats.timeouts);
+       if (stats.timeouts && !opt.quiet)
+               printf("timeouts=%d\n", stats.timeouts);
 
        fclose(opt.f_stat);