]> rtime.felk.cvut.cz Git - can-benchmark.git/blobdiff - latester/latester.c
Document ENOBUFS problem
[can-benchmark.git] / latester / latester.c
index ab8f39d401d23a96c192a4bb5e20163dfb88beba..f3ba4c60414b98ec7f3f0cc74ee8a2309b71d59c 100644 (file)
@@ -75,6 +75,7 @@ struct options opt = {
 struct {
        unsigned enobufs;
        unsigned overrun;
+       unsigned lost;
 } stats;
 
 int num_interfaces = 0;
@@ -387,6 +388,22 @@ int send_frame(int socket)
        return ret;
 }
 
+static inline send_and_check(int s)
+{
+       int ret;
+       ret = send_frame(s);
+       if (ret != sizeof(struct can_frame)) {
+/*             if (ret == -1 && errno == ENOBUFS && opt.period_us == 0 && !opt.oneattime) { */
+/*                     stats.enobufs++; */
+/*                     /\* Ignore this error - pfifo_fast qeuue is full *\/ */
+/*             } else */
+                       error(1, errno, "send_frame (line %d)", __LINE__);
+       } else {
+               count++;
+               msg_in_progress++;
+       }
+}
+
 static inline void get_next_timeout(struct timespec *timeout)
 {
        struct timespec now;
@@ -542,26 +559,10 @@ void *measure_thread(void *arg)
 
        set_sched_policy_and_prio(SCHED_FIFO, 40);
 
-#define SEND()                                                         \
-       do {                                                            \
-               ret = send_frame(pfd[0].fd);                            \
-               if (ret != sizeof(struct can_frame)) {                  \
-                       if (ret == -1 && errno == ENOBUFS && opt.period_us == 0 && !opt.oneattime) { \
-                               stats.enobufs++;                        \
-                               /* Ignore this error - pfifo_fast qeuue is full */ \
-                       } else                                          \
-                               error(1, errno, "send_frame (line %d)", __LINE__); \
-               }                                                       \
-               else {                                                  \
-                       count++;                                        \
-                       msg_in_progress++;                              \
-               }                                                       \
-       } while (0)
-
-       if (opt.oneattime) {
+#define SEND() send_and_check(pfd[0].fd)
+
+       if (opt.oneattime)
                SEND();
-               count = 1;
-       }
 
        while (!finish_flag &&
               (opt.count == 0 || count < opt.count || msg_in_progress != 0)) {
@@ -713,7 +714,7 @@ int main(int argc, const char *argv[])
 
        pthread_create(&thread, 0, measure_thread, NULL);
 
-       struct timespec next, now, diff;
+       struct timespec next, now, diff, allsent = {0,0};
        clock_gettime(CLOCK_MONOTONIC, &next);
        int completed = 0;
        while (!finish_flag && (opt.count == 0 || completed < opt.count)) {
@@ -744,10 +745,18 @@ int main(int argc, const char *argv[])
                                next.tv_sec++;
                        }
                }
+               if (opt.count != 0 && count >= opt.count) {
+                       if (allsent.tv_sec == 0)
+                               allsent = now;
+                       if (now.tv_sec - allsent.tv_sec >= 2)
+                               finish_flag = 1;
+               }
        }
        print_progress();
        printf("\n");
 
+       stats.lost = msg_in_progress;
+
        pthread_join(thread, NULL);
 
        close(completion_pipe[0]);
@@ -764,6 +773,8 @@ int main(int argc, const char *argv[])
                printf("overrun=%d\n", stats.overrun);
        if (stats.enobufs)
                printf("enobufs=%d\n", stats.enobufs);
+       if (stats.lost)
+               printf("lost=%d\n", stats.enobufs);
 
        return 0;
 }