uloop: handle waker pipe write() return value
authorEyal Birger <eyal.birger@gmail.com>
Mon, 20 Jun 2016 05:36:47 +0000 (08:36 +0300)
committerFelix Fietkau <nbd@nbd.name>
Sun, 26 Jun 2016 11:05:54 +0000 (13:05 +0200)
Recent glibc warns if result of read() or write() is unused.

Added a retry in case of EINTR, all other faults are silently discarded.

Signed-off-by: Eyal Birger <eyal.birger@gmail.com>
-----
- I was not able to reproduce the EINTR case, but it seems to be the right
  thing to do
- Retrying on EAGAIN in this case would be weird as there is no one to read
  from the other end of the pipe. We could call waker_consume() directly but
  since the size of the message is just one byte, I think this would be dead
  code

uloop.c

diff --git a/uloop.c b/uloop.c
index 0b75d4b..1c5bcee 100644 (file)
--- a/uloop.c
+++ b/uloop.c
@@ -387,7 +387,13 @@ static void uloop_handle_processes(void)
 
 static void uloop_signal_wake(void)
 {
-       write(waker_pipe, "w", 1);
+       do {
+               if (write(waker_pipe, "w", 1) < 0) {
+                       if (errno == EINTR)
+                               continue;
+               }
+               break;
+       } while (1);
 }
 
 static void uloop_handle_sigint(int signo)