aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Borneo <borneo.antonio@gmail.com>2020-05-29 12:00:35 +0200
committerAntonio Borneo <borneo.antonio@gmail.com>2020-06-06 18:04:14 +0100
commit1fa66d3633862d824420fb90b5b63e41e415d70e (patch)
tree5b2b3f2239184219eae5fad97e5e3a496521eac5
parentffc1ca4b91757911c53d5dc86cae55eb00d858d5 (diff)
downloadriscv-openocd-1fa66d3633862d824420fb90b5b63e41e415d70e.zip
riscv-openocd-1fa66d3633862d824420fb90b5b63e41e415d70e.tar.gz
riscv-openocd-1fa66d3633862d824420fb90b5b63e41e415d70e.tar.bz2
log: fix kept_alive() and report expired timeout
The kept_alive() function is called to inform the keep-alive code that a keep-alive as been just kicked through some other path. But kept_alive() erroneously resets the timeout counter without checking if it has already expired, thus masking a potential timeout. Check if timeout counter has expired during kept_alive(). While there, put the timeout values in macros and explicit the units in the timeout messages. Change-Id: Iaf6368b44e5b5352b1cc4e7efbb2368575dcfa08 Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: http://openocd.zylin.com/5705 Reviewed-by: <jonatan_zeidler@gmx.de> Tested-by: jenkins
-rw-r--r--src/helper/log.c56
1 files changed, 39 insertions, 17 deletions
diff --git a/src/helper/log.c b/src/helper/log.c
index 380f548..3112255 100644
--- a/src/helper/log.c
+++ b/src/helper/log.c
@@ -401,25 +401,43 @@ char *alloc_printf(const char *format, ...)
* fast when invoked more often than every 500ms.
*
*/
+#define KEEP_ALIVE_KICK_TIME_MS 500
+#define KEEP_ALIVE_TIMEOUT_MS 1000
+
+static void gdb_timeout_warning(int64_t delta_time)
+{
+ extern int gdb_actual_connections;
+
+ if (gdb_actual_connections)
+ LOG_WARNING("keep_alive() was not invoked in the "
+ "%d ms timelimit. GDB alive packet not "
+ "sent! (%" PRId64 " ms). Workaround: increase "
+ "\"set remotetimeout\" in GDB",
+ KEEP_ALIVE_TIMEOUT_MS,
+ delta_time);
+ else
+ LOG_DEBUG("keep_alive() was not invoked in the "
+ "%d ms timelimit (%" PRId64 " ms). This may cause "
+ "trouble with GDB connections.",
+ KEEP_ALIVE_TIMEOUT_MS,
+ delta_time);
+}
+
void keep_alive(void)
{
current_time = timeval_ms();
- if (current_time-last_time > 1000) {
- extern int gdb_actual_connections;
-
- if (gdb_actual_connections)
- LOG_WARNING("keep_alive() was not invoked in the "
- "1000ms timelimit. GDB alive packet not "
- "sent! (%" PRId64 "). Workaround: increase "
- "\"set remotetimeout\" in GDB",
- current_time-last_time);
- else
- LOG_DEBUG("keep_alive() was not invoked in the "
- "1000ms timelimit (%" PRId64 "). This may cause "
- "trouble with GDB connections.",
- current_time-last_time);
+
+ int64_t delta_time = current_time - last_time;
+
+ if (delta_time > KEEP_ALIVE_TIMEOUT_MS) {
+ last_time = current_time;
+
+ gdb_timeout_warning(delta_time);
}
- if (current_time-last_time > 500) {
+
+ if (delta_time > KEEP_ALIVE_KICK_TIME_MS) {
+ last_time = current_time;
+
/* this will keep the GDB connection alive */
LOG_USER_N("%s", "");
@@ -430,8 +448,6 @@ void keep_alive(void)
*
* These functions should be invoked at a well defined spot in server.c
*/
-
- last_time = current_time;
}
}
@@ -439,7 +455,13 @@ void keep_alive(void)
void kept_alive(void)
{
current_time = timeval_ms();
+
+ int64_t delta_time = current_time - last_time;
+
last_time = current_time;
+
+ if (delta_time > KEEP_ALIVE_TIMEOUT_MS)
+ gdb_timeout_warning(delta_time);
}
/* if we sleep for extended periods of time, we must invoke keep_alive() intermittantly */