summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2014-10-10 21:53:07 +0200
committerGravatar Nikias Bassen2014-10-10 21:53:07 +0200
commitef914f101de98af51063979448e971fdf6c96ce8 (patch)
tree95a31a4a553773ed61030c80eaf9b82b96d4c145
parent471b2261e73c5a65049a5c842369ec3de613850c (diff)
downloadlibusbmuxd-ef914f101de98af51063979448e971fdf6c96ce8.tar.gz
libusbmuxd-ef914f101de98af51063979448e971fdf6c96ce8.tar.bz2
inotify: Work around race condition by adding a retry loop
In certain circumstances usbmuxd might not have been started up when the socket file creation event has occured. This causes connect_usbmuxd_socket() to fail and usbmuxd_listen_inotify() is invoked again, but the socket file creation event will not occur anymore. To fix this we retry to connect to usbmuxd after waiting a second in case the first connection attempt failed (with a maximum of 10 retries).
-rw-r--r--src/libusbmuxd.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/libusbmuxd.c b/src/libusbmuxd.c
index d38d850..af8636b 100644
--- a/src/libusbmuxd.c
+++ b/src/libusbmuxd.c
@@ -574,7 +574,14 @@ static int usbmuxd_listen_inotify()
pevent->len &&
pevent->name[0] != 0 &&
strcmp(pevent->name, USBMUXD_SOCKET_NAME) == 0) {
- sfd = connect_usbmuxd_socket ();
+ /* retry if usbmuxd isn't ready yet */
+ int retry = 10;
+ while (--retry >= 0) {
+ if ((sfd = connect_usbmuxd_socket ()) >= 0) {
+ break;
+ }
+ sleep(1);
+ }
goto end;
}
i += EVENT_SIZE + pevent->len;