Stasis: Fix StasisStart/End order and missing events

This corrects several bugs that currently exist in the stasis
application code.

* After a masquerade, the resulting channels have channel topics that
  do not match their uniqueids
** Masquerades now swap channel topics appropriately
* StasisStart and StasisEnd messages are leaked to observer
  applications due to being published on channel topics
** StasisStart and StasisEnd publishing is now properly restricted
   to controlling apps via app topics
* Race conditions exist where StasisStart and StasisEnd messages due to
  a masquerade may be received out of order due to being published on
  different topics
** These messages are now published directly on the app topic so this
   is now a non-issue
* StasisEnds are sometimes missing when sent due to masquerades and
  bridge swaps into and out of Stasis()
** This was due to StasisEnd processing adjusting message-sent flags
   after Stasis() had already exited and Stasis() had been re-entered
** This was corrected by adjusting these flags prior to sending the
   message while the initial Stasis() application was still shutting
   down

Review: https://reviewboard.asterisk.org/r/4213/
ASTERISK-24537 #close
Reported by: Matt DiMeo
........

Merged revisions 429061 from http://svn.asterisk.org/svn/asterisk/branches/12
........

Merged revisions 429062 from http://svn.asterisk.org/svn/asterisk/branches/13


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@429063 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Kinsey Moore
2014-12-08 15:45:46 +00:00
parent 49aa87e17c
commit 4bb556a847
7 changed files with 47 additions and 95 deletions

View File

@@ -258,18 +258,6 @@ int app_set_replace_channel_app(struct ast_channel *chan, const char *replace_ap
*/
char *app_get_replace_channel_app(struct ast_channel *chan);
/*!
* \brief Replace channel topic forwards for the old channel with forwards for the new channel
*
* \param app The app that owns the channel
* \param old_id The unique ID of the channel to be replaced
* \param new_chan The channel that is replacing the old one
*
* \retval zero on success
* \return non-zero on failure
*/
int app_replace_channel_forwards(struct stasis_app *app, const char *old_id, struct ast_channel *new_chan);
/*!
* \brief Send StasisEnd message to the listening app
*
@@ -281,16 +269,4 @@ int app_replace_channel_forwards(struct stasis_app *app, const char *old_id, str
*/
int app_send_end_msg(struct stasis_app *app, struct ast_channel *chan);
/*!
* \brief Handle cleanup related to StasisEnd messages
*
* \param message The message for which to clean up
*/
void app_end_message_handler(struct stasis_message *message);
/*!
* \brief Accessor for the StasisEnd message type
*/
struct stasis_message_type *app_end_message_type(void);
#endif /* _ASTERISK_RES_STASIS_APP_H */