If we get a restart message in avalon_gets still check if there's a receive message to parse first without a timeout before returning AVA_GETS_RESTART.
diff --git a/driver-avalon.c b/driver-avalon.c
index 3c8c7eb..5b4d106 100644
--- a/driver-avalon.c
+++ b/driver-avalon.c
@@ -209,9 +209,17 @@ static inline int avalon_gets(int fd, uint8_t *buf, struct thr_info *thr,
ssize_t ret = 0;
while (true) {
- struct timeval timeout = {0, 100000};
+ struct timeval timeout;
fd_set rd;
+ timeout.tv_sec = 0;
+ /* If we get a restart message, still check if there's
+ * anything in the buffer waiting to be parsed */
+ if (unlikely(thr->work_restart))
+ timeout.tv_usec = 0;
+ else
+ timeout.tv_usec = 100000;
+
FD_ZERO(&rd);
FD_SET(fd, &rd);
ret = select(fd + 1, &rd, NULL, NULL, &timeout);
@@ -232,7 +240,7 @@ static inline int avalon_gets(int fd, uint8_t *buf, struct thr_info *thr,
continue;
}
- if (thr->work_restart) {
+ if (unlikely(thr->work_restart)) {
applog(LOG_DEBUG, "Avalon: Work restart");
return AVA_GETS_RESTART;
}