diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-05-20 16:30:10 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-05-20 16:30:10 +0000 |
commit | ec76498f552e4ff10adcaa0ffc27d1c21cb5792e (patch) | |
tree | efbb775d4f7e80cb61b314075217774d082e881a /channel.c | |
parent | 7e42c962d89de0673789eed30649fc7ae276aa50 (diff) |
Make ast_channel_walk become ast_channel_walk_locked
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@3029 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channel.c')
-rwxr-xr-x | channel.c | 18 |
1 files changed, 15 insertions, 3 deletions
@@ -444,12 +444,15 @@ void ast_channel_undefer_dtmf(struct ast_channel *chan) chan->deferdtmf = 0; } -struct ast_channel *ast_channel_walk(struct ast_channel *prev) +struct ast_channel *ast_channel_walk_locked(struct ast_channel *prev) { + /* Returns next channel (locked) */ struct ast_channel *l, *ret=NULL; ast_mutex_lock(&chlock); l = channels; if (!prev) { + if (l) + ast_mutex_lock(&l->lock); ast_mutex_unlock(&chlock); return l; } @@ -458,6 +461,8 @@ struct ast_channel *ast_channel_walk(struct ast_channel *prev) ret = l->next; l = l->next; } + if (ret) + ast_mutex_lock(&ret->lock); ast_mutex_unlock(&chlock); return ret; @@ -527,6 +532,12 @@ void ast_channel_free(struct ast_channel *chan) } if (!cur) ast_log(LOG_WARNING, "Unable to find channel in list\n"); + else { + /* Lock and unlock the channel just to be sure nobody + has it locked still */ + ast_mutex_lock(&cur->lock); + ast_mutex_unlock(&cur->lock); + } if (chan->pvt->pvt) ast_log(LOG_WARNING, "Channel '%s' may not have been hung up properly\n", chan->name); @@ -1798,15 +1809,16 @@ int ast_parse_device_state(char *device) char *cut; struct ast_channel *chan; - chan = ast_channel_walk(NULL); + chan = ast_channel_walk_locked(NULL); while (chan) { strncpy(name, chan->name, sizeof(name)-1); + ast_mutex_unlock(&chan->lock); cut = strchr(name,'-'); if (cut) *cut = 0; if (!strcmp(name, device)) return AST_DEVICE_INUSE; - chan = ast_channel_walk(chan); + chan = ast_channel_walk_locked(chan); } return AST_DEVICE_UNKNOWN; } |