]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_calendar: delete old calendars after reload 83/4683/2
authorMartin Tomec <tomec.martin@gmail.com>
Fri, 30 Dec 2016 12:59:00 +0000 (13:59 +0100)
committerMartin Tomec <tomec.martin@gmail.com>
Sat, 31 Dec 2016 07:43:50 +0000 (08:43 +0100)
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

index 46775507cd939c810804c0bb09478ae354e3ebfd..92b73c1edc8e7ca9b462b158967bef712b5945aa 100644 (file)
@@ -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);