From: Martin Tomec Date: Fri, 30 Dec 2016 12:59:00 +0000 (+0100) Subject: res_calendar: delete old calendars after reload X-Git-Tag: 15.0.0-beta1~422^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=refs%2Fchanges%2F83%2F4683%2F2;p=thirdparty%2Fasterisk.git 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 --- 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);