diff options
author | Joshua Colp <jcolp@digium.com> | 2017-09-19 06:46:46 -0500 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2017-09-19 06:46:46 -0500 |
commit | 864e76374c0220dc857998a396b22846e169e1a8 (patch) | |
tree | 37d3b8522461f5acaa2a767f169fe72f6309bb4a | |
parent | 05bb57c56fccc2b742efb6cb0ae2cacb7c13f5e8 (diff) | |
parent | edd5b3038742d6e57c59e0102b89b981e6ec1c2a (diff) |
Merge "res_calendar: On reload, update all configuration" into 14
-rw-r--r-- | include/asterisk/calendar.h | 2 | ||||
-rw-r--r-- | res/res_calendar.c | 82 | ||||
-rw-r--r-- | res/res_calendar_caldav.c | 1 |
3 files changed, 29 insertions, 56 deletions
diff --git a/include/asterisk/calendar.h b/include/asterisk/calendar.h index da4af01ef..57140bae2 100644 --- a/include/asterisk/calendar.h +++ b/include/asterisk/calendar.h @@ -133,7 +133,7 @@ struct ast_calendar { pthread_t thread; /*!< The thread that the calendar is loaded/updated in */ ast_cond_t unload; int unloading:1; - int pending_deletion:1; + int pending_deletion:1; /*!< No longer used */ struct ao2_container *events; /*!< The events that are known at this time */ }; diff --git a/res/res_calendar.c b/res/res_calendar.c index 5213d055d..089fb9849 100644 --- a/res/res_calendar.c +++ b/res/res_calendar.c @@ -341,10 +341,7 @@ static void calendar_destructor(void *obj) } ast_calendar_clear_events(cal); ast_string_field_free_memory(cal); - if (cal->vars) { - ast_variables_destroy(cal->vars); - cal->vars = NULL; - } + ast_variables_destroy(cal->vars); ao2_ref(cal->events, -1); ao2_unlock(cal); } @@ -406,28 +403,22 @@ static struct ast_calendar *build_calendar(struct ast_config *cfg, const char *c { struct ast_calendar *cal; struct ast_variable *v, *last = NULL; - int new_calendar = 0; - if (!(cal = find_calendar(cat))) { - new_calendar = 1; - if (!(cal = ao2_alloc(sizeof(*cal), calendar_destructor))) { - ast_log(LOG_ERROR, "Could not allocate calendar structure. Stopping.\n"); - return NULL; - } + if (!(cal = ao2_alloc(sizeof(*cal), calendar_destructor))) { + ast_log(LOG_ERROR, "Could not allocate calendar structure. Stopping.\n"); + return NULL; + } - if (!(cal->events = ao2_container_alloc(CALENDAR_BUCKETS, event_hash_fn, event_cmp_fn))) { - ast_log(LOG_ERROR, "Could not allocate events container for %s\n", cat); - cal = unref_calendar(cal); - return NULL; - } + if (!(cal->events = ao2_container_alloc(CALENDAR_BUCKETS, event_hash_fn, event_cmp_fn))) { + ast_log(LOG_ERROR, "Could not allocate events container for %s\n", cat); + cal = unref_calendar(cal); + return NULL; + } - if (ast_string_field_init(cal, 32)) { - ast_log(LOG_ERROR, "Couldn't create string fields for %s\n", cat); - cal = unref_calendar(cal); - return NULL; - } - } else { - cal->pending_deletion = 0; + if (ast_string_field_init(cal, 32)) { + ast_log(LOG_ERROR, "Couldn't create string fields for %s\n", cat); + cal = unref_calendar(cal); + return NULL; } ast_string_field_set(cal, name, cat); @@ -489,17 +480,15 @@ static struct ast_calendar *build_calendar(struct ast_config *cfg, const char *c cal->name); } - if (new_calendar) { - cal->thread = AST_PTHREADT_NULL; - ast_cond_init(&cal->unload, NULL); - ao2_link(calendars, cal); - if (ast_pthread_create(&cal->thread, NULL, cal->tech->load_calendar, cal)) { - /* If we start failing to create threads, go ahead and return NULL - * and the tech module will be unregistered - */ - ao2_unlink(calendars, cal); - cal = unref_calendar(cal); - } + cal->thread = AST_PTHREADT_NULL; + ast_cond_init(&cal->unload, NULL); + ao2_link(calendars, cal); + if (ast_pthread_create(&cal->thread, NULL, cal->tech->load_calendar, cal)) { + /* If we start failing to create threads, go ahead and return NULL + * and the tech module will be unregistered + */ + ao2_unlink(calendars, cal); + cal = unref_calendar(cal); } return cal; @@ -1770,30 +1759,16 @@ static struct ast_custom_function calendar_event_function = { .read = calendar_event_read, }; -static int cb_pending_deletion(void *user_data, void *arg, int flags) -{ - struct ast_calendar *cal = user_data; - - cal->pending_deletion = 1; - - return CMP_MATCH; -} - -static int cb_rm_pending_deletion(void *user_data, void *arg, int flags) -{ - struct ast_calendar *cal = user_data; - - return cal->pending_deletion ? CMP_MATCH : 0; -} - static int reload(void) { struct ast_calendar_tech *iter; ast_mutex_lock(&reloadlock); - /* Mark existing calendars for deletion */ - ao2_callback(calendars, OBJ_NODATA | OBJ_MULTIPLE, cb_pending_deletion, NULL); + /* Delete all of the calendars */ + ao2_callback(calendars, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, NULL, NULL); + + /* Load configuration */ load_config(1); AST_LIST_LOCK(&techs); @@ -1804,9 +1779,6 @@ static int reload(void) } AST_LIST_UNLOCK(&techs); - /* Delete calendars that no longer show up in the config */ - ao2_callback(calendars, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, cb_rm_pending_deletion, NULL); - ast_mutex_unlock(&reloadlock); return 0; diff --git a/res/res_calendar_caldav.c b/res/res_calendar_caldav.c index 1a4b52bff..9b7679419 100644 --- a/res/res_calendar_caldav.c +++ b/res/res_calendar_caldav.c @@ -80,6 +80,7 @@ static void caldav_destructor(void *obj) if (pvt->session) { ne_session_destroy(pvt->session); } + ne_uri_free(&pvt->uri); ast_string_field_free_memory(pvt); ao2_callback(pvt->events, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, NULL, NULL); |