aboutsummaryrefslogtreecommitdiffstats
path: root/channel.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-05-20 16:30:10 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2004-05-20 16:30:10 +0000
commitec76498f552e4ff10adcaa0ffc27d1c21cb5792e (patch)
treeefbb775d4f7e80cb61b314075217774d082e881a /channel.c
parent7e42c962d89de0673789eed30649fc7ae276aa50 (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-xchannel.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/channel.c b/channel.c
index 8d23fca78..896fa8998 100755
--- a/channel.c
+++ b/channel.c
@@ -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;
}