diff options
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_iax2.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index eca3ba7b3..a477c97fe 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -1412,6 +1412,8 @@ static int iax2_getpeername(struct sockaddr_in sin, char *host, int len) return res; } +/*!\note Assumes the lock on the pvt is already held, when + * iax2_destroy_helper() is called. */ static void iax2_destroy_helper(struct chan_iax2_pvt *pvt) { /* Decrement AUTHREQ count if needed */ @@ -1430,8 +1432,8 @@ static void iax2_destroy_helper(struct chan_iax2_pvt *pvt) ast_clear_flag(pvt, IAX_MAXAUTHREQ); } /* No more pings or lagrq's */ - AST_SCHED_DEL(sched, pvt->pingid); - AST_SCHED_DEL(sched, pvt->lagid); + AST_SCHED_DEL_SPINLOCK(sched, pvt->pingid, &iaxsl[pvt->callno]); + AST_SCHED_DEL_SPINLOCK(sched, pvt->lagid, &iaxsl[pvt->callno]); AST_SCHED_DEL(sched, pvt->autoid); AST_SCHED_DEL(sched, pvt->authid); AST_SCHED_DEL(sched, pvt->initid); @@ -1450,7 +1452,9 @@ static void pvt_destructor(void *obj) struct chan_iax2_pvt *pvt = obj; struct iax_frame *cur = NULL; + ast_mutex_lock(&iaxsl[pvt->callno]); iax2_destroy_helper(pvt); + ast_mutex_unlock(&iaxsl[pvt->callno]); /* Already gone */ ast_set_flag(pvt, IAX_ALREADYGONE); @@ -2309,6 +2313,8 @@ static void iax2_destroy(int callno) retry: pvt = iaxs[callno]; + iax2_destroy_helper(pvt); + lastused[callno] = ast_tvnow(); owner = pvt ? pvt->owner : NULL; |