Index: main/channel.c =================================================================== --- main/channel.c (revision 320442) +++ main/channel.c (working copy) @@ -1632,13 +1632,21 @@ struct ast_channel *chan = obj, *cmp_args = arg; size_t name_len; int ret = CMP_MATCH; + int locktry = 10; /* This is sort of a hack. Basically, we're using an arbitrary field * in ast_channel to pass the name_len for a prefix match. If this * gets changed, then the uses of ao2_find() must be changed, too. */ name_len = cmp_args->rings; - ast_channel_lock(chan); + /*Deadlock avoidance*/ + while (ast_channel_trylock(chan)) { + if (locktry++ > 10) { + ast_debug(1, "Deadlock avoided for ast_channel_cmp_cb '%s'\n", chan->name); + return 0; + } + usleep(1); + } if (!ast_strlen_zero(cmp_args->name)) { /* match by name */ if ((!name_len && strcasecmp(chan->name, cmp_args->name)) ||