summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
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)