aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2008-07-01 19:20:25 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2008-07-01 19:20:25 +0000
commitbe73effbcc4a086ff82f9fbedc40126b60402b3b (patch)
tree770fd3fe5f13e3dbd9dbcefaa6ed75062a50bdd5
parentf591c4add5e6c5fd5503759f492facb60b9a8bdb (diff)
Merged revisions 127068 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r127068 | tilghman | 2008-07-01 13:52:53 -0500 (Tue, 01 Jul 2008) | 8 lines 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: http://svn.digium.com/svn/asterisk/trunk@127074 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--channels/chan_iax2.c46
1 files changed, 22 insertions, 24 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 62764418f..e78a8b65d 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -1147,12 +1147,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]);
@@ -1160,14 +1164,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
@@ -1196,12 +1192,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]);
@@ -1209,14 +1209,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
@@ -1569,13 +1561,19 @@ 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)) {
+ /*!
+ * \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[callno]->pingid);
+ AST_SCHED_DEL(sched, iaxs[callno]->lagid);
iaxs[x] = iaxs[callno];
iaxs[x]->callno = x;
iaxs[callno] = NULL;
/* Update the two timers that should have been started */
- iaxs[x]->pingid = iax2_sched_replace(iaxs[x]->pingid, sched,
+ iaxs[x]->pingid = iax2_sched_add(sched,
ping_time * 1000, send_ping, (void *)(long)x);
- iaxs[x]->lagid = iax2_sched_replace(iaxs[x]->lagid, sched,
+ iaxs[x]->lagid = iax2_sched_add(sched,
lagrq_time * 1000, send_lagrq, (void *)(long)x);
if (locked)
ast_mutex_unlock(&iaxsl[callno]);