Index: channels/chan_sip.c =================================================================== --- channels/chan_sip.c (revision 284313) +++ channels/chan_sip.c (working copy) @@ -11060,6 +11060,12 @@ continue; }; if (ast_test_flag(&iterator->flags[1], SIP_PAGE2_RTCACHEFRIENDS)) { + + if (!AST_SCHED_DEL(sched, iterator->pokeexpire)) { + struct sip_peer *peer_ptr = iterator; + ASTOBJ_UNREF(peer_ptr, sip_destroy_peer); + } + ASTOBJ_MARK(iterator); pruned++; } @@ -11103,6 +11109,12 @@ ASTOBJ_CONTAINER_LINK(&peerl, peer); } else ast_cli(fd, "Peer '%s' pruned.\n", name); + + if (!AST_SCHED_DEL(sched, peer->pokeexpire)) { + struct sip_peer *peer_ptr = peer; + ASTOBJ_UNREF(peer_ptr, sip_destroy_peer); + } + ASTOBJ_UNREF(peer, sip_destroy_peer); } else ast_cli(fd, "Peer '%s' not found.\n", name); @@ -19513,6 +19525,21 @@ { reload_config(reason); + /* before peers are removed from the peer container, cancel any scheduled pokes */ + ASTOBJ_CONTAINER_TRAVERSE(&peerl, 1, do { + ASTOBJ_RDLOCK(iterator); + if (ast_test_flag(&iterator->flags[0], SIP_REALTIME)) { + if (!AST_SCHED_DEL(sched, iterator->pokeexpire)) { + struct sip_peer *peer_ptr = iterator; + ASTOBJ_UNREF(peer_ptr, sip_destroy_peer); + } + + } + ast_log(LOG_WARNING, "jpeeler: peer %s\n", iterator->name); + + ASTOBJ_UNLOCK(iterator); + } while (0) ); + /* Prune peers who still are supposed to be deleted */ ASTOBJ_CONTAINER_PRUNE_MARKED(&peerl, sip_destroy_peer); if (option_debug > 3)