summaryrefslogtreecommitdiff
path: root/res/stasis
diff options
context:
space:
mode:
authorKinsey Moore <kmoore@digium.com>2014-03-13 19:33:22 +0000
committerKinsey Moore <kmoore@digium.com>2014-03-13 19:33:22 +0000
commit5247a0d99078ecc0a108aba5ac24570f6f082f46 (patch)
tree521df3eb64904cac29e391a4c216d26fd5482dc6 /res/stasis
parent1b5c09897649fec6742136ac6a575cd6f286dd2b (diff)
ARI: Ensure managing application receives ChannelEnteredBridge messages
This fixes an issue where a Stasis application running over ARI and subscribed to ari/events could miss the ChannelEnteredBridge event because it did not subscribe to the new bridge fast enough. To accomplish this, it subscribes the application controlling the channel to the new bridge before adding it to that bridge which required the stasis_app_control structure to maintain a reference to the stasis_app. (closes issue ASTERISK-23295) Review: https://reviewboard.asterisk.org/r/3336/ ........ Merged revisions 410527 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@410528 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res/stasis')
-rw-r--r--res/stasis/control.c18
-rw-r--r--res/stasis/control.h4
2 files changed, 20 insertions, 2 deletions
diff --git a/res/stasis/control.c b/res/stasis/control.c
index d813a2443..d91a9f8d0 100644
--- a/res/stasis/control.c
+++ b/res/stasis/control.c
@@ -31,6 +31,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#include "command.h"
#include "control.h"
+#include "app.h"
#include "asterisk/dial.h"
#include "asterisk/bridge.h"
#include "asterisk/bridge_after.h"
@@ -73,6 +74,10 @@ struct stasis_app_control {
*/
struct ast_silence_generator *silgen;
/*!
+ * The app for which this control was created
+ */
+ struct stasis_app *app;
+ /*!
* When set, /c app_stasis should exit and continue in the dialplan.
*/
int is_done:1;
@@ -91,9 +96,10 @@ static void control_dtor(void *obj)
ao2_cleanup(control->command_queue);
ast_cond_destroy(&control->wait_cond);
+ ao2_cleanup(control->app);
}
-struct stasis_app_control *control_create(struct ast_channel *channel)
+struct stasis_app_control *control_create(struct ast_channel *channel, struct stasis_app *app)
{
RAII_VAR(struct stasis_app_control *, control, NULL, ao2_cleanup);
int res;
@@ -103,6 +109,8 @@ struct stasis_app_control *control_create(struct ast_channel *channel)
return NULL;
}
+ control->app = ao2_bump(app);
+
res = ast_cond_init(&control->wait_cond, NULL);
if (res != 0) {
ast_log(LOG_ERROR, "Error initializing ast_cond_t: %s\n",
@@ -798,6 +806,8 @@ static void bridge_after_cb(struct ast_channel *chan, void *data)
ast_channel_pbx_set(control->channel, control->pbx);
control->pbx = NULL;
+ app_unsubscribe_bridge(control->app, control->bridge);
+
/* No longer in the bridge */
control->bridge = NULL;
@@ -865,6 +875,12 @@ static int app_control_add_channel_to_bridge(
*/
SCOPED_AO2LOCK(lock, control);
+ /* Ensure the controlling application is subscribed early enough
+ * to receive the ChannelEnteredBridge message. This works in concert
+ * with the subscription handled in the Stasis application execution
+ * loop */
+ app_subscribe_bridge(control->app, bridge);
+
/* Save off the channel's PBX */
ast_assert(control->pbx == NULL);
if (!control->pbx) {
diff --git a/res/stasis/control.h b/res/stasis/control.h
index 042fc67bb..6b602e770 100644
--- a/res/stasis/control.h
+++ b/res/stasis/control.h
@@ -33,10 +33,12 @@
* \brief Create a control object.
*
* \param channel Channel to control.
+ * \param app stasis_app for which this control is being created.
+ *
* \return New control object.
* \return \c NULL on error.
*/
-struct stasis_app_control *control_create(struct ast_channel *channel);
+struct stasis_app_control *control_create(struct ast_channel *channel, struct stasis_app *app);
/*!
* \brief Dispatch all commands enqueued to this control.