summaryrefslogtreecommitdiff
path: root/include/asterisk
diff options
context:
space:
mode:
Diffstat (limited to 'include/asterisk')
-rw-r--r--include/asterisk/autochan.h20
1 files changed, 20 insertions, 0 deletions
diff --git a/include/asterisk/autochan.h b/include/asterisk/autochan.h
index a0981b7c9..319c203ab 100644
--- a/include/asterisk/autochan.h
+++ b/include/asterisk/autochan.h
@@ -56,8 +56,28 @@ struct ast_autochan {
* to save off the pointer using ast_channel_ref and to unref the channel when you
* are finished with the pointer. If you do not do this and a masquerade occurs on
* the channel, then it is possible that your saved pointer will become invalid.
+ *
+ * 3. If you want to lock the autochan->chan channel, be sure to use
+ * ast_autochan_channel_lock and ast_autochan_channel_unlock. An attempt to lock
+ * the autochan->chan directly may result in it being changed after you've
+ * retrieved the value of chan, but before you've had a chance to lock it.
+ * First when chan is locked, the autochan structure is guaranteed to keep the
+ * same channel.
*/
+#define ast_autochan_channel_lock(autochan) \
+ do { \
+ struct ast_channel *autochan_chan = autochan->chan; \
+ ast_channel_lock(autochan_chan); \
+ if (autochan->chan == autochan_chan) { \
+ break; \
+ } \
+ ast_channel_unlock(autochan_chan); \
+ } while (1)
+
+#define ast_autochan_channel_unlock(autochan) \
+ ast_channel_unlock(autochan->chan)
+
/*!
* \brief set up a new ast_autochan structure
*