- Fixed regression introduced in 890 when "fixing warnings" for target_call_timer_callbacks_now().

target_call_timer_callbacks_now() did the same as target_call_timer_callbacks().

- Reduced keep_alive()'s job to only deal with GDB keep  alive problems.

git-svn-id: svn://svn.berlios.de/openocd/trunk@985 b42882b7-edfa-0310-969c-e2dbd0fdcd60
__archive__
oharboe 2008-09-12 07:09:38 +00:00
parent 0ae7f962f8
commit 9b6853bc4c
2 changed files with 36 additions and 34 deletions

View File

@ -61,14 +61,14 @@ static char *log_strings[5] =
static int count = 0; static int count = 0;
/* The log_puts() serves to somewhat different goals: /* The log_puts() serves to somewhat different goals:
* *
* - logging * - logging
* - feeding low-level info to the user in GDB or Telnet * - feeding low-level info to the user in GDB or Telnet
* *
* The latter dictates that strings without newline are not logged, lest there * The latter dictates that strings without newline are not logged, lest there
* will be *MANY log lines when sending one char at the time(e.g. * will be *MANY log lines when sending one char at the time(e.g.
* target_request.c). * target_request.c).
* *
*/ */
static void log_puts(enum log_levels level, const char *file, int line, const char *function, const char *string) static void log_puts(enum log_levels level, const char *file, int line, const char *function, const char *string)
{ {
@ -91,7 +91,7 @@ static void log_puts(enum log_levels level, const char *file, int line, const ch
{ {
/* print with count and time information */ /* print with count and time information */
int t=(int)(timeval_ms()-start); int t=(int)(timeval_ms()-start);
#if PRINT_MEM() #if PRINT_MEM()
struct mallinfo info; struct mallinfo info;
info = mallinfo(); info = mallinfo();
#endif #endif
@ -99,7 +99,7 @@ static void log_puts(enum log_levels level, const char *file, int line, const ch
#if PRINT_MEM() #if PRINT_MEM()
" %d" " %d"
#endif #endif
": %s", log_strings[level+1], count, t, file, line, function, ": %s", log_strings[level+1], count, t, file, line, function,
#if PRINT_MEM() #if PRINT_MEM()
info.fordblks, info.fordblks,
#endif #endif
@ -116,12 +116,12 @@ static void log_puts(enum log_levels level, const char *file, int line, const ch
} }
} else } else
{ {
/* only entire lines are logged. Otherwise it's /* only entire lines are logged. Otherwise it's
* single chars intended for the log callbacks. */ * single chars intended for the log callbacks. */
} }
fflush(log_output); fflush(log_output);
/* Never forward LOG_LVL_DEBUG, too verbose and they can be found in the log if need be */ /* Never forward LOG_LVL_DEBUG, too verbose and they can be found in the log if need be */
if (level <= LOG_LVL_INFO) if (level <= LOG_LVL_INFO)
{ {
@ -154,7 +154,7 @@ void log_printf(enum log_levels level, const char *file, int line, const char *f
log_puts(level, file, line, function, string); log_puts(level, file, line, function, string);
free(string); free(string);
} }
va_end(ap); va_end(ap);
} }
@ -166,9 +166,9 @@ void log_printf_lf(enum log_levels level, const char *file, int line, const char
count++; count++;
if (level > debug_level) if (level > debug_level)
return; return;
va_start(ap, format); va_start(ap, format);
string = alloc_vprintf(format, ap); string = alloc_vprintf(format, ap);
if (string != NULL) if (string != NULL)
{ {
@ -176,7 +176,7 @@ void log_printf_lf(enum log_levels level, const char *file, int line, const char
log_puts(level, file, line, function, string); log_puts(level, file, line, function, string);
free(string); free(string);
} }
va_end(ap); va_end(ap);
} }
@ -208,7 +208,7 @@ int handle_log_output_command(struct command_context_s *cmd_ctx, char *cmd, char
if (argc == 1) if (argc == 1)
{ {
FILE* file = fopen(args[0], "w"); FILE* file = fopen(args[0], "w");
if (file) if (file)
{ {
log_output = file; log_output = file;
@ -234,17 +234,17 @@ int log_init(struct command_context_s *cmd_ctx)
/* set defaults for daemon configuration, if not set by cmdline or cfgfile */ /* set defaults for daemon configuration, if not set by cmdline or cfgfile */
if (debug_level == -1) if (debug_level == -1)
debug_level = LOG_LVL_INFO; debug_level = LOG_LVL_INFO;
if (log_output == NULL) if (log_output == NULL)
{ {
log_output = stderr; log_output = stderr;
} }
start=last_time=timeval_ms(); start=last_time=timeval_ms();
return ERROR_OK; return ERROR_OK;
} }
int set_log_output(struct command_context_s *cmd_ctx, FILE *output) int set_log_output(struct command_context_s *cmd_ctx, FILE *output)
{ {
log_output = output; log_output = output;
@ -299,7 +299,7 @@ char *alloc_vprintf(const char *fmt, va_list ap)
{ {
/* no buffer at the beginning, force realloc to do the job */ /* no buffer at the beginning, force realloc to do the job */
char *string = NULL; char *string = NULL;
/* start with buffer size suitable for typical messages */ /* start with buffer size suitable for typical messages */
int size = 128; int size = 128;
@ -326,7 +326,7 @@ char *alloc_vprintf(const char *fmt, va_list ap)
/* there was just enough or not enough space, allocate more in the next round */ /* there was just enough or not enough space, allocate more in the next round */
size *= 2; /* double the buffer size */ size *= 2; /* double the buffer size */
} }
/* the returned buffer is by principle guaranteed to be at least one character longer */ /* the returned buffer is by principle guaranteed to be at least one character longer */
return string; return string;
} }
@ -343,10 +343,10 @@ char *alloc_printf(const char *format, ...)
/* Code must return to the server loop before 1000ms has returned or invoke /* Code must return to the server loop before 1000ms has returned or invoke
* this function. * this function.
* *
* The GDB connection will time out if it spends >2000ms and you'll get nasty * The GDB connection will time out if it spends >2000ms and you'll get nasty
* error messages from GDB: * error messages from GDB:
* *
* Ignoring packet error, continuing... * Ignoring packet error, continuing...
* Reply contains invalid hex digit 116 * Reply contains invalid hex digit 116
* *
@ -354,34 +354,34 @@ char *alloc_printf(const char *format, ...)
* in GDB, OpenOCD guarantees that it sends keep-alive packages on the * 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 * GDB protocol and it is a bug in OpenOCD not to either return to the server
* loop or invoke keep_alive() every 1000ms. * loop or invoke keep_alive() every 1000ms.
* *
* This function will send a keep alive packet if >500ms has passed since last time * This function will send a keep alive packet if >500ms has passed since last time
* it was invoked. * it was invoked.
* *
* Note that this function can be invoked often, so it needs to be relatively * Note that this function can be invoked often, so it needs to be relatively
* fast when invoked more often than every 500ms. * fast when invoked more often than every 500ms.
* *
*/ */
void keep_alive() void keep_alive()
{ {
current_time=timeval_ms(); current_time=timeval_ms();
if (current_time-last_time>1000) 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); LOG_WARNING("BUG: keep_alive() was not invoked in the 1000ms timelimit. GDB alive packet not sent! (%lld)", current_time-last_time);
} }
if (current_time-last_time>500) if (current_time-last_time>500)
{ {
/* this will keep the GDB connection alive */ /* this will keep the GDB connection alive */
LOG_USER_N("%s", ""); LOG_USER_N("%s", "");
/* also process TCL events (we have to do this from 'log.c' since its /* DANGER!!!! do not add code to invoke e.g. target event processing,
* keep_alive() is the only routine guaranteed to be called at least * jim timer processing, etc. it can cause infinite recursion +
* once per second :( */ * jim event callbacks need to happen at a well defined time,
process_jim_events (); * not anywhere keep_alive() is invoked.
*
* These functions should be invoked at a well defined spot in server.c
*/
/* process any timer events now */
target_call_timer_callbacks_now();
last_time=current_time; last_time=current_time;
} }
} }

View File

@ -812,6 +812,8 @@ static int target_call_timer_callbacks_check_time(int checktime)
target_timer_callback_t *next_callback; target_timer_callback_t *next_callback;
struct timeval now; struct timeval now;
keep_alive();
gettimeofday(&now, NULL); gettimeofday(&now, NULL);
while (callback) while (callback)
@ -856,7 +858,7 @@ int target_call_timer_callbacks(void)
/* invoke periodic callbacks immediately */ /* invoke periodic callbacks immediately */
int target_call_timer_callbacks_now(void) int target_call_timer_callbacks_now(void)
{ {
return target_call_timer_callbacks(); return target_call_timer_callbacks_check_time(0);
} }
int target_alloc_working_area(struct target_s *target, u32 size, working_area_t **area) int target_alloc_working_area(struct target_s *target, u32 size, working_area_t **area)