]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
pjsip_configuration: On delete, remove the persistent version of an endpoint 56/1556/2
authorMatt Jordan <mjordan@digium.com>
Tue, 3 Nov 2015 16:58:47 +0000 (10:58 -0600)
committerMatt Jordan <mjordan@digium.com>
Tue, 3 Nov 2015 17:20:57 +0000 (12:20 -0500)
When an endpoint is deleted (such as through an API), the persistent endpoint
currently continues to lurk around. While this isn't harmful from a memory
consumption perspective - as all persistent endpoints are reclaimed on
shutdown - it does cause Stasis endpoint related operations to continue
to believe that the endpoint may or may not exist.

This patch causes the persistent endpoint related to a PJSIP endpoint to be
destroyed if the PJSIP endpoint is deleted.

Change-Id: I85ac707b4d5e6aad882ac275b0c2e2154affa5bb

res/res_pjsip/pjsip_configuration.c

index 5d9097023982edd021bce1cbf6355e641d092498..7e0c4b087b3c94cf84c904b47910740b403ec7c1 100644 (file)
@@ -253,6 +253,17 @@ static const struct ast_sorcery_observer state_contact_status_observer = {
        .updated = persistent_endpoint_contact_status_observer,
 };
 
+static void endpoint_deleted_observer(const void *object)
+{
+       const struct ast_sip_endpoint *endpoint = object;
+
+       ao2_find(persistent_endpoints, ast_endpoint_get_resource(endpoint->persistent), OBJ_SEARCH_KEY | OBJ_UNLINK | OBJ_NODATA);
+}
+
+static const struct ast_sorcery_observer endpoint_observers = {
+       .deleted = endpoint_deleted_observer,
+};
+
 static int dtmf_handler(const struct aco_option *opt, struct ast_variable *var, void *obj)
 {
        struct ast_sip_endpoint *endpoint = obj;
@@ -1954,6 +1965,7 @@ int ast_res_pjsip_initialize_configuration(const struct ast_module_info *ast_mod
                return -1;
        }
 
+       ast_sorcery_observer_add(sip_sorcery, "endpoint", &endpoint_observers);
        ast_sorcery_observer_add(sip_sorcery, "contact", &state_contact_observer);
        ast_sorcery_observer_add(sip_sorcery, CONTACT_STATUS, &state_contact_status_observer);