From aad29b9bcac936d511c3b8905fd458bfa6e6dde3 Mon Sep 17 00:00:00 2001
From: Martin Tomec <tomec.martin@gmail.com>
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);
-- 
GitLab