From aad29b9bcac936d511c3b8905fd458bfa6e6dde3 Mon Sep 17 00:00:00 2001 From: Martin Tomec Date: Fri, 30 Dec 2016 13:59:00 +0100 Subject: [PATCH] res_calendar: delete old calendars after reload When "fetch_again_at_reload" is set in config, we create now new object and thread for each reloaded calendar (with new configuration). Old calendar should be then unlinked, so the old thread can exit and free memory. ASTERISK-26683 Change-Id: Ic17fba9371c5a8b26a6bc54ea4957c13a32a343e --- res/res_calendar.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/res/res_calendar.c b/res/res_calendar.c index 46775507cd..92b73c1edc 100644 --- a/res/res_calendar.c +++ b/res/res_calendar.c @@ -406,7 +406,12 @@ static struct ast_calendar *build_calendar(struct ast_config *cfg, const char *c struct ast_variable *v, *last = NULL; int new_calendar = 0; - if (!(cal = find_calendar(cat))) { + cal = find_calendar(cat); + if (cal && cal->fetch_again_at_reload) { + /** Create new calendar, old will be removed during reload */ + cal = unref_calendar(cal); + } + if (!cal) { new_calendar = 1; if (!(cal = ao2_alloc(sizeof(*cal), calendar_destructor))) { ast_log(LOG_ERROR, "Could not allocate calendar structure. Stopping.\n"); @@ -483,7 +488,7 @@ static struct ast_calendar *build_calendar(struct ast_config *cfg, const char *c } } - if (new_calendar || cal->fetch_again_at_reload) { + if (new_calendar) { cal->thread = AST_PTHREADT_NULL; ast_cond_init(&cal->unload, NULL); ao2_link(calendars, cal);