diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-04-08 13:50:04 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-04-08 13:50:04 +0000 |
commit | 81627041adfa1eb9ef6748a7cb2efeeebbbd6afd (patch) | |
tree | 5420b3c52364b21c30fa55afd5f24e8d5f6e7493 /channels/chan_local.c | |
parent | 2ac8552c3a7ca0e4af0ce80e722a515e9031d641 (diff) |
Unlink local channels
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@778 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_local.c')
-rwxr-xr-x | channels/chan_local.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/channels/chan_local.c b/channels/chan_local.c index feabb36ba..c8d4371e7 100755 --- a/channels/chan_local.c +++ b/channels/chan_local.c @@ -220,6 +220,7 @@ static int local_hangup(struct ast_channel *ast) struct local_pvt *p = ast->pvt->pvt; int isoutbound = IS_OUTBOUND(ast, p); struct ast_frame f = { AST_FRAME_CONTROL, AST_CONTROL_HANGUP }; + struct local_pvt *cur, *prev=NULL; ast_pthread_mutex_lock(&p->lock); if (isoutbound) p->chan = NULL; @@ -229,6 +230,22 @@ static int local_hangup(struct ast_channel *ast) if (!p->owner && !p->chan) { /* Okay, done with the private part now, too. */ ast_pthread_mutex_unlock(&p->lock); + /* Remove from list */ + ast_pthread_mutex_lock(&locallock); + cur = locals; + while(cur) { + if (cur == p) { + if (prev) + prev->next == cur->next; + else + locals = cur->next; + break; + } + prev = cur; + cur = cur->next; + } + ast_pthread_mutex_unlock(&locallock); + /* And destroy */ free(p); return 0; } |