diff options
| author | 2014-10-10 21:53:07 +0200 | |
|---|---|---|
| committer | 2014-10-10 21:53:07 +0200 | |
| commit | ef914f101de98af51063979448e971fdf6c96ce8 (patch) | |
| tree | 95a31a4a553773ed61030c80eaf9b82b96d4c145 /src/libusbmuxd.c | |
| parent | 471b2261e73c5a65049a5c842369ec3de613850c (diff) | |
| download | libusbmuxd-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).
Diffstat (limited to 'src/libusbmuxd.c')
| -rw-r--r-- | src/libusbmuxd.c | 9 | 
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; | 
