Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a805519c authored by Mike Lockwood's avatar Mike Lockwood
Browse files

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: default avatarMike Lockwood <lockwood@android.com>

Change-Id: I14954b9fcc84239950ead6bdc1a0a888882c2226
parent d5c4d2ae
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -42,6 +42,11 @@ typedef int (* usb_device_added_cb)(const char *dev_name, void *client_data);
 */
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 @@ void usb_host_cleanup(struct usb_host_context *context);
 * 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 */
+3 −0
Original line number Diff line number Diff line
@@ -144,6 +144,7 @@ void usb_host_cleanup(struct usb_host_context *context)
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 @@ void usb_host_run(struct usb_host_context *context,

    /* 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));