From d214cadfef7ba75c7c52849c7946d32f0ad8b668 Mon Sep 17 00:00:00 2001 From: Tim Newsome Date: Wed, 14 Nov 2018 11:55:09 -0800 Subject: [PATCH] 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 Reviewed-on: http://openocd.zylin.com/4767 Tested-by: jenkins Reviewed-by: Andreas Fritiofson --- src/jtag/drivers/mpsse.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/jtag/drivers/mpsse.c b/src/jtag/drivers/mpsse.c index a881803ad..7488d9dd8 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 /* 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: