summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorJonathan Rose <jrose@digium.com>2012-06-26 21:45:22 +0000
committerJonathan Rose <jrose@digium.com>2012-06-26 21:45:22 +0000
commit5eb94d7ebbc2c29d4de8201103bcb62ae8afcd31 (patch)
tree454a727e077efa3f74ea80469d0f863066f59c13 /main
parentee1111869585af74ea79a0bf45edcee49c00508b (diff)
Unique Call ID logging Phases III and IV
Adds call ID logging changes to specific channel drivers that weren't handled handled in phase II of Call ID Logging. Also covers logging for threads for threads created by systems that may be involved with many different calls. Extra special thanks to Richard for rigorous review of chan_dahdi and its various signalling modules. review: https://reviewboard.asterisk.org/r/1927/ review: https://reviewboard.asterisk.org/r/1950/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@369414 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main')
-rw-r--r--main/autoservice.c10
-rw-r--r--main/bridging.c23
-rw-r--r--main/channel_internal_api.c4
-rw-r--r--main/cli.c2
-rw-r--r--main/features.c9
-rw-r--r--main/logger.c30
-rw-r--r--main/pbx.c8
7 files changed, 78 insertions, 8 deletions
diff --git a/main/autoservice.c b/main/autoservice.c
index 4d53f15e5..37bbee682 100644
--- a/main/autoservice.c
+++ b/main/autoservice.c
@@ -90,6 +90,7 @@ static void *autoservice_run(void *ign)
int i, x = 0, ms = 50;
struct ast_frame *f = NULL;
struct ast_frame *defer_frame = NULL;
+ struct ast_callid *callid = NULL;
AST_LIST_LOCK(&aslist);
@@ -128,6 +129,10 @@ static void *autoservice_run(void *ign)
continue;
}
+ if ((callid = ast_channel_callid(chan))) {
+ ast_callid_threadassoc_add(callid);
+ }
+
f = ast_read(chan);
if (!f) {
@@ -168,6 +173,11 @@ static void *autoservice_run(void *ign)
} else if (f) {
ast_frfree(f);
}
+
+ if (callid) {
+ ast_callid_threadassoc_remove();
+ callid = ast_callid_unref(callid);
+ }
}
asthread = AST_PTHREADT_NULL;
diff --git a/main/bridging.c b/main/bridging.c
index 54ce9aebc..8bb13f916 100644
--- a/main/bridging.c
+++ b/main/bridging.c
@@ -376,6 +376,10 @@ static void *bridge_thread(void *data)
ao2_lock(bridge);
+ if (bridge->callid) {
+ ast_callid_threadassoc_add(bridge->callid);
+ }
+
ast_debug(1, "Started bridge thread for %p\n", bridge);
/* Loop around until we are told to stop */
@@ -536,6 +540,10 @@ int ast_bridge_destroy(struct ast_bridge *bridge)
ao2_lock(bridge);
+ if (bridge->callid) {
+ bridge->callid = ast_callid_unref(bridge->callid);
+ }
+
bridge->stop = 1;
bridge_poke(bridge);
@@ -931,6 +939,10 @@ static enum ast_bridge_channel_state bridge_channel_join(struct ast_bridge_chann
ao2_lock(bridge_channel->bridge);
+ if (!bridge_channel->bridge->callid) {
+ bridge_channel->bridge->callid = ast_read_threadstorage_callid();
+ }
+
state = bridge_channel->state;
/* Add channel into the bridge */
@@ -1059,6 +1071,10 @@ static void bridge_channel_destroy(void *obj)
{
struct ast_bridge_channel *bridge_channel = obj;
+ if (bridge_channel->callid) {
+ bridge_channel->callid = ast_callid_unref(bridge_channel->callid);
+ }
+
if (bridge_channel->bridge) {
ao2_ref(bridge_channel->bridge, -1);
bridge_channel->bridge = NULL;
@@ -1122,6 +1138,10 @@ static void *bridge_channel_thread(void *data)
struct ast_bridge_channel *bridge_channel = data;
enum ast_bridge_channel_state state;
+ if (bridge_channel->callid) {
+ ast_callid_threadassoc_add(bridge_channel->callid);
+ }
+
state = bridge_channel_join(bridge_channel);
/* If no other thread is going to take the channel then hang it up, or else we would have to service it until something else came along */
@@ -1144,6 +1164,7 @@ static void *bridge_channel_thread(void *data)
int ast_bridge_impart(struct ast_bridge *bridge, struct ast_channel *chan, struct ast_channel *swap, struct ast_bridge_features *features, int allow_hangup)
{
struct ast_bridge_channel *bridge_channel = bridge_channel_alloc(bridge);
+
/* Try to allocate a structure for the bridge channel */
if (!(bridge_channel)) {
return -1;
@@ -1154,7 +1175,7 @@ int ast_bridge_impart(struct ast_bridge *bridge, struct ast_channel *chan, struc
bridge_channel->swap = swap;
bridge_channel->features = features;
bridge_channel->allow_impart_hangup = allow_hangup;
-
+ bridge_channel->callid = ast_read_threadstorage_callid();
/* Actually create the thread that will handle the channel */
if (ast_pthread_create(&bridge_channel->thread, NULL, bridge_channel_thread, bridge_channel)) {
diff --git a/main/channel_internal_api.c b/main/channel_internal_api.c
index 933386401..768afc65e 100644
--- a/main/channel_internal_api.c
+++ b/main/channel_internal_api.c
@@ -851,8 +851,8 @@ void ast_channel_callid_set(struct ast_channel *chan, struct ast_callid *callid)
if (chan->callid) {
if ((option_debug >= 3) || (ast_opt_dbg_module && ast_debug_get_by_module(AST_MODULE) >= 3)) {
- char call_identifier_from[13];
- char call_identifier_to[13];
+ char call_identifier_from[AST_CALLID_BUFFER_LENGTH];
+ char call_identifier_to[AST_CALLID_BUFFER_LENGTH];
ast_callid_strnprint(call_identifier_from, sizeof(call_identifier_from), chan->callid);
ast_callid_strnprint(call_identifier_to, sizeof(call_identifier_to), callid);
ast_log(LOG_DEBUG, "Channel Call ID changing from %s to %s\n", call_identifier_from, call_identifier_to);
diff --git a/main/cli.c b/main/cli.c
index e6d629b7f..bb20bc1fa 100644
--- a/main/cli.c
+++ b/main/cli.c
@@ -1398,7 +1398,7 @@ static char *handle_showchan(struct ast_cli_entry *e, int cmd, struct ast_cli_ar
long elapsed_seconds=0;
int hour=0, min=0, sec=0;
struct ast_callid *callid;
- char call_identifier_str[13] = "";
+ char call_identifier_str[AST_CALLID_BUFFER_LENGTH] = "";
#ifdef CHANNEL_TRACE
int trace_enabled;
#endif
diff --git a/main/features.c b/main/features.c
index fbeaa7572..79d1036f2 100644
--- a/main/features.c
+++ b/main/features.c
@@ -5417,8 +5417,17 @@ static int parked_call_exec(struct ast_channel *chan, const char *data)
}
AST_LIST_TRAVERSE_SAFE_END;
if (pu) {
+ struct ast_callid *callid = ast_read_threadstorage_callid();
+
/* Found a parked call to pickup. */
peer = pu->chan;
+
+ /* We need to map the call id we have from this thread to the channel we found. */
+ if (callid) {
+ ast_channel_callid_set(peer, callid);
+ callid = ast_callid_unref(callid);
+ }
+
con = ast_context_find(parkinglot->cfg.parking_con);
if (con) {
if (ast_context_remove_extension2(con, pu->parkingexten, 1, NULL, 0)) {
diff --git a/main/logger.c b/main/logger.c
index 6bfafe97d..ca2648190 100644
--- a/main/logger.c
+++ b/main/logger.c
@@ -1691,7 +1691,7 @@ void ast_backtrace(void)
#endif /* defined(HAVE_BKTR) */
}
-void __ast_verbose_ap(const char *file, int line, const char *func, int level, const char *fmt, va_list ap)
+void __ast_verbose_ap(const char *file, int line, const char *func, int level, struct ast_callid *callid, const char *fmt, va_list ap)
{
struct ast_str *buf = NULL;
int res = 0;
@@ -1743,15 +1743,30 @@ void __ast_verbose_ap(const char *file, int line, const char *func, int level, c
return;
}
- ast_log(__LOG_VERBOSE, file, line, func, "%s", ast_str_buffer(buf));
+ ast_log_callid(__LOG_VERBOSE, file, line, func, callid, "%s", ast_str_buffer(buf));
}
void __ast_verbose(const char *file, int line, const char *func, int level, const char *fmt, ...)
{
+ struct ast_callid *callid;
va_list ap;
+ callid = ast_read_threadstorage_callid();
+
+ va_start(ap, fmt);
+ __ast_verbose_ap(file, line, func, level, callid, fmt, ap);
+ va_end(ap);
+
+ if (callid) {
+ ast_callid_unref(callid);
+ }
+}
+
+void __ast_verbose_callid(const char *file, int line, const char *func, int level, struct ast_callid *callid, const char *fmt, ...)
+{
+ va_list ap;
va_start(ap, fmt);
- __ast_verbose_ap(file, line, func, level, fmt, ap);
+ __ast_verbose_ap(file, line, func, level, callid, fmt, ap);
va_end(ap);
}
@@ -1760,11 +1775,18 @@ void __ast_verbose(const char *file, int line, const char *func, int level, cons
void __attribute__((format(printf, 1,2))) ast_verbose(const char *fmt, ...);
void ast_verbose(const char *fmt, ...)
{
+ struct ast_callid *callid;
va_list ap;
+ callid = ast_read_threadstorage_callid();
+
va_start(ap, fmt);
- __ast_verbose_ap("", 0, "", 0, fmt, ap);
+ __ast_verbose_ap("", 0, "", 0, callid, fmt, ap);
va_end(ap);
+
+ if (callid) {
+ ast_callid_unref(callid);
+ }
}
int ast_register_verbose(void (*v)(const char *string))
diff --git a/main/pbx.c b/main/pbx.c
index 0d6df930a..006549c12 100644
--- a/main/pbx.c
+++ b/main/pbx.c
@@ -9202,6 +9202,14 @@ static void *async_wait(void *data)
struct ast_frame *f;
struct ast_app *app;
+ if (chan) {
+ struct ast_callid *callid = ast_channel_callid(chan);
+ if (callid) {
+ ast_callid_threadassoc_add(callid);
+ ast_callid_unref(callid);
+ }
+ }
+
while (timeout && (ast_channel_state(chan) != AST_STATE_UP)) {
res = ast_waitfor(chan, timeout);
if (res < 1)