[svn-commits] dvossel: branch 1.8 r282891 - in /branches/1.8: ./ channels/chan_sip.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Aug 19 15:34:45 CDT 2010


Author: dvossel
Date: Thu Aug 19 15:34:41 2010
New Revision: 282891

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=282891
Log:
Merged revisions 282890 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.6.2

........
  r282890 | dvossel | 2010-08-19 15:31:22 -0500 (Thu, 19 Aug 2010) | 5 lines
  
  fixes sip peer memory leaks in the peer_by_ip table
  
  (issue #17798)
........

Modified:
    branches/1.8/   (props changed)
    branches/1.8/channels/chan_sip.c

Propchange: branches/1.8/
------------------------------------------------------------------------------
Binary property 'branch-1.6.2-merged' - no diff available.

Modified: branches/1.8/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/channels/chan_sip.c?view=diff&rev=282891&r1=282890&r2=282891
==============================================================================
--- branches/1.8/channels/chan_sip.c (original)
+++ branches/1.8/channels/chan_sip.c Thu Aug 19 15:34:41 2010
@@ -2621,6 +2621,32 @@
 	return NULL;
 }
 
+/* this func is used with ao2_callback to unlink/delete all marked
+   peers */
+static int peer_is_marked(void *peerobj, void *arg, int flags)
+{
+	struct sip_peer *peer = peerobj;
+	return peer->the_mark ? CMP_MATCH : 0;
+}
+
+
+/* \brief Unlink all marked peers from ao2 containers */
+static void unlink_marked_peers_from_tables(void)
+{
+	ao2_t_callback(peers, OBJ_NODATA | OBJ_UNLINK | OBJ_MULTIPLE, peer_is_marked, NULL,
+						"initiating callback to remove marked peers");
+	ao2_t_callback(peers_by_ip, OBJ_NODATA | OBJ_UNLINK | OBJ_MULTIPLE, peer_is_marked, NULL,
+						"initiating callback to remove marked peers");
+}
+
+/* \brief Unlink single peer from all ao2 containers */
+static void unlink_peer_from_tables(struct sip_peer *peer)
+{
+	ao2_t_unlink(peers, peer, "ao2_unlink of peer from peers table");
+	if (!ast_sockaddr_isnull(&peer->addr)) {
+		ao2_t_unlink(peers_by_ip, peer, "ao2_unlink of peer from peers_by_ip table");
+	}
+}
 
 /*!
  * helper functions to unreference various types of objects.
@@ -12681,10 +12707,7 @@
 
 	if (peer->selfdestruct ||
 	    ast_test_flag(&peer->flags[1], SIP_PAGE2_RTAUTOCLEAR)) {
-		ao2_t_unlink(peers, peer, "ao2_unlink of peer from peers table");
-		if (!ast_sockaddr_isnull(&peer->addr)) {
-			ao2_t_unlink(peers_by_ip, peer, "ao2_unlink of peer from peers_by_ip table");
-		}
+		unlink_peer_from_tables(peer);
 	}
 
 	/* Only clear the addr after we check for destruction.  The addr must remain
@@ -15833,14 +15856,6 @@
 	return 0;
 }
 
-/* this func is used with ao2_callback to unlink/delete all marked
-   peers */
-static int peer_is_marked(void *peerobj, void *arg, int flags)
-{
-	struct sip_peer *peer = peerobj;
-	return peer->the_mark ? CMP_MATCH : 0;
-}
-
 /*! \brief Remove temporary realtime objects from memory (CLI) */
 /*! \todo XXXX Propably needs an overhaul after removal of the devices */
 static char *sip_prune_realtime(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
@@ -15943,8 +15958,7 @@
 			}
 			ao2_iterator_destroy(&i);
 			if (pruned) {
-				ao2_t_callback(peers, OBJ_NODATA | OBJ_UNLINK | OBJ_MULTIPLE, peer_is_marked, NULL,
-						"initiating callback to remove marked peers");
+				unlink_marked_peers_from_tables();
 				ast_cli(a->fd, "%d peers pruned.\n", pruned);
 			} else
 				ast_cli(a->fd, "No peers found to prune.\n");
@@ -27722,9 +27736,8 @@
 
 	start_poke = time(0);
 	/* Prune peers who still are supposed to be deleted */
-	ao2_t_callback(peers, OBJ_NODATA | OBJ_UNLINK | OBJ_MULTIPLE, peer_is_marked, NULL,
-			"callback to remove marked peers");
-	
+	unlink_marked_peers_from_tables();
+
 	ast_debug(4, "--------------- Done destroying pruned peers\n");
 
 	/* Send qualify (OPTIONS) to all peers */




More information about the svn-commits mailing list