log: fix kept_alive() and report expired timeout 05/5705/3
authorAntonio Borneo <borneo.antonio@gmail.com>
Fri, 29 May 2020 10:00:35 +0000 (12:00 +0200)
committerAntonio Borneo <borneo.antonio@gmail.com>
Sat, 6 Jun 2020 17:04:14 +0000 (18:04 +0100)
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
src/helper/log.c

index 380f548..3112255 100644 (file)
@@ -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 */