diff options
author | Matt Jordan <mjordan@digium.com> | 2015-11-03 10:58:47 -0600 |
---|---|---|
committer | Matt Jordan <mjordan@digium.com> | 2015-11-03 12:20:57 -0500 |
commit | 715f770c9ff011284c1e87f9b5bcde1fc02ab4df (patch) | |
tree | 14545c32a5771d1b21bf79156def0b8ed8808aa0 /res/res_pjsip/pjsip_configuration.c | |
parent | 0071a993f0561664d074d461759fc3259bd9c926 (diff) |
pjsip_configuration: On delete, remove the persistent version of an endpoint
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
Diffstat (limited to 'res/res_pjsip/pjsip_configuration.c')
-rw-r--r-- | res/res_pjsip/pjsip_configuration.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/res/res_pjsip/pjsip_configuration.c b/res/res_pjsip/pjsip_configuration.c index 5d9097023..7e0c4b087 100644 --- a/res/res_pjsip/pjsip_configuration.c +++ b/res/res_pjsip/pjsip_configuration.c @@ -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); |