libusbhost: Add callback to usb_host_run to notify when initial device discovery is done

This can be used to eliminate race conditions in clients that operate immediately
on the currently connected device list.

Signed-off-by: Mike Lockwood <lockwood@android.com>

Change-Id: I14954b9fcc84239950ead6bdc1a0a888882c2226
diff --git a/include/usbhost/usbhost.h b/include/usbhost/usbhost.h
index c6a443c..7432277 100644
--- a/include/usbhost/usbhost.h
+++ b/include/usbhost/usbhost.h
@@ -42,6 +42,11 @@
  */
 typedef int (* usb_device_removed_cb)(const char *dev_name, void *client_data);
 
+/* Callback indicating that initial device discovery is done.
+ * Return true to exit from usb_host_run.
+ */
+typedef int (* usb_discovery_done_cb)(void *client_data);
+
 /* Call this to initialize the USB host library. */
 struct usb_host_context *usb_host_init(void);
 
@@ -54,10 +59,13 @@
  * added_cb will be called immediately for each existing USB device,
  * and subsequently each time a new device is added.
  * removed_cb is called when USB devices are removed from the bus.
+ * discovery_done_cb is called after the initial discovery of already
+ * connected devices is complete.
  */
 void usb_host_run(struct usb_host_context *context,
                   usb_device_added_cb added_cb,
                   usb_device_removed_cb removed_cb,
+                  usb_discovery_done_cb discovery_done_cb,
                   void *client_data);
 
 /* Creates a usb_device object for a USB device */
diff --git a/libusbhost/usbhost.c b/libusbhost/usbhost.c
index efd3103..f5ec140 100644
--- a/libusbhost/usbhost.c
+++ b/libusbhost/usbhost.c
@@ -144,6 +144,7 @@
 void usb_host_run(struct usb_host_context *context,
                   usb_device_added_cb added_cb,
                   usb_device_removed_cb removed_cb,
+                  usb_discovery_done_cb discovery_done_cb,
                   void *client_data)
 {
     struct inotify_event* event;
@@ -174,6 +175,8 @@
 
     /* check for existing devices first, after we have inotify set up */
     done = find_existing_devices(added_cb, removed_cb, client_data);
+    if (discovery_done_cb)
+        done |= discovery_done_cb(client_data);
 
     while (!done) {
         ret = read(context->fd, event_buf, sizeof(event_buf));