- 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__
parent
0ae7f962f8
commit
9b6853bc4c
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue