diff options
author | Andrew Goodney <agoodney@yahoo.com> | 2021-12-27 20:34:05 -0800 |
---|---|---|
committer | Nathan Hjelm <hjelmn@google.com> | 2022-01-18 15:32:24 -0700 |
commit | c1ed5895438f2ae3767162f74388b09a16ab0800 (patch) | |
tree | 70f824305d29dab77b0cee0dc027701f257815df /libusb/os/darwin_usb.c | |
parent | f2b218b61867f27568ba74fa38e156e5f55ed825 (diff) | |
download | libusb-c1ed5895438f2ae3767162f74388b09a16ab0800.tar.gz |
The current code for calculating the timeout in darwin_reenumerate_device_timeout() doesn't calculate elapsed microseconds, it counts the number of times the loop runs.
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>
Diffstat (limited to 'libusb/os/darwin_usb.c')
-rw-r--r-- | libusb/os/darwin_usb.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/libusb/os/darwin_usb.c b/libusb/os/darwin_usb.c index c64ecd1..903422c 100644 --- a/libusb/os/darwin_usb.c +++ b/libusb/os/darwin_usb.c @@ -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; |