From: Tilghman Lesher Date: Tue, 1 Jul 2008 18:52:53 +0000 (+0000) Subject: Change around how we schedule pings and lagrqs, and fix a reason why the X-Git-Tag: 1.4.22-rc1~158 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=00b8646ae2a518752ec1722608ef3e816de4b3c2;p=thirdparty%2Fasterisk.git Change around how we schedule pings and lagrqs, and fix a reason why the jobs were not getting properly cancelled. (closes issue #12903) Reported by: stevedavies Patches: 20080620__bug12903__2.diff.txt uploaded by Corydon76 (license 14) Tested by: stevedavies git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@127068 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index a78ffdc90f..34d45476fc 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -997,12 +997,16 @@ static void __send_ping(const void *data) 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 void __send_ping(const void *data) 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 @@ static void __send_lagrq(const void *data) 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 void __send_lagrq(const void *data) 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 @@ retry: } } if (!owner) { + AST_SCHED_DEL(sched, iaxs[callno]->lagid); + AST_SCHED_DEL(sched, iaxs[callno]->pingid); iaxs[callno] = NULL; } @@ -1494,12 +1488,16 @@ static int make_trunk(unsigned short callno, int locked) for (x = TRUNK_CALL_START; x < ARRAY_LEN(iaxs) - 1; x++) { ast_mutex_lock(&iaxsl[x]); if (!iaxs[x] && ((now.tv_sec - lastused[x].tv_sec) > MIN_REUSE_TIME)) { - iaxs[x] = iaxs[callno]; - iaxs[x]->callno = x; - iaxs[callno] = NULL; /* Update the two timers that should have been started */ + /*! + * \note We delete these before switching the slot, because if + * they fire in the meantime, they will generate a warning. + */ AST_SCHED_DEL(sched, iaxs[x]->pingid); AST_SCHED_DEL(sched, iaxs[x]->lagid); + iaxs[x] = iaxs[callno]; + iaxs[x]->callno = x; + iaxs[callno] = NULL; iaxs[x]->pingid = iax2_sched_add(sched, ping_time * 1000, send_ping, (void *)(long)x); iaxs[x]->lagid = iax2_sched_add(sched, lagrq_time * 1000, send_lagrq, (void *)(long)x); if (locked)