From 457786b0a72867e9153db746b73626f1affb3872 Mon Sep 17 00:00:00 2001 From: seanbright Date: Sun, 9 Nov 2008 01:34:59 +0000 Subject: Merged revisions 155554 via svnmerge from https://origsvn.digium.com/svn/asterisk/trunk ................ r155554 | seanbright | 2008-11-08 20:27:00 -0500 (Sat, 08 Nov 2008) | 14 lines Merged revisions 155553 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r155553 | seanbright | 2008-11-08 20:08:07 -0500 (Sat, 08 Nov 2008) | 6 lines Use static functions here instead of nested ones. This requires a small change to the ast_bridge_config struct as well. To understand the reason for this change, see the following post: http://gcc.gnu.org/ml/gcc-help/2008-11/msg00049.html ........ ................ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@155555 f38db490-d61c-443f-a65b-d21fe96a405b --- apps/app_dial.c | 43 ++++++++++++++++++++++--------------------- apps/app_followme.c | 43 ++++++++++++++++++++++--------------------- apps/app_queue.c | 17 ++++++++++------- include/asterisk/channel.h | 3 ++- main/features.c | 2 +- 5 files changed, 57 insertions(+), 51 deletions(-) diff --git a/apps/app_dial.c b/apps/app_dial.c index 25776c0f4..63bc5f32c 100644 --- a/apps/app_dial.c +++ b/apps/app_dial.c @@ -1215,6 +1215,27 @@ static void set_dial_features(struct ast_flags64 *opts, struct ast_dial_features ast_app_options2str64(dial_exec_options, &perm_opts, features->options, sizeof(features->options)); } +static void end_bridge_callback(void *data) +{ + char buf[80]; + time_t end; + struct ast_channel *chan = data; + + time(&end); + + ast_channel_lock(chan); + if (chan->cdr->answer.tv_sec) { + snprintf(buf, sizeof(buf), "%ld", end - chan->cdr->answer.tv_sec); + pbx_builtin_setvar_helper(chan, "ANSWEREDTIME", buf); + } + + if (chan->cdr->start.tv_sec) { + snprintf(buf, sizeof(buf), "%ld", end - chan->cdr->start.tv_sec); + pbx_builtin_setvar_helper(chan, "DIALEDTIME", buf); + } + ast_channel_unlock(chan); +} + static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags64 *peerflags, int *continue_exec) { int res = -1; /* default: error */ @@ -1844,27 +1865,6 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags if (res) { /* some error */ res = -1; } else { - auto void end_bridge_callback(void); - void end_bridge_callback (void) - { - char buf[80]; - time_t end; - - time(&end); - - ast_channel_lock(chan); - if (chan->cdr->answer.tv_sec) { - snprintf(buf, sizeof(buf), "%ld", end - chan->cdr->answer.tv_sec); - pbx_builtin_setvar_helper(chan, "ANSWEREDTIME", buf); - } - - if (chan->cdr->start.tv_sec) { - snprintf(buf, sizeof(buf), "%ld", end - chan->cdr->start.tv_sec); - pbx_builtin_setvar_helper(chan, "DIALEDTIME", buf); - } - ast_channel_unlock(chan); - } - if (ast_test_flag64(peerflags, OPT_CALLEE_TRANSFER)) ast_set_flag(&(config.features_callee), AST_FEATURE_REDIRECT); if (ast_test_flag64(peerflags, OPT_CALLER_TRANSFER)) @@ -1889,6 +1889,7 @@ static int dial_exec_full(struct ast_channel *chan, void *data, struct ast_flags ast_set_flag(&(config.features_caller), AST_FEATURE_NO_H_EXTEN); config.end_bridge_callback = end_bridge_callback; + config.end_bridge_callback_data = chan; if (moh) { moh = 0; diff --git a/apps/app_followme.c b/apps/app_followme.c index bbc4e3e0c..a4d20f857 100644 --- a/apps/app_followme.c +++ b/apps/app_followme.c @@ -875,6 +875,27 @@ static void findmeexec(struct fm_args *tpargs) } +static void end_bridge_callback(void *data) +{ + char buf[80]; + time_t end; + struct ast_channel *chan = data; + + time(&end); + + ast_channel_lock(chan); + if (chan->cdr->answer.tv_sec) { + snprintf(buf, sizeof(buf), "%ld", end - chan->cdr->answer.tv_sec); + pbx_builtin_setvar_helper(chan, "ANSWEREDTIME", buf); + } + + if (chan->cdr->start.tv_sec) { + snprintf(buf, sizeof(buf), "%ld", end - chan->cdr->start.tv_sec); + pbx_builtin_setvar_helper(chan, "DIALEDTIME", buf); + } + ast_channel_unlock(chan); +} + static int app_exec(struct ast_channel *chan, void *data) { struct fm_args targs; @@ -986,27 +1007,6 @@ static int app_exec(struct ast_channel *chan, void *data) ast_stream_and_wait(chan, targs.sorryprompt, ""); res = 0; } else { - auto void end_bridge_callback(void); - void end_bridge_callback (void) - { - char buf[80]; - time_t end; - - time(&end); - - ast_channel_lock(chan); - if (chan->cdr->answer.tv_sec) { - snprintf(buf, sizeof(buf), "%ld", end - chan->cdr->answer.tv_sec); - pbx_builtin_setvar_helper(chan, "ANSWEREDTIME", buf); - } - - if (chan->cdr->start.tv_sec) { - snprintf(buf, sizeof(buf), "%ld", end - chan->cdr->start.tv_sec); - pbx_builtin_setvar_helper(chan, "DIALEDTIME", buf); - } - ast_channel_unlock(chan); - } - caller = chan; outbound = targs.outbound; /* Bridge the two channels. */ @@ -1016,6 +1016,7 @@ static int app_exec(struct ast_channel *chan, void *data) ast_set_flag(&(config.features_callee), AST_FEATURE_AUTOMON); ast_set_flag(&(config.features_caller), AST_FEATURE_AUTOMON); config.end_bridge_callback = end_bridge_callback; + config.end_bridge_callback_data = chan; ast_moh_stop(caller); /* Be sure no generators are left on it */ diff --git a/apps/app_queue.c b/apps/app_queue.c index 7f7f0db4a..2f87a0f51 100644 --- a/apps/app_queue.c +++ b/apps/app_queue.c @@ -3144,6 +3144,15 @@ static void setup_transfer_datastore(struct queue_ent *qe, struct member *member ast_channel_unlock(qe->chan); } +static void end_bridge_callback(void *data) +{ + struct queue_ent *qe = data; + + ao2_lock(qe->parent); + set_queue_variables(qe); + ao2_unlock(qe->parent); +} + /*! \brief A large function which calls members, updates statistics, and bridges the caller and a member * * Here is the process of this function @@ -3211,13 +3220,6 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce int callcompletedinsl; struct ao2_iterator memi; struct ast_datastore *datastore; - auto void end_bridge_callback(void); - void end_bridge_callback(void) - { - ao2_lock(qe->parent); - set_queue_variables(qe); - ao2_unlock(qe->parent); - } ast_channel_lock(qe->chan); datastore = ast_channel_datastore_find(qe->chan, &dialed_interface_info, NULL); @@ -3289,6 +3291,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce } bridge_config.end_bridge_callback = end_bridge_callback; + bridge_config.end_bridge_callback_data = qe; /* Hold the lock while we setup the outgoing calls */ if (use_weight) diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index 8d92d872d..2352ec116 100644 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -620,7 +620,8 @@ struct ast_bridge_config { const char *start_sound; int firstpass; unsigned int flags; - void (* end_bridge_callback)(void); /*!< A callback that is called after a bridge attempt */ + void (* end_bridge_callback)(void *); /*!< A callback that is called after a bridge attempt */ + void *end_bridge_callback_data; /*!< Data passed to the callback */ }; struct chanmon; diff --git a/main/features.c b/main/features.c index d7b1bf640..4eb059711 100644 --- a/main/features.c +++ b/main/features.c @@ -2172,7 +2172,7 @@ int ast_bridge_call(struct ast_channel *chan,struct ast_channel *peer,struct ast new_peer_cdr = pick_unlocked_cdr(peer->cdr); /* the proper chan cdr, if there are forked cdrs */ if (res != AST_PBX_KEEPALIVE && config->end_bridge_callback) { - config->end_bridge_callback(); + config->end_bridge_callback(config->end_bridge_callback_data); } autoloopflag = ast_test_flag(chan, AST_FLAG_IN_AUTOLOOP); -- cgit v1.2.3