diff options
-rw-r--r-- | main/logger.c | 88 |
1 files changed, 46 insertions, 42 deletions
diff --git a/main/logger.c b/main/logger.c index 6a35ac5fe..ff13115b3 100644 --- a/main/logger.c +++ b/main/logger.c @@ -113,7 +113,7 @@ struct logchannel { AST_LIST_ENTRY(logchannel) list; }; -static AST_LIST_HEAD_STATIC(logchannels, logchannel); +static AST_RWLIST_HEAD_STATIC(logchannels, logchannel); enum logmsgtypes { LOGMSG_NORMAL = 0, @@ -314,10 +314,10 @@ static void init_logger_chain(void) const char *s; /* delete our list of log channels */ - AST_LIST_LOCK(&logchannels); - while ((chan = AST_LIST_REMOVE_HEAD(&logchannels, list))) + AST_RWLIST_WRLOCK(&logchannels); + while ((chan = AST_RWLIST_REMOVE_HEAD(&logchannels, list))) free(chan); - AST_LIST_UNLOCK(&logchannels); + AST_RWLIST_UNLOCK(&logchannels); global_logmask = 0; errno = 0; @@ -336,9 +336,9 @@ static void init_logger_chain(void) return; chan->type = LOGTYPE_CONSOLE; chan->logmask = 28; /*warning,notice,error */ - AST_LIST_LOCK(&logchannels); - AST_LIST_INSERT_HEAD(&logchannels, chan, list); - AST_LIST_UNLOCK(&logchannels); + AST_RWLIST_WRLOCK(&logchannels); + AST_RWLIST_INSERT_HEAD(&logchannels, chan, list); + AST_RWLIST_UNLOCK(&logchannels); global_logmask |= chan->logmask; return; } @@ -366,15 +366,15 @@ static void init_logger_chain(void) if ((s = ast_variable_retrieve(cfg, "general", "rotatetimestamp"))) rotatetimestamp = ast_true(s); - AST_LIST_LOCK(&logchannels); + AST_RWLIST_WRLOCK(&logchannels); var = ast_variable_browse(cfg, "logfiles"); for (; var; var = var->next) { if (!(chan = make_logchannel(var->name, var->value, var->lineno))) continue; - AST_LIST_INSERT_HEAD(&logchannels, chan, list); + AST_RWLIST_INSERT_HEAD(&logchannels, chan, list); global_logmask |= chan->logmask; } - AST_LIST_UNLOCK(&logchannels); + AST_RWLIST_UNLOCK(&logchannels); ast_config_destroy(cfg); } @@ -382,16 +382,20 @@ static void init_logger_chain(void) void ast_queue_log(const char *queuename, const char *callid, const char *agent, const char *event, const char *fmt, ...) { va_list ap; - AST_LIST_LOCK(&logchannels); + char qlog_msg[8192]; + int qlog_len; if (qlog) { va_start(ap, fmt); - fprintf(qlog, "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event); - vfprintf(qlog, fmt, ap); - fprintf(qlog, "\n"); + qlog_len = snprintf(qlog_msg, sizeof(qlog_msg), "%ld|%s|%s|%s|%s|", (long)time(NULL), callid, queuename, agent, event); + vsnprintf(qlog_msg + qlog_len, sizeof(qlog_msg) - qlog_len, fmt, ap); va_end(ap); + } + AST_RWLIST_RDLOCK(&logchannels); + if (qlog) { + fprintf(qlog, "%s\n", qlog_msg); fflush(qlog); } - AST_LIST_UNLOCK(&logchannels); + AST_RWLIST_UNLOCK(&logchannels); } int reload_logger(int rotate) @@ -403,7 +407,7 @@ int reload_logger(int rotate) FILE *myf; int x, res = 0; - AST_LIST_LOCK(&logchannels); + AST_RWLIST_WRLOCK(&logchannels); if (eventlog) fclose(eventlog); @@ -419,7 +423,7 @@ int reload_logger(int rotate) ast_mkdir(ast_config_AST_LOG_DIR, 0777); - AST_LIST_TRAVERSE(&logchannels, f, list) { + AST_RWLIST_TRAVERSE(&logchannels, f, list) { if (f->disabled) { f->disabled = 0; /* Re-enable logging at reload */ manager_event(EVENT_FLAG_SYSTEM, "LogChannel", "Channel: %s\r\nEnabled: Yes\r\n", f->filename); @@ -516,7 +520,7 @@ int reload_logger(int rotate) } } - AST_LIST_UNLOCK(&logchannels); + AST_RWLIST_UNLOCK(&logchannels); return res; } @@ -549,8 +553,8 @@ static int handle_logger_show_channels(int fd, int argc, char *argv[]) ast_cli(fd, "Configuration\n"); ast_cli(fd,FORMATL, "-------", "----", "------"); ast_cli(fd, "-------------\n"); - AST_LIST_LOCK(&logchannels); - AST_LIST_TRAVERSE(&logchannels, chan, list) { + AST_RWLIST_RDLOCK(&logchannels); + AST_RWLIST_TRAVERSE(&logchannels, chan, list) { ast_cli(fd, FORMATL, chan->filename, chan->type==LOGTYPE_CONSOLE ? "Console" : (chan->type==LOGTYPE_SYSLOG ? "Syslog" : "File"), chan->disabled ? "Disabled" : "Enabled"); ast_cli(fd, " - "); @@ -570,7 +574,7 @@ static int handle_logger_show_channels(int fd, int argc, char *argv[]) ast_cli(fd, "Event "); ast_cli(fd, "\n"); } - AST_LIST_UNLOCK(&logchannels); + AST_RWLIST_UNLOCK(&logchannels); ast_cli(fd, "\n"); return RESULT_SUCCESS; @@ -581,7 +585,7 @@ struct verb { AST_LIST_ENTRY(verb) list; }; -static AST_LIST_HEAD_STATIC(verbosers, verb); +static AST_RWLIST_HEAD_STATIC(verbosers, verb); static char logger_reload_help[] = "Usage: logger reload\n" @@ -647,17 +651,17 @@ static void logger_print_normal(struct logmsg *logmsg) struct logchannel *chan = NULL; char buf[BUFSIZ]; - AST_LIST_LOCK(&logchannels); + AST_RWLIST_RDLOCK(&logchannels); if (logfiles.event_log && logmsg->level == __LOG_EVENT) { fprintf(eventlog, "%s asterisk[%ld]: %s", logmsg->date, (long)getpid(), logmsg->str); fflush(eventlog); - AST_LIST_UNLOCK(&logchannels); + AST_RWLIST_UNLOCK(&logchannels); return; } - if (!AST_LIST_EMPTY(&logchannels)) { - AST_LIST_TRAVERSE(&logchannels, chan, list) { + if (!AST_RWLIST_EMPTY(&logchannels)) { + AST_RWLIST_TRAVERSE(&logchannels, chan, list) { /* If the channel is disabled, then move on to the next one */ if (chan->disabled) continue; @@ -714,7 +718,7 @@ static void logger_print_normal(struct logmsg *logmsg) fputs(logmsg->str, stdout); } - AST_LIST_UNLOCK(&logchannels); + AST_RWLIST_UNLOCK(&logchannels); /* If we need to reload because of the file size, then do so */ if (filesize_reload_needed) { @@ -733,10 +737,10 @@ static void logger_print_verbose(struct logmsg *logmsg) struct verb *v = NULL; /* Iterate through the list of verbosers and pass them the log message string */ - AST_LIST_LOCK(&verbosers); - AST_LIST_TRAVERSE(&verbosers, v, list) + AST_RWLIST_RDLOCK(&verbosers); + AST_RWLIST_TRAVERSE(&verbosers, v, list) v->verboser(logmsg->str); - AST_LIST_UNLOCK(&verbosers); + AST_RWLIST_UNLOCK(&verbosers); return; } @@ -833,7 +837,7 @@ void close_logger(void) ast_cond_signal(&logcond); AST_LIST_UNLOCK(&logmsgs); - AST_LIST_LOCK(&logchannels); + AST_RWLIST_WRLOCK(&logchannels); if (eventlog) { fclose(eventlog); @@ -845,7 +849,7 @@ void close_logger(void) qlog = NULL; } - AST_LIST_TRAVERSE(&logchannels, f, list) { + AST_RWLIST_TRAVERSE(&logchannels, f, list) { if (f->fileptr && (f->fileptr != stdout) && (f->fileptr != stderr)) { fclose(f->fileptr); f->fileptr = NULL; @@ -854,7 +858,7 @@ void close_logger(void) closelog(); /* syslog */ - AST_LIST_UNLOCK(&logchannels); + AST_RWLIST_UNLOCK(&logchannels); return; } @@ -874,7 +878,7 @@ void ast_log(int level, const char *file, int line, const char *function, const if (!(buf = ast_str_thread_get(&log_buf, LOG_BUF_INIT_SIZE))) return; - if (AST_LIST_EMPTY(&logchannels)) { + if (AST_RWLIST_EMPTY(&logchannels)) { /* * we don't have the logger chain configured yet, * so just log to stdout @@ -1045,9 +1049,9 @@ int ast_register_verbose(void (*v)(const char *string)) verb->verboser = v; - AST_LIST_LOCK(&verbosers); - AST_LIST_INSERT_HEAD(&verbosers, verb, list); - AST_LIST_UNLOCK(&verbosers); + AST_RWLIST_WRLOCK(&verbosers); + AST_RWLIST_INSERT_HEAD(&verbosers, verb, list); + AST_RWLIST_UNLOCK(&verbosers); return 0; } @@ -1056,16 +1060,16 @@ int ast_unregister_verbose(void (*v)(const char *string)) { struct verb *cur; - AST_LIST_LOCK(&verbosers); - AST_LIST_TRAVERSE_SAFE_BEGIN(&verbosers, cur, list) { + AST_RWLIST_WRLOCK(&verbosers); + AST_RWLIST_TRAVERSE_SAFE_BEGIN(&verbosers, cur, list) { if (cur->verboser == v) { - AST_LIST_REMOVE_CURRENT(&verbosers, list); + AST_RWLIST_REMOVE_CURRENT(&verbosers, list); free(cur); break; } } - AST_LIST_TRAVERSE_SAFE_END - AST_LIST_UNLOCK(&verbosers); + AST_RWLIST_TRAVERSE_SAFE_END + AST_RWLIST_UNLOCK(&verbosers); return cur ? 0 : -1; } |