Try/catch scheme. Typed up the functionality and regression tested.
Ready for discussion and tiny patches that tries out this scheme. git-svn-id: svn://svn.berlios.de/openocd/trunk@2755 b42882b7-edfa-0310-969c-e2dbd0fdcd60
This commit is contained in:
parent
37755ffdb6
commit
1c262c8826
100
src/helper/log.c
100
src/helper/log.c
|
@ -64,6 +64,95 @@ static char *log_strings[5] =
|
||||||
|
|
||||||
static int count = 0;
|
static int count = 0;
|
||||||
|
|
||||||
|
|
||||||
|
static struct store_log_forward * log_head = NULL;
|
||||||
|
static int log_forward_count = 0;
|
||||||
|
|
||||||
|
struct store_log_forward
|
||||||
|
{
|
||||||
|
struct store_log_forward * next;
|
||||||
|
const char * file;
|
||||||
|
int line;
|
||||||
|
const char * function;
|
||||||
|
const char * string;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* either forward the log to the listeners or store it for possible forwarding later */
|
||||||
|
static void log_forward(const char *file, int line, const char *function, const char *string)
|
||||||
|
{
|
||||||
|
if (log_forward_count==0)
|
||||||
|
{
|
||||||
|
log_callback_t *cb, *next;
|
||||||
|
cb = log_callbacks;
|
||||||
|
/* DANGER!!!! the log callback can remove itself!!!! */
|
||||||
|
while (cb)
|
||||||
|
{
|
||||||
|
next = cb->next;
|
||||||
|
cb->fn(cb->priv, file, line, function, string);
|
||||||
|
cb = next;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
struct store_log_forward *log = malloc(sizeof (struct store_log_forward));
|
||||||
|
log->file = strdup(file);
|
||||||
|
log->line = line;
|
||||||
|
log->function = strdup(function);
|
||||||
|
log->string = strdup(string);
|
||||||
|
log->next = NULL;
|
||||||
|
if (log_head==NULL)
|
||||||
|
log_head = log;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* append to tail */
|
||||||
|
struct store_log_forward * t;
|
||||||
|
t = log_head;
|
||||||
|
while (t->next!=NULL)
|
||||||
|
{
|
||||||
|
t = t->next;
|
||||||
|
}
|
||||||
|
t->next = log;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void log_try(void)
|
||||||
|
{
|
||||||
|
log_forward_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void log_catch(void)
|
||||||
|
{
|
||||||
|
assert(log_forward_count>0);
|
||||||
|
log_forward_count--;
|
||||||
|
}
|
||||||
|
|
||||||
|
void log_rethrow(void)
|
||||||
|
{
|
||||||
|
log_catch();
|
||||||
|
if (log_forward_count==0)
|
||||||
|
{
|
||||||
|
struct store_log_forward *log;
|
||||||
|
|
||||||
|
log = log_head;
|
||||||
|
while (log != NULL)
|
||||||
|
{
|
||||||
|
log_forward(log->file, log->line, log->function, log->string);
|
||||||
|
|
||||||
|
struct store_log_forward *t=log;
|
||||||
|
log = log->next;
|
||||||
|
|
||||||
|
free((void *)t->file);
|
||||||
|
free((void *)t->function);
|
||||||
|
free((void *)t->string);
|
||||||
|
free(t);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
log_head = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* The log_puts() serves to somewhat different goals:
|
/* The log_puts() serves to somewhat different goals:
|
||||||
*
|
*
|
||||||
* - logging
|
* - logging
|
||||||
|
@ -131,18 +220,11 @@ static void log_puts(enum log_levels level, const char *file, int line, const ch
|
||||||
/* 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)
|
||||||
{
|
{
|
||||||
log_callback_t *cb, *next;
|
log_forward(file, line, function, string);
|
||||||
cb = log_callbacks;
|
|
||||||
/* DANGER!!!! the log callback can remove itself!!!! */
|
|
||||||
while (cb)
|
|
||||||
{
|
|
||||||
next = cb->next;
|
|
||||||
cb->fn(cb->priv, file, line, function, string);
|
|
||||||
cb = next;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void log_printf(enum log_levels level, const char *file, int line, const char *function, const char *format, ...)
|
void log_printf(enum log_levels level, const char *file, int line, const char *function, const char *format, ...)
|
||||||
{
|
{
|
||||||
char *string;
|
char *string;
|
||||||
|
|
|
@ -64,6 +64,15 @@ extern void kept_alive(void);
|
||||||
extern void alive_sleep(int ms);
|
extern void alive_sleep(int ms);
|
||||||
extern void busy_sleep(int ms);
|
extern void busy_sleep(int ms);
|
||||||
|
|
||||||
|
|
||||||
|
/* log entries can be paused and replayed roughly according to the try/catch/rethrow
|
||||||
|
* concepts in C++
|
||||||
|
*/
|
||||||
|
void log_try(void);
|
||||||
|
void log_catch(void);
|
||||||
|
void log_rethrow(void);
|
||||||
|
|
||||||
|
|
||||||
typedef void (*log_callback_fn)(void *priv, const char *file, int line,
|
typedef void (*log_callback_fn)(void *priv, const char *file, int line,
|
||||||
const char *function, const char *string);
|
const char *function, const char *string);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue