Index: channels/chan_iax2.c =================================================================== --- channels/chan_iax2.c (revision 124181) +++ channels/chan_iax2.c (working copy) @@ -997,12 +997,16 @@ ast_mutex_lock(&iaxsl[callno]); - while (iaxs[callno] && iaxs[callno]->pingid != -1) { + if (iaxs[callno]) { if (iaxs[callno]->peercallno) { send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_PING, 0, NULL, 0, -1); + iaxs[callno]->pingid = iax2_sched_add(sched, ping_time * 1000, send_ping, data); + } else { + /* I am the schedule, so I'm allowed to do this */ + iaxs[callno]->pingid = -1; } - iaxs[callno]->pingid = iax2_sched_add(sched, ping_time * 1000, send_ping, data); - break; + } else if (option_debug > 0) { + ast_log(LOG_DEBUG, "I was supposed to send a PING with callno %d, but no such call exists (and I cannot remove pingid, either).\n", callno); } ast_mutex_unlock(&iaxsl[callno]); @@ -1010,14 +1014,6 @@ static int send_ping(const void *data) { - int callno = (long) data; - - ast_mutex_lock(&iaxsl[callno]); - if (iaxs[callno]) { - iaxs[callno]->pingid = -1; - } - ast_mutex_unlock(&iaxsl[callno]); - #ifdef SCHED_MULTITHREADED if (schedule_action(__send_ping, data)) #endif @@ -1046,12 +1042,16 @@ ast_mutex_lock(&iaxsl[callno]); - while (iaxs[callno] && iaxs[callno]->lagid > -1) { + if (iaxs[callno]) { if (iaxs[callno]->peercallno) { send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_LAGRQ, 0, NULL, 0, -1); + iaxs[callno]->lagid = iax2_sched_add(sched, lagrq_time * 1000, send_lagrq, data); + } else { + /* I am the schedule, so I'm allowed to do this */ + iaxs[callno]->lagid = -1; } - iaxs[callno]->lagid = iax2_sched_add(sched, lagrq_time * 1000, send_lagrq, data); - break; + } else if (option_debug > 0) { + ast_log(LOG_DEBUG, "I was supposed to send a LAGRQ with callno %d, but no such call exists (and I cannot remove lagid, either).\n", callno); } ast_mutex_unlock(&iaxsl[callno]); @@ -1059,14 +1059,6 @@ static int send_lagrq(const void *data) { - int callno = (long) data; - - ast_mutex_lock(&iaxsl[callno]); - if (iaxs[callno]) { - iaxs[callno]->lagid = -1; - } - ast_mutex_unlock(&iaxsl[callno]); - #ifdef SCHED_MULTITHREADED if (schedule_action(__send_lagrq, data)) #endif @@ -1313,6 +1305,8 @@ } } if (!owner) { + AST_SCHED_DEL(sched, iaxs[callno]->lagid); + AST_SCHED_DEL(sched, iaxs[callno]->pingid); iaxs[callno] = NULL; }