void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...)
__attribute__((format(printf, 5, 6)));
-/* XXX needs documentation */
-struct ast_callid;
-
-/*! \brief Used for sending a log message with a known call_id
- This is a modified logger function which is functionally identical to the above logger function,
- it just include a call_id argument as well. If NULL is specified here, no attempt will be made to
- join the log message with a call_id.
-
- \param level Type of log event
- \param file Will be provided by the AST_LOG_* macro
- \param line Will be provided by the AST_LOG_* macro
- \param function Will be provided by the AST_LOG_* macro
- \param callid This is the ast_callid that is associated with the log message. May be NULL.
- \param fmt This is what is important. The format is the same as your favorite breed of printf. You know how that works, right? :-)
-*/
-void ast_log_callid(int level, const char *file, int line, const char *function, struct ast_callid *callid, const char *fmt, ...)
- __attribute__((format(printf, 6, 7)));
-
void ast_backtrace(void);
/*! \brief Reload logger without rotating log files */
void ast_logger_unregister_level(const char *name);
/*!
- * \brief factory function to create a new uniquely identifying callid.
- *
- * \retval ast_callid struct pointer containing the call id
- *
- * \note The newly created callid will be referenced upon creation and this function should be
- * paired with a call to ast_callid_unref()
- */
-struct ast_callid *ast_create_callid(void);
-
-/*!
- * \brief extracts the callerid from the thread
- *
- * \retval ast_callid reference to call_id related to the thread
- * \retval NULL if no call_id is present in the thread
- *
- * This reference must be unreffed before it loses scope to prevent memory leaks.
- */
-struct ast_callid *ast_read_threadstorage_callid(void);
-
-/*!
- * \brief Increase callid reference count
- *
- * \param c the ast_callid
- *
- * \retval c always
- */
-#define ast_callid_ref(c) ({ ao2_ref(c, +1); (c); })
-
-/*!
- * \brief Decrease callid reference count
- *
- * \param c the ast_callid
- *
- * \retval NULL always
- */
-#define ast_callid_unref(c) ({ ao2_ref(c, -1); (NULL); })
-
-/*!
- * \brief Adds a known callid to thread storage of the calling thread
- *
- * \retval 0 - success
- * \retval non-zero - failure
- */
-int ast_callid_threadassoc_add(struct ast_callid *callid);
-
-/*
- * May need a function to clean the threadstorage if we want to repurpose a thread.
- */
-
-/*!
* \brief Send a log message to a dynamically registered log level
* \param level The log level to send the message to
*
struct ast_bridge_config bconfig;
struct ast_channel *chan;
struct ast_channel *peer;
- struct ast_callid *callid; /*<! callid pointer (Only used to bind thread) */
unsigned int return_to_pbx:1;
};
struct ast_bridge_thread_obj *tobj = data;
int res;
- if (tobj->callid) {
- ast_callid_threadassoc_add(tobj->callid);
- /* Need to deref and set to null since ast_bridge_thread_obj has no common destructor */
- tobj->callid = ast_callid_unref(tobj->callid);
- }
-
ast_channel_appl_set(tobj->chan, !tobj->return_to_pbx ? "Transferred Call" : "ManagerBridge");
ast_channel_data_set(tobj->chan, ast_channel_name(tobj->peer));
ast_channel_appl_set(tobj->peer, !tobj->return_to_pbx ? "Transferred Call" : "ManagerBridge");
*
* Create thread and attributes, call bridge_call_thread
*/
-static void bridge_call_thread_launch(struct ast_bridge_thread_obj *data)
+static void bridge_call_thread_launch(void *data)
{
pthread_t thread;
pthread_attr_t attr;
struct sched_param sched;
- /* This needs to be unreffed once it has been associated with the new thread. */
- data->callid = ast_read_threadstorage_callid();
-
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- if (ast_pthread_create(&thread, &attr, bridge_call_thread, data)) {
- /* Failed to create thread. Ditch the reference to callid. */
- ast_callid_unref(data->callid);
- ast_log(LOG_ERROR, "Failed to create bridge_call_thread.\n");
- return;
- }
+ ast_pthread_create(&thread, &attr, bridge_call_thread, data);
pthread_attr_destroy(&attr);
memset(&sched, 0, sizeof(sched));
pthread_setschedparam(thread, SCHED_RR, &sched);
return res;
}
-
#include "asterisk/cli.h"
#include "asterisk/utils.h"
#include "asterisk/manager.h"
-#include "asterisk/astobj2.h"
#include "asterisk/threadstorage.h"
#include "asterisk/strings.h"
#include "asterisk/pbx.h"
static unsigned int global_logmask = 0xFFFF;
static int queuelog_init;
static int logger_initialized;
-static volatile int next_unique_callid; /* Used to assign unique call_ids to calls */
-static int display_callids;
-static void unique_callid_cleanup(void *data);
-
-struct ast_callid {
- int call_identifier; /* Numerical value of the call displayed in the logs */
-};
-
-AST_THREADSTORAGE_CUSTOM(unique_callid, NULL, unique_callid_cleanup);
static enum rotatestrategy {
SEQUENTIAL = 1 << 0, /* Original method - create a new file, in order */
int level;
int line;
int lwp;
- struct ast_callid *callid;
AST_DECLARE_STRING_FIELDS(
AST_STRING_FIELD(date);
AST_STRING_FIELD(file);
AST_LIST_ENTRY(logmsg) list;
};
-static void logmsg_free(struct logmsg *msg)
-{
- if (msg->callid) {
- ast_callid_unref(msg->callid);
- }
- ast_free(msg);
-}
-
static AST_LIST_HEAD_STATIC(logmsgs, logmsg);
static pthread_t logthread = AST_PTHREADT_NULL;
static ast_cond_t logcond;
const char *s;
struct ast_flags config_flags = { 0 };
- display_callids = 1;
-
if (!(cfg = ast_config_load2(S_OR(altconf, "logger.conf"), "logger", config_flags)) || cfg == CONFIG_STATUS_FILEINVALID) {
return;
}
hostname[0] = '\0';
} else
hostname[0] = '\0';
- if ((s = ast_variable_retrieve(cfg, "general", "display_callids"))) {
- display_callids = ast_true(s);
- }
if ((s = ast_variable_retrieve(cfg, "general", "dateformat")))
ast_copy_string(dateformat, s, sizeof(dateformat));
else
if (!AST_RWLIST_EMPTY(&logchannels)) {
AST_RWLIST_TRAVERSE(&logchannels, chan, list) {
- /* XXX May need to grow larger later in order to accomodate call counts higher than 999999. */
- char call_identifier_str[13] = "";
-
- if (logmsg->callid) {
- snprintf(call_identifier_str, sizeof(call_identifier_str), "[C-%08x]", logmsg->callid->call_identifier);
- }
-
-
/* If the channel is disabled, then move on to the next one */
if (chan->disabled) {
continue;
/* Turn the numerical line number into a string */
snprintf(linestr, sizeof(linestr), "%d", logmsg->line);
/* Build string to print out */
- snprintf(buf, sizeof(buf), "[%s] %s[%d]%s: %s:%s %s: %s",
+ snprintf(buf, sizeof(buf), "[%s] %s[%d]: %s:%s %s: %s",
logmsg->date,
term_color(tmp1, logmsg->level_name, colors[logmsg->level], 0, sizeof(tmp1)),
logmsg->lwp,
- call_identifier_str,
term_color(tmp2, logmsg->file, COLOR_BRWHITE, 0, sizeof(tmp2)),
term_color(tmp3, linestr, COLOR_BRWHITE, 0, sizeof(tmp3)),
term_color(tmp4, logmsg->function, COLOR_BRWHITE, 0, sizeof(tmp4)),
}
/* Print out to the file */
- res = fprintf(chan->fileptr, "[%s] %s[%d]%s %s: %s",
- logmsg->date, logmsg->level_name, logmsg->lwp, call_identifier_str,
- logmsg->file, term_strip(buf, logmsg->message, BUFSIZ));
+ res = fprintf(chan->fileptr, "[%s] %s[%d] %s: %s",
+ logmsg->date, logmsg->level_name, logmsg->lwp, logmsg->file, term_strip(buf, logmsg->message, BUFSIZ));
if (res <= 0 && !ast_strlen_zero(logmsg->message)) {
fprintf(stderr, "**** Asterisk Logging Error: ***********\n");
if (errno == ENOMEM || errno == ENOSPC)
logger_print_normal(msg);
/* Free the data since we are done */
- logmsg_free(msg);
+ ast_free(msg);
}
/* If we should stop, then stop */
return;
}
-struct ast_callid *ast_create_callid(void)
-{
- struct ast_callid *call;
- int using;
-
- if (!(call = ao2_alloc(sizeof(struct ast_callid), NULL))) {
- ast_log(LOG_ERROR, "Could not allocate callid struct.\n");
- return NULL;
- }
-
- using = ast_atomic_fetchadd_int(&next_unique_callid, +1);
-
- call->call_identifier = using;
- ast_log(LOG_DEBUG, "CALL_ID [C-%08x] created by thread.\n", call->call_identifier);
- return call;
-}
-
-struct ast_callid *ast_read_threadstorage_callid(void)
-{
- struct ast_callid **callid;
- callid = ast_threadstorage_get(&unique_callid, sizeof(struct ast_callid **));
- if (callid && *callid) {
- ast_callid_ref(*callid);
- return *callid;
- }
-
- return NULL;
-
-}
-
-int ast_callid_threadassoc_add(struct ast_callid *callid)
-{
- struct ast_callid **pointing;
- pointing = ast_threadstorage_get(&unique_callid, sizeof(struct ast_callid **));
- if (!(pointing)) {
- ast_log(LOG_ERROR, "Failed to allocate thread storage.\n");
- return -1;
- }
-
- if (!(*pointing)) {
- /* callid will be unreffed at thread destruction */
- ast_callid_ref(callid);
- *pointing = callid;
- ast_log(LOG_DEBUG, "CALL_ID [C-%08x] bound to thread.\n", callid->call_identifier);
- } else {
- ast_log(LOG_WARNING, "Attempted to ast_callid_threadassoc_add on thread already associated with a callid.\n");
- return 1;
- }
-
- return 0;
-}
-
-/*!
- * \internal
- * \brief thread storage cleanup function for unique_callid
- */
-static void unique_callid_cleanup(void *data)
-{
- struct ast_callid **callid = data;
-
- if (*callid) {
- ast_callid_unref(*callid);
- }
-
- ast_free(data);
-}
-
/*!
* \brief send log messages to syslog and/or the console
*/
-static void __attribute__((format(printf, 6, 0))) ast_log_full(int level, const char *file, int line, const char *function, struct ast_callid *callid, const char *fmt, va_list ap)
+void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...)
{
struct logmsg *logmsg = NULL;
struct ast_str *buf = NULL;
struct ast_tm tm;
struct timeval now = ast_tvnow();
int res = 0;
+ va_list ap;
char datestring[256];
if (!(buf = ast_str_thread_get(&log_buf, LOG_BUF_INIT_SIZE)))
* so just log to stdout
*/
int result;
+ va_start(ap, fmt);
result = ast_str_set_va(&buf, BUFSIZ, fmt, ap); /* XXX BUFSIZ ? */
+ va_end(ap);
if (result != AST_DYNSTR_BUILD_FAILED) {
term_filter_escapes(ast_str_buffer(buf));
fputs(ast_str_buffer(buf), stdout);
return;
/* Build string */
+ va_start(ap, fmt);
res = ast_str_set_va(&buf, BUFSIZ, fmt, ap);
+ va_end(ap);
/* If the build failed, then abort and free this structure */
if (res == AST_DYNSTR_BUILD_FAILED)
logmsg->type = LOGMSG_NORMAL;
}
- if (display_callids && callid) {
- logmsg->callid = ast_callid_ref(callid);
- /* callid will be unreffed at logmsg destruction */
- }
-
/* Create our date/time */
ast_localtime(&now, &tm, NULL);
ast_strftime(datestring, sizeof(datestring), dateformat, &tm);
AST_LIST_UNLOCK(&logmsgs);
} else {
logger_print_normal(logmsg);
- logmsg_free(logmsg);
+ ast_free(logmsg);
}
return;
}
-void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...)
-{
- struct ast_callid *callid;
- va_list ap;
-
- callid = ast_read_threadstorage_callid();
-
- va_start(ap, fmt);
- ast_log_full(level, file, line, function, callid, fmt, ap);
- va_end(ap);
-
- if (callid) {
- ast_callid_unref(callid);
- }
-}
-
-void ast_log_callid(int level, const char *file, int line, const char *function, struct ast_callid *callid, const char *fmt, ...)
-{
- va_list ap;
- va_start(ap, fmt);
- ast_log_full(level, file, line, function, callid, fmt, ap);
- va_end(ap);
-}
-
#ifdef HAVE_BKTR
struct ast_bt *ast_bt_create(void)