diff options
Diffstat (limited to 'main')
-rw-r--r-- | main/autoservice.c | 10 | ||||
-rw-r--r-- | main/bridging.c | 23 | ||||
-rw-r--r-- | main/channel_internal_api.c | 4 | ||||
-rw-r--r-- | main/cli.c | 2 | ||||
-rw-r--r-- | main/features.c | 9 | ||||
-rw-r--r-- | main/logger.c | 30 | ||||
-rw-r--r-- | main/pbx.c | 8 |
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) |