[asterisk-commits] russell: branch russell/iax2_poke_fix r87644 - /team/russell/iax2_poke_fix/ch...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Oct 30 14:24:41 CDT 2007
Author: russell
Date: Tue Oct 30 14:24:41 2007
New Revision: 87644
URL: http://svn.digium.com/view/asterisk?view=rev&rev=87644
Log:
Make the peer reference count reflect pending scheduler callbacks to send
a POKE, or to expire a POKE that has been sent.
Modified:
team/russell/iax2_poke_fix/channels/chan_iax2.c
Modified: team/russell/iax2_poke_fix/channels/chan_iax2.c
URL: http://svn.digium.com/view/asterisk/team/russell/iax2_poke_fix/channels/chan_iax2.c?view=diff&rev=87644&r1=87643&r2=87644
==============================================================================
--- team/russell/iax2_poke_fix/channels/chan_iax2.c (original)
+++ team/russell/iax2_poke_fix/channels/chan_iax2.c Tue Oct 30 14:24:41 2007
@@ -5784,6 +5784,13 @@
}
}
+ if (peer->pokeexpire > -1) {
+ if (!ast_sched_del(sched, peer->pokeexpire)) {
+ peer->pokeexpire = -1;
+ peer_unref(peer);
+ }
+ }
+
ao2_unlink(peers, peer);
}
@@ -6212,6 +6219,7 @@
{
struct iax2_peer *peer = (struct iax2_peer *)data;
iax2_poke_peer(peer, 0);
+ peer_unref(peer);
}
static int iax2_poke_peer_s(const void *data)
@@ -7624,13 +7632,19 @@
peer->historicms = iaxs[fr->callno]->pingtime;
/* Remove scheduled iax2_poke_noanswer */
- if (peer->pokeexpire > -1)
- ast_sched_del(sched, peer->pokeexpire);
+ if (peer->pokeexpire > -1) {
+ if (!ast_sched_del(sched, peer->pokeexpire)) {
+ peer_unref(peer);
+ peer->pokeexpire = -1;
+ }
+ }
/* Schedule the next cycle */
if ((peer->lastms < 0) || (peer->historicms > peer->maxms))
- peer->pokeexpire = iax2_sched_add(sched, peer->pokefreqnotok, iax2_poke_peer_s, peer);
+ peer->pokeexpire = iax2_sched_add(sched, peer->pokefreqnotok, iax2_poke_peer_s, peer_ref(peer));
else
- peer->pokeexpire = iax2_sched_add(sched, peer->pokefreqok, iax2_poke_peer_s, peer);
+ peer->pokeexpire = iax2_sched_add(sched, peer->pokefreqok, iax2_poke_peer_s, peer_ref(peer));
+ if (peer->pokeexpire == -1)
+ peer_unref(peer);
/* and finally send the ack */
send_command_immediate(iaxs[fr->callno], AST_FRAME_IAX, IAX_COMMAND_ACK, fr->ts, NULL, 0,fr->iseqno);
/* And wrap up the qualify call */
@@ -8505,7 +8519,9 @@
peer->callno = 0;
peer->lastms = -1;
/* Try again quickly */
- peer->pokeexpire = iax2_sched_add(sched, peer->pokefreqnotok, iax2_poke_peer_s, peer);
+ peer->pokeexpire = iax2_sched_add(sched, peer->pokefreqnotok, iax2_poke_peer_s, peer_ref(peer));
+ if (peer->pokeexpire == -1)
+ peer_unref(peer);
}
static int iax2_poke_noanswer(const void *data)
@@ -8516,6 +8532,7 @@
if (schedule_action(__iax2_poke_noanswer, data))
#endif
__iax2_poke_noanswer(data);
+ peer_unref(peer);
return 0;
}
@@ -8560,15 +8577,22 @@
iaxs[peer->callno]->peerpoke = peer;
/* Remove any pending pokeexpire task */
- if (peer->pokeexpire > -1)
- ast_sched_del(sched, peer->pokeexpire);
+ if (peer->pokeexpire > -1) {
+ if (!ast_sched_del(sched, peer->pokeexpire)) {
+ peer->pokeexpire = -1;
+ peer_unref(peer);
+ }
+ }
/* Queue up a new task to handle no reply */
/* If the host is already unreachable then use the unreachable interval instead */
if (peer->lastms < 0) {
- peer->pokeexpire = iax2_sched_add(sched, peer->pokefreqnotok, iax2_poke_noanswer, peer);
+ peer->pokeexpire = iax2_sched_add(sched, peer->pokefreqnotok, iax2_poke_noanswer, peer_ref(peer));
} else
- peer->pokeexpire = iax2_sched_add(sched, DEFAULT_MAXMS * 2, iax2_poke_noanswer, peer);
+ peer->pokeexpire = iax2_sched_add(sched, DEFAULT_MAXMS * 2, iax2_poke_noanswer, peer_ref(peer));
+
+ if (peer->pokeexpire == -1)
+ peer_unref(peer);
/* And send the poke */
send_command(iaxs[peer->callno], AST_FRAME_IAX, IAX_COMMAND_POKE, 0, NULL, 0, -1);
@@ -8922,9 +8946,6 @@
struct iax2_peer *peer = obj;
ast_free_ha(peer->ha);
-
- if (peer->pokeexpire > -1)
- ast_sched_del(sched, peer->pokeexpire);
if (peer->callno > 0) {
ast_mutex_lock(&iaxsl[peer->callno]);
More information about the asterisk-commits
mailing list