[asterisk-commits] russell: branch russell/iax2_poke_fix r87643 - /team/russell/iax2_poke_fix/ch...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Oct 30 14:08:26 CDT 2007
Author: russell
Date: Tue Oct 30 14:08:25 2007
New Revision: 87643
URL: http://svn.digium.com/view/asterisk?view=rev&rev=87643
Log:
* Make the peer's reference count reflect that there are pending scheduler
callbacks for the expire_registry() function that have a pointer to the peer.
* Since the reference count is now increased in this case, remove pending calls
to expire_registry() when the peer gets unlinked instead of in the peer
destructor.
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=87643&r1=87642&r2=87643
==============================================================================
--- team/russell/iax2_poke_fix/channels/chan_iax2.c (original)
+++ team/russell/iax2_poke_fix/channels/chan_iax2.c Tue Oct 30 14:08:25 2007
@@ -2145,7 +2145,7 @@
} else if ((peer = find_peer(argv[3], 0))) {
if(ast_test_flag(peer, IAX_RTCACHEFRIENDS)) {
ast_set_flag(peer, IAX_RTAUTOCLEAR);
- expire_registry(peer);
+ expire_registry(peer_ref(peer));
ast_cli(fd, "OK peer %s was removed from the cache.\n", argv[3]);
} else {
ast_cli(fd, "SORRY peer %s is not eligible for this operation.\n", argv[3]);
@@ -2739,9 +2739,13 @@
if (ast_test_flag((&globalflags), IAX_RTCACHEFRIENDS)) {
ast_copy_flags(peer, &globalflags, IAX_RTAUTOCLEAR|IAX_RTCACHEFRIENDS);
if (ast_test_flag(peer, IAX_RTAUTOCLEAR)) {
- if (peer->expire > -1)
- ast_sched_del(sched, peer->expire);
- peer->expire = iax2_sched_add(sched, (global_rtautoclear) * 1000, expire_registry, peer);
+ if (peer->expire > -1) {
+ if (!ast_sched_del(sched, peer->expire))
+ peer_unref(peer);
+ }
+ peer->expire = iax2_sched_add(sched, (global_rtautoclear) * 1000, expire_registry, peer_ref(peer));
+ if (peer->expire == -1)
+ peer_unref(peer);
}
ao2_link(peers, peer_ref(peer));
if (ast_test_flag(peer, IAX_DYNAMIC))
@@ -5771,6 +5775,18 @@
}
static void prune_peers(void);
+static void unlink_peer(struct iax2_peer *peer)
+{
+ if (peer->expire > -1) {
+ if (!ast_sched_del(sched, peer->expire)) {
+ peer->expire = -1;
+ peer_unref(peer);
+ }
+ }
+
+ ao2_unlink(peers, peer);
+}
+
static void __expire_registry(const void *data)
{
struct iax2_peer *peer = (struct iax2_peer *) data;
@@ -5796,7 +5812,9 @@
iax2_regfunk(peer->name, 0);
if (ast_test_flag(peer, IAX_RTAUTOCLEAR))
- ao2_unlink(peers, peer);
+ unlink_peer(peer);
+
+ peer_unref(peer);
}
static int expire_registry(const void *data)
@@ -5834,10 +5852,14 @@
p->addr.sin_family = AF_INET;
p->addr.sin_addr = in;
p->addr.sin_port = htons(atoi(c));
- if (p->expire > -1)
- ast_sched_del(sched, p->expire);
+ if (p->expire > -1) {
+ if (!ast_sched_del(sched, p->expire))
+ peer_unref(p);
+ }
ast_device_state_changed("IAX2/%s", p->name); /* Activate notification */
- p->expire = iax2_sched_add(sched, (p->expiry + 10) * 1000, expire_registry, p);
+ p->expire = iax2_sched_add(sched, (p->expiry + 10) * 1000, expire_registry, peer_ref(p));
+ if (p->expire == -1)
+ peer_unref(p);
if (iax2_regfunk)
iax2_regfunk(p->name, 1);
register_peer_exten(p, 1);
@@ -5926,8 +5948,10 @@
/* Store socket fd */
p->sockfd = fd;
/* Setup the expiry */
- if (p->expire > -1)
- ast_sched_del(sched, p->expire);
+ if (p->expire > -1) {
+ if (!ast_sched_del(sched, p->expire))
+ peer_unref(p);
+ }
/* treat an unspecified refresh interval as the minimum */
if (!refresh)
refresh = min_reg_expire;
@@ -5942,8 +5966,11 @@
} else {
p->expiry = refresh;
}
- if (p->expiry && sin->sin_addr.s_addr)
- p->expire = iax2_sched_add(sched, (p->expiry + 10) * 1000, expire_registry, p);
+ if (p->expiry && sin->sin_addr.s_addr) {
+ p->expire = iax2_sched_add(sched, (p->expiry + 10) * 1000, expire_registry, peer_ref(p));
+ if (p->expire == -1)
+ peer_unref(p);
+ }
iax_ie_append_str(&ied, IAX_IE_USERNAME, p->name);
iax_ie_append_int(&ied, IAX_IE_DATETIME, iax2_datetime(p->zonetag));
if (sin->sin_addr.s_addr) {
@@ -8896,11 +8923,9 @@
ast_free_ha(peer->ha);
- /* Delete it, it needs to disappear */
- if (peer->expire > -1)
- ast_sched_del(sched, peer->expire);
if (peer->pokeexpire > -1)
ast_sched_del(sched, peer->pokeexpire);
+
if (peer->callno > 0) {
ast_mutex_lock(&iaxsl[peer->callno]);
iax2_destroy(peer->callno);
@@ -8939,7 +8964,7 @@
oldha = peer->ha;
peer->ha = NULL;
}
- ao2_unlink(peers, peer);
+ unlink_peer(peer);
} else if ((peer = ao2_alloc(sizeof(*peer), peer_destructor))) {
peer->expire = -1;
peer->pokeexpire = -1;
@@ -9439,7 +9464,7 @@
i = ao2_iterator_init(peers, 0);
while ((peer = ao2_iterator_next(&i))) {
if (ast_test_flag(peer, IAX_DELME))
- ao2_unlink(peers, peer);
+ unlink_peer(peer);
peer_unref(peer);
}
}
More information about the asterisk-commits
mailing list