From: Tim Newsome Date: Wed, 14 Nov 2018 19:55:09 +0000 (-0800) Subject: Add wall clock timeout warning to mpsse_flush() X-Git-Tag: v0.11.0-rc1~592 X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=commitdiff_plain;h=d214cadfef7ba75c7c52849c7946d32f0ad8b668 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 --- diff --git a/src/jtag/drivers/mpsse.c b/src/jtag/drivers/mpsse.c index a881803adf..7488d9dd87 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: