Index: include/asterisk/channel.h =================================================================== --- include/asterisk/channel.h (revision 154189) +++ include/asterisk/channel.h (working copy) @@ -1177,6 +1177,9 @@ struct ast_channel *ast_walk_channel_by_exten_locked(const struct ast_channel *chan, const char *exten, const char *context); +/*! \brief Search for a channel based on the specified filter (first match) and lock it */ +struct ast_channel *ast_channel_search_locked(int (*filter)(struct ast_channel *)); + /*! ! \brief Waits for a digit * \param c channel to wait for a digit on * \param ms how many milliseconds to wait Index: main/channel.c =================================================================== --- main/channel.c (revision 154189) +++ main/channel.c (working copy) @@ -1226,6 +1226,24 @@ return channel_find_locked(chan, NULL, 0, context, exten); } +/*! \brief Search for a channel based on the specified filter (first match) and lock it */ +struct ast_channel *ast_channel_search_locked(int (*filter)(struct ast_channel *)) +{ + struct ast_channel *c; + + AST_RWLIST_RDLOCK(&channels); + AST_RWLIST_TRAVERSE(&channels, c, chan_list) { + if (filter(c)) { + ast_channel_lock(c); + AST_RWLIST_UNLOCK(&channels); + return c; + } + } + AST_RWLIST_UNLOCK(&channels); + + return NULL; +} + /*! \brief Wait, look for hangups and condition arg */ int ast_safe_sleep_conditional(struct ast_channel *chan, int ms, int (*cond)(void*), void *data) {