summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
authorMartin Tomec <tomec.martin@gmail.com>2016-12-30 13:59:00 +0100
committerMartin Tomec <tomec.martin@gmail.com>2016-12-31 08:43:50 +0100
commitaad29b9bcac936d511c3b8905fd458bfa6e6dde3 (patch)
treeb55d2db02e0175004c39d9d932256aa49a74926f /res
parent059a54202c43ed19c802efb153f0da4962e5b75c (diff)
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
Diffstat (limited to 'res')
-rw-r--r--res/res_calendar.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/res/res_calendar.c b/res/res_calendar.c
index 46775507c..92b73c1ed 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);