Stasis: Fix StasisEnd message ordering

This change corrects message ordering in cases where a channel-related
message can be received after a Stasis/ARI application has received the
StasisEnd message. The StasisEnd message was being passed to
applications directly without waiting for the channel topic to empty.

As a result of this fix, other bugs were also identified and fixed:
* StasisStart messages were also being sent directly to apps and are
  now routed through the stasis message bus properly
* Masquerade monitor datastores were being removed at the incorrect
  time in some cases and were causing StasisEnd messages to not be sent
* General refactoring where necessary for the above
* Unsubscription on StasisEnd timing changes to prevent additional
  messages from following the StasisEnd when they shouldn't

A channel sanitization function pointer was added to reduce processing
and AO2 lookups.

Review: https://reviewboard.asterisk.org/r/4163/
ASTERISK-24501 #close
Reported by: Matt Jordan
........

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

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


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@427790 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Kinsey Moore
2014-11-13 15:46:48 +00:00
parent cc4c396647
commit 74e706878b
6 changed files with 181 additions and 153 deletions

View File

@@ -270,4 +270,27 @@ char *app_get_replace_channel_app(struct ast_channel *chan);
*/
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
*
* \param app The app that owns the channel
* \param chan The channel for which the message is being sent
*
* \retval zero on success
* \return non-zero on failure
*/
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 */