* Copyright (C) 2005 by Dominic Rath *
* Dominic.Rath@gmx.de *
* *
+ * Copyright (C) 2007,2008 Øyvind Harboe *
+ * oyvind.harboe@zylin.com *
+ * *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
#include "log.h"
#include "configuration.h"
#include "time_support.h"
+#include "command.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
-#ifndef _WIN32
+
+#define PRINT_MEM() 0
+#if PRINT_MEM()
#include <malloc.h>
#endif
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] =
{
/* print with count and time information */
int t=(int)(timeval_ms()-start);
-#ifndef _WIN32
+#if PRINT_MEM()
struct mallinfo info;
info = mallinfo();
#endif
fprintf(log_output, "%s %d %d %s:%d %s()"
-#ifndef _WIN32
+#if PRINT_MEM()
" %d"
#endif
": %s", log_strings[level+1], count, t, file, line, function,
-#ifndef _WIN32
+#if PRINT_MEM()
info.fordblks,
#endif
string);
}
else
{
- /* do not print count and time */
- fprintf(log_output, "%s %s:%d %s(): %s", log_strings[level+1], file, line, function, string);
+ if (strcmp(string, "\n")!=0)
+ {
+ /* print human readable output - but skip empty lines */
+ fprintf(log_output, "%s%s",
+ (level > LOG_LVL_USER)?log_strings[level+1]:"", string);
+ }
}
} else
{
log_output = stderr;
}
+ start=last_time=timeval_ms();
+
return ERROR_OK;
}
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("BUG: keep_alive() was not invoked in the 1000ms timelimit. GDB alive packet not sent! (%lld)", 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;
+ }
+
+ /* also process TCL events (we have to do this from 'log.c' since its
+ * keep_alive() is the only routine guaranteed to be called at least
+ * once per second :( */
+ process_jim_events ();
+}
+
+/* reset keep alive timer without sending message */
+void kept_alive()
+{
+ current_time=timeval_ms();
+ last_time=current_time;
+}
+
+/* if we sleep for extended periods of time, we must invoke keep_alive() intermittantly */
+void alive_sleep(int ms)
+{
+ int i;
+ for (i=0; i<ms; i+=500)
+ {
+ int sleep_a_bit=ms-i;
+ if (sleep_a_bit>500)
+ {
+ sleep_a_bit=500;
+ }
+ keep_alive();
+ usleep(sleep_a_bit*1000);
+ keep_alive();
+ }
+}