Attempt to ignore ENOBUFS error
authorMichal Sojka <sojkam1@fel.cvut.cz>
Fri, 3 Dec 2010 16:53:05 +0000 (17:53 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Fri, 3 Dec 2010 16:53:05 +0000 (17:53 +0100)
This is not sucessfull, as the CPU is 100% loaded and the machine is
unresponsible (we have too high priority).

latester/latester.c

index 9f0a466..b3f2002 100644 (file)
@@ -316,6 +316,28 @@ int init_ftrace()
 #endif /* FTRACE */
 }
 
+static inline void trace_on()
+{
+       if (trace_fd >= 0)
+               write(trace_fd, "1", 1);
+}
+
+static inline void trace_off(int ret)
+{
+       if (marker_fd >= 0) {
+               char marker[100];
+               sprintf(marker, "write returned %d\n", ret);
+               write(marker_fd, marker, strlen(marker));
+       }
+       if (trace_fd >= 0)
+               write(trace_fd, "0", 1);
+}
+
+void msg_info_free(struct msg_info *mi)
+{
+       mi->id = -1;
+}
+
 int send_frame(int socket)
 {
        struct can_frame frame;
@@ -350,22 +372,13 @@ int send_frame(int socket)
        get_tstamp(&mi->ts_sent);
        mi->sent = frame;
        
-       if (trace_fd >= 0)
-               write(trace_fd, "1", 1);
+       trace_on();
        ret = write(socket, &frame, sizeof(frame));
-       if (marker_fd >= 0) {
-               char marker[100];
-               sprintf(marker, "write returned %d\n", ret);
-               write(marker_fd, marker, strlen(marker));
-       }
-       if (trace_fd >= 0)
-               write(trace_fd, "0", 1);
-       return ret;
-}
+       trace_off(ret);
 
-void msg_info_free(struct msg_info *mi)
-{
-       mi->id = -1;
+       if (ret == -1)
+               msg_info_free(mi);
+       return ret;
 }
 
 static inline void get_next_timeout(struct timespec *timeout)
@@ -521,13 +534,19 @@ void *measure_thread(void *arg)
 
        set_sched_policy_and_prio(SCHED_FIFO, 99);
 
-#define SEND()                                         \
-       do {                                            \
-               ret = send_frame(pfd[0].fd);            \
-               if (ret != sizeof(struct can_frame))    \
-                       error(1, errno, "send_frame (line %d)", __LINE__); \
-               count++;                                \
-               msg_in_progress++;                      \
+#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) { \
+                               /* 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) {