diff options
author | Mark Michelson <mmichelson@digium.com> | 2016-11-03 16:36:13 -0500 |
---|---|---|
committer | Mark Michelson <mmichelson@digium.com> | 2016-11-07 12:25:59 -0600 |
commit | 9231a56cf3d6f5eca1bf2d37d827453400690773 (patch) | |
tree | 05e77e73135c85693acab9930b6a55725850ea02 /include/asterisk | |
parent | d971647949a5a6dee5c80526f2baa90b02687ad5 (diff) |
Add API for channel frame deferral.
There are several places in Asterisk that have duplicated logic
for deferring important frames until later.
This commit adds a couple of API calls to facilitate this automatically.
ast_channel_start_defer_frames(): Future reads of deferrable frames on
this channel will be deferred until later.
ast_channel_stop_defer_frames(): Any frames that have been deferred get
requeued onto the channel.
ASTERISK-26343
Change-Id: I3e1b87bc6796f222442fa6f7d1b6a4706fb33641
Diffstat (limited to 'include/asterisk')
-rw-r--r-- | include/asterisk/channel.h | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/include/asterisk/channel.h b/include/asterisk/channel.h index a76e606f9..a18591fb1 100644 --- a/include/asterisk/channel.h +++ b/include/asterisk/channel.h @@ -966,6 +966,11 @@ enum { * The channel is executing a subroutine or macro */ AST_FLAG_SUBROUTINE_EXEC = (1 << 27), + /*! + * The channel is currently in an operation where + * frames should be deferred. + */ + AST_FLAG_DEFER_FRAMES = (1 << 28), }; /*! \brief ast_bridge_config flags */ @@ -4681,4 +4686,37 @@ enum ast_channel_error { */ enum ast_channel_error ast_channel_errno(void); +/*! + * \brief Retrieve the deferred read queue. + */ +struct ast_readq_list *ast_channel_deferred_readq(struct ast_channel *chan); + +/*! + * \brief Start deferring deferrable frames on this channel + * + * Sometimes, a channel gets entered into a mode where a "main" application + * is tasked with servicing frames on the channel, but that application does + * not need to act on those frames. However, it would be imprudent to simply + * 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. + * + * \pre chan MUST be locked before calling + * + * \param chan The channel on which frames should be deferred + */ +void ast_channel_start_defer_frames(struct ast_channel *chan); + +/*! + * \brief Stop deferring deferrable frames on this channel + * + * When it is time to stop deferring frames on the channel, all deferred frames + * will be queued onto the channel's read queue so that the next servicer of + * the channel can handle those frames as necessary. + * + * \pre chan MUST be locked before calling + * + * \param chan The channel on which to stop deferring frames. + */ +void ast_channel_stop_defer_frames(struct ast_channel *chan); + #endif /* _ASTERISK_CHANNEL_H */ |