diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 1856c9af2ae09492cc62d833081de7bf253974bb..07576269b1f56ddbe0d40e889dfe0bf46ea3e488 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -2249,9 +2249,8 @@ static void sip_destroy_peer(struct sip_peer *peer) if (peer->call) sip_destroy(peer->call); - if (peer->mwipvt) { /* We have an active subscription, delete it */ + if (peer->mwipvt) /* We have an active subscription, delete it */ sip_destroy(peer->mwipvt); - } if (peer->chanvars) { ast_variables_destroy(peer->chanvars); @@ -16257,12 +16256,23 @@ static int sip_get_codec(struct ast_channel *chan) return p->peercapability; } -/*! \brief Send a poke to all known peers */ +/*! \brief Send a poke to all known peers + Space them out 100 ms apart + XXX We might have a cool algorithm for this or use random - any suggestions? +*/ static void sip_poke_all_peers(void) { + int ms = 0; + + if (!speerobjs) /* No peers, just give up */ + return; + ASTOBJ_CONTAINER_TRAVERSE(&peerl, 1, do { ASTOBJ_WRLOCK(iterator); - sip_poke_peer(iterator); + if (iterator->pokeexpire > -1) + ast_sched_del(sched, iterator->pokeexpire); + ms += 100; + iterator->pokeexpire = ast_sched_add(sched, ms, sip_poke_peer_s, iterator); ASTOBJ_UNLOCK(iterator); } while (0) );