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
static int count = 0;
/* The log_puts() serves to somewhat different goals:
static int count = 0;
/* The log_puts() serves to somewhat different goals:
* - logging
* - feeding low-level info to the user in GDB or Telnet
* - logging
* - 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.
*/
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)
{
{
/* print with count and time information */
int t=(int)(timeval_ms()-start);
{
/* print with count and time information */
int t=(int)(timeval_ms()-start);
struct mallinfo info;
info = mallinfo();
#endif
struct mallinfo info;
info = mallinfo();
#endif
#if PRINT_MEM()
" %d"
#endif
#if PRINT_MEM()
" %d"
#endif
- ": %s", log_strings[level+1], count, t, file, line, function,
+ ": %s", log_strings[level+1], count, t, file, line, function,
#if PRINT_MEM()
info.fordblks,
#endif
#if PRINT_MEM()
info.fordblks,
#endif
- /* only entire lines are logged. Otherwise it's
+ /* only entire lines are logged. Otherwise it's
* single chars intended for the log callbacks. */
}
fflush(log_output);
* single chars intended for the log callbacks. */
}
fflush(log_output);
/* Never forward LOG_LVL_DEBUG, too verbose and they can be found in the log if need be */
if (level <= LOG_LVL_INFO)
{
/* Never forward LOG_LVL_DEBUG, too verbose and they can be found in the log if need be */
if (level <= LOG_LVL_INFO)
{
log_puts(level, file, line, function, string);
free(string);
}
log_puts(level, file, line, function, string);
free(string);
}
count++;
if (level > debug_level)
return;
count++;
if (level > debug_level)
return;
string = alloc_vprintf(format, ap);
if (string != NULL)
{
string = alloc_vprintf(format, ap);
if (string != NULL)
{
log_puts(level, file, line, function, string);
free(string);
}
log_puts(level, file, line, function, string);
free(string);
}
if (argc == 1)
{
FILE* file = fopen(args[0], "w");
if (argc == 1)
{
FILE* file = fopen(args[0], "w");
if (file)
{
log_output = file;
if (file)
{
log_output = file;
/* set defaults for daemon configuration, if not set by cmdline or cfgfile */
if (debug_level == -1)
debug_level = LOG_LVL_INFO;
/* set defaults for daemon configuration, if not set by cmdline or cfgfile */
if (debug_level == -1)
debug_level = LOG_LVL_INFO;
if (log_output == NULL)
{
log_output = stderr;
}
if (log_output == NULL)
{
log_output = stderr;
}
start=last_time=timeval_ms();
start=last_time=timeval_ms();
int set_log_output(struct command_context_s *cmd_ctx, FILE *output)
{
log_output = output;
int set_log_output(struct command_context_s *cmd_ctx, FILE *output)
{
log_output = output;
{
/* no buffer at the beginning, force realloc to do the job */
char *string = NULL;
{
/* no buffer at the beginning, force realloc to do the job */
char *string = NULL;
/* start with buffer size suitable for typical messages */
int size = 128;
/* start with buffer size suitable for typical messages */
int size = 128;
/* there was just enough or not enough space, allocate more in the next round */
size *= 2; /* double the buffer size */
}
/* there was just enough or not enough space, allocate more in the next round */
size *= 2; /* double the buffer size */
}
/* the returned buffer is by principle guaranteed to be at least one character longer */
return string;
}
/* the returned buffer is by principle guaranteed to be at least one character longer */
return string;
}
/* Code must return to the server loop before 1000ms has returned or invoke
* this function.
/* 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:
* 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
*
* Ignoring packet error, continuing...
* Reply contains invalid hex digit 116
*
* 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.
* 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.
* This function will send a keep alive packet if >500ms has passed since last time
* it was invoked.
* Note that this function can be invoked often, so it needs to be relatively
* fast when invoked more often than every 500ms.
* Note that this function can be invoked often, so it needs to be relatively
* fast when invoked more often than every 500ms.
*/
void keep_alive()
{
current_time=timeval_ms();
if (current_time-last_time>1000)
{
*/
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);
- }
+ 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)
{
/* this will keep the GDB connection alive */
LOG_USER_N("%s", "");
if (current_time-last_time>500)
{
/* this will keep the GDB connection alive */
LOG_USER_N("%s", "");
- /* 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 ();
+ /* DANGER!!!! do not add code to invoke e.g. target event processing,
+ * jim timer processing, etc. it can cause infinite recursion +
+ * jim event callbacks need to happen at a well defined time,
+ * 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;
}
}
target_timer_callback_t *next_callback;
struct timeval now;
target_timer_callback_t *next_callback;
struct timeval now;
gettimeofday(&now, NULL);
while (callback)
gettimeofday(&now, NULL);
while (callback)
/* invoke periodic callbacks immediately */
int target_call_timer_callbacks_now(void)
{
/* invoke periodic callbacks immediately */
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)
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)