diff options
author | Tim Newsome <tim@sifive.com> | 2018-11-14 11:55:09 -0800 |
---|---|---|
committer | Spencer Oliver <spen@spen-soft.co.uk> | 2019-10-15 08:58:56 +0100 |
commit | d214cadfef7ba75c7c52849c7946d32f0ad8b668 (patch) | |
tree | 1871abbe5648d5ea9f0c57c8b6a2f9e5fe0d3318 /src | |
parent | 0a13ca1a8a83119a4e1ffba13a6a8d1977591bc5 (diff) |
Add wall clock timeout warning to mpsse_flush()
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>
Diffstat (limited to 'src')
-rw-r--r-- | src/jtag/drivers/mpsse.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/jtag/drivers/mpsse.c b/src/jtag/drivers/mpsse.c index a881803a..7488d9dd 100644 --- a/src/jtag/drivers/mpsse.c +++ b/src/jtag/drivers/mpsse.c @@ -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: |