From 7263a17ca046923c245296a3cee21df0e4bd499a Mon Sep 17 00:00:00 2001 From: George Joseph Date: Mon, 14 Nov 2016 13:03:46 -0700 Subject: channel: Fix issues in hangup scenarios caused by frame deferral ASTERISK-26343 Change-Id: I06dbf7366e26028251964143454a77d017bb61c8 (cherry picked from commit 0be46aaf6b8b9eb5b0160ec591cdc2c6e1802a6d) --- include/asterisk/channel.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'include/asterisk/channel.h') diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index e5f53f082..9150cbbbb 100644 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -972,6 +972,11 @@ enum { * frames should be deferred. */ AST_FLAG_DEFER_FRAMES = (1 << 28), + /*! + * The channel is currently deferring hangup frames + * in addition to other frame types. + */ + AST_FLAG_DEFER_HANGUP_FRAMES = (1 << 29), }; /*! \brief ast_bridge_config flags */ @@ -4690,11 +4695,17 @@ struct ast_readq_list *ast_channel_deferred_readq(struct ast_channel *chan); * drop important frames. This function can be called so that important frames * will be deferred, rather than placed in the channel frame queue as normal. * + * Hangups are an interesting frame type. Hangups will always be detectable by + * a reader when a channel is deferring frames. If the defer_hangups parameter + * is non-zero, then the hangup frame will also be duplicated and deferred, so + * that the next reader of the channel will get the hangup frame, too. + * * \pre chan MUST be locked before calling * * \param chan The channel on which frames should be deferred + * \param defer_hangups Defer hangups in addition to other deferrable frames */ -void ast_channel_start_defer_frames(struct ast_channel *chan); +void ast_channel_start_defer_frames(struct ast_channel *chan, int defer_hangups); /*! * \brief Stop deferring deferrable frames on this channel -- cgit v1.2.3