The current code for calculating the timeout in darwin_reenumerate_device_timeout...
authorAndrew Goodney <agoodney@yahoo.com>
Tue, 28 Dec 2021 04:34:05 +0000 (20:34 -0800)
committerNathan Hjelm <hjelmn@google.com>
Tue, 18 Jan 2022 22:32:24 +0000 (15:32 -0700)
This results in very long timeouts.

This PR uses clock_gettime(CLOCK_MONOTONIC, ...) to calculate the elapsed time

Closes #1035

Signed-off-by: Nathan Hjelm <hjelmn@google.com>
libusb/os/darwin_usb.c
libusb/version_nano.h

index c64ecd1..903422c 100644 (file)
@@ -1753,7 +1753,6 @@ static int darwin_reenumerate_device (struct libusb_device_handle *dev_handle, b
   IOUSBConfigurationDescriptor *cached_configurations;
   IOReturn kresult;
   UInt8 i;
-  UInt32 time;
 
   struct libusb_context *ctx = HANDLE_CTX (dev_handle);
 
@@ -1801,11 +1800,18 @@ static int darwin_reenumerate_device (struct libusb_device_handle *dev_handle, b
 
   usbi_dbg (ctx, "darwin/reenumerate_device: waiting for re-enumeration to complete...");
 
-  time = 0;
+  struct timespec start;
+  clock_gettime(CLOCK_MONOTONIC, &start);
+
   while (dpriv->in_reenumerate) {
     struct timespec delay = {.tv_sec = 0, .tv_nsec = 1000};
     nanosleep (&delay, NULL);
-    if (time++ >= DARWIN_REENUMERATE_TIMEOUT_US) {
+
+    struct timespec now;
+    clock_gettime(CLOCK_MONOTONIC, &now);
+    UInt32 elapsed = (now.tv_sec - start.tv_sec) * 1000000 + (now.tv_nsec - start.tv_nsec) / 1000;
+
+    if (elapsed >= DARWIN_REENUMERATE_TIMEOUT_US) {
       usbi_err (ctx, "darwin/reenumerate_device: timeout waiting for reenumerate");
       dpriv->in_reenumerate = false;
       return LIBUSB_ERROR_TIMEOUT;
index b129143..30643ff 100644 (file)
@@ -1 +1 @@
-#define LIBUSB_NANO 11681
+#define LIBUSB_NANO 11683