linux_udev: Retry poll() on EINTR
authorRomain Vimont <rom@rom1v.com>
Tue, 11 Oct 2016 19:51:31 +0000 (21:51 +0200)
committerHans de Goede <hdegoede@redhat.com>
Thu, 3 Nov 2016 18:47:27 +0000 (19:47 +0100)
The poll() syscall may temporarily fail when it is interrupted by a
signal; -1 is returned and errno is set to EINTR.

When this occurred, the udev event thread exited.

Instead, since this is a temporary failure, just try the call again.
<https://www.gnu.org/software/libc/manual/html_node/Interrupted-Primitives.html>

Signed-off-by: Romain Vimont <rom@rom1v.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
libusb/os/linux_udev.c
libusb/version_nano.h

index ea27142..61d953d 100644 (file)
@@ -172,7 +172,11 @@ static void *linux_udev_event_thread_main(void *arg)
 
        usbi_dbg("udev event thread entering.");
 
-       while (poll(fds, 2, -1) >= 0) {
+       while ((r = poll(fds, 2, -1)) >= 0 || errno == EINTR) {
+               if (r < 0) {
+                       /* temporary failure */
+                       continue;
+               }
                if (fds[0].revents & POLLIN) {
                        /* activity on control pipe, read the byte and exit */
                        r = usbi_read(udev_control_pipe[0], &dummy, sizeof(dummy));
index 58cb0fb..10b89fc 100644 (file)
@@ -1 +1 @@
-#define LIBUSB_NANO 11156
+#define LIBUSB_NANO 11157