Add wall clock timeout warning to mpsse_flush() 67/4767/4
authorTim Newsome <tim@sifive.com>
Wed, 14 Nov 2018 19:55:09 +0000 (11:55 -0800)
committerSpencer Oliver <spen@spen-soft.co.uk>
Tue, 15 Oct 2019 07:58:56 +0000 (08:58 +0100)
I think that libusb_handle_events_timeout_completed is supposed to make
progress or time out, but sometimes we hit a case where it makes no
progress, and mpsse_flush() loops forever. This wall clock timeout
notifies the user that this is going on.

When I wrote this code, this bug would reproduce every hour or two, but
right now it's not happening for me.

Change-Id: I7eb66f43462298e263a48048aa0c8769095661eb
Signed-off-by: Tim Newsome <tim@sifive.com>
Reviewed-on: http://openocd.zylin.com/4767
Tested-by: jenkins
Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
src/jtag/drivers/mpsse.c

index a881803..7488d9d 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "mpsse.h"
 #include "helper/log.h"
+#include "helper/time_support.h"
 #include <libusb.h>
 
 /* Compatibility define for older libusb-1.0 */
@@ -888,6 +889,8 @@ int mpsse_flush(struct mpsse_ctx *ctx)
        }
 
        /* Polling loop, more or less taken from libftdi */
+       int64_t start = timeval_ms();
+       int64_t warn_after = 2000;
        while (!write_result.done || !read_result.done) {
                struct timeval timeout_usb;
 
@@ -910,6 +913,13 @@ int mpsse_flush(struct mpsse_ctx *ctx)
                                        break;
                        }
                }
+
+               int64_t now = timeval_ms();
+               if (now - start > warn_after) {
+                       LOG_WARNING("Haven't made progress in mpsse_flush() for %" PRId64
+                                       "ms.", now - start);
+                       warn_after *= 2;
+               }
        }
 
 error_check: