diff options
Diffstat (limited to 'src/helper')
-rw-r--r-- | src/helper/log.c | 45 | ||||
-rw-r--r-- | src/helper/log.h | 2 |
2 files changed, 47 insertions, 0 deletions
diff --git a/src/helper/log.c b/src/helper/log.c index e9c1fa20..0a416244 100644 --- a/src/helper/log.c +++ b/src/helper/log.c @@ -40,6 +40,9 @@ int debug_level = -1; static FILE* log_output; static log_callback_t *log_callbacks = NULL; +static long long last_time; +static long long current_time; + static long long start; static char *log_strings[5] = @@ -229,6 +232,8 @@ int log_init(struct command_context_s *cmd_ctx) log_output = stderr; } + start=last_time=timeval_ms(); + return ERROR_OK; } @@ -327,3 +332,43 @@ char *alloc_printf(const char *format, ...) va_end(ap); return string; } + +/* Code must return to the server loop before 1000ms has returned or invoke + * this function. + * + * The GDB connection will time out if it spends >2000ms and you'll get nasty + * error messages from GDB: + * + * Ignoring packet error, continuing... + * Reply contains invalid hex digit 116 + * + * While it is possible use "set remotetimeout" to more than the default 2000ms + * in GDB, OpenOCD guarantees that it sends keep-alive packages on the + * GDB protocol and it is a bug in OpenOCD not to either return to the server + * loop or invoke keep_alive() every 1000ms. + * + * This function will send a keep alive packet if >500ms has passed since last time + * it was invoked. + * + */ +void keep_alive() +{ + current_time=timeval_ms(); + if (current_time-last_time>1000) + { + LOG_WARNING("keep_alive() was not invoked in the 1000ms timelimit. GDB alive packet not sent! (%d)", current_time-last_time); + last_time=current_time; + } else if (current_time-last_time>500) + { + /* this will keep the GDB connection alive */ + LOG_USER_N("%s", ""); + last_time=current_time; + } +} + +/* reset keep alive timer without sending message */ +void kept_alive() +{ + current_time=timeval_ms(); + last_time=current_time; +} diff --git a/src/helper/log.h b/src/helper/log.h index 37490a86..7a7c90cb 100644 --- a/src/helper/log.h +++ b/src/helper/log.h @@ -56,6 +56,8 @@ __attribute__ ((format (printf, 5, 6))); extern int log_register_commands(struct command_context_s *cmd_ctx); extern int log_init(struct command_context_s *cmd_ctx); extern int set_log_output(struct command_context_s *cmd_ctx, FILE *output); +extern void keep_alive(); +extern void kept_alive(); typedef void (*log_callback_fn)(void *priv, const char *file, int line, const char *function, const char *string); |