From 4bb556a8478741dc81361327d3a50a8809be09f6 Mon Sep 17 00:00:00 2001 From: Kinsey Moore Date: Mon, 8 Dec 2014 15:45:46 +0000 Subject: 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 --- main/channel_internal_api.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'main/channel_internal_api.c') diff --git a/main/channel_internal_api.c b/main/channel_internal_api.c index c62812ea7..624bdd1cb 100644 --- a/main/channel_internal_api.c +++ b/main/channel_internal_api.c @@ -1534,6 +1534,15 @@ void ast_channel_internal_swap_uniqueid_and_linkedid(struct ast_channel *a, stru b->linkedid = temp; } +void ast_channel_internal_swap_topics(struct ast_channel *a, struct ast_channel *b) +{ + struct stasis_cp_single *temp; + + temp = a->topics; + a->topics = b->topics; + b->topics = temp; +} + void ast_channel_internal_set_fake_ids(struct ast_channel *chan, const char *uniqueid, const char *linkedid) { ast_copy_string(chan->uniqueid.unique_id, uniqueid, sizeof(chan->uniqueid.unique_id)); -- cgit v1.2.3