aboutsummaryrefslogtreecommitdiffstats
path: root/res/res_calendar.c
diff options
context:
space:
mode:
authortwilson <twilson@f38db490-d61c-443f-a65b-d21fe96a405b>2009-10-08 23:11:23 +0000
committertwilson <twilson@f38db490-d61c-443f-a65b-d21fe96a405b>2009-10-08 23:11:23 +0000
commita596e54d5bdbae3d130ab883fea07c02c5d52fdb (patch)
treea266eae42a3e68bdb0e012a81b5311264ddc92f8 /res/res_calendar.c
parentce4286ad28d6ba0a525ffd1581706cd34e631b96 (diff)
Remove global variable that makes dlopen unhappy
This isn't the best way to do this, but it is the easiest. There are some limitations that are going to need to be addressed at some point with reloads and when I (or someone else) work on that, then the API can be updated to handle passing the private config data that the calendar tech modules need in a better way as well. git-svn-id: http://svn.digium.com/svn/asterisk/trunk@223016 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res/res_calendar.c')
-rw-r--r--res/res_calendar.c40
1 files changed, 32 insertions, 8 deletions
diff --git a/res/res_calendar.c b/res/res_calendar.c
index e916ac0f0..6ec7b424c 100644
--- a/res/res_calendar.c
+++ b/res/res_calendar.c
@@ -190,7 +190,25 @@ struct evententry {
static AST_LIST_HEAD_STATIC(techs, ast_calendar_tech);
AST_LIST_HEAD_NOLOCK(eventlist, evententry); /* define the type */
-struct ast_config *ast_calendar_config;
+static struct ast_config *calendar_config;
+AST_RWLOCK_DEFINE_STATIC(config_lock);
+
+const struct ast_config *ast_calendar_config_acquire(void)
+{
+ ast_rwlock_rdlock(&config_lock);
+
+ if (!calendar_config) {
+ ast_rwlock_unlock(&config_lock);
+ return NULL;
+ }
+
+ return calendar_config;
+}
+
+void ast_calendar_config_release(void)
+{
+ ast_rwlock_unlock(&config_lock);
+}
static struct ast_calendar *unref_calendar(struct ast_calendar *cal)
{
@@ -390,29 +408,33 @@ static int load_tech_calendars(struct ast_calendar_tech *tech)
const char *cat = NULL;
const char *val;
- if (!ast_calendar_config) {
+ if (!calendar_config) {
ast_log(LOG_WARNING, "Calendar support disabled, not loading %s calendar module\n", tech->type);
return -1;
}
- while ((cat = ast_category_browse(ast_calendar_config, cat))) {
+ ast_rwlock_wrlock(&config_lock);
+ while ((cat = ast_category_browse(calendar_config, cat))) {
if (!strcasecmp(cat, "general")) {
continue;
}
- if (!(val = ast_variable_retrieve(ast_calendar_config, cat, "type")) || strcasecmp(val, tech->type)) {
+ if (!(val = ast_variable_retrieve(calendar_config, cat, "type")) || strcasecmp(val, tech->type)) {
continue;
}
/* A serious error occurred loading calendars from this tech and it should be disabled */
- if (!(cal = build_calendar(ast_calendar_config, cat, tech))) {
+ if (!(cal = build_calendar(calendar_config, cat, tech))) {
ast_calendar_unregister(tech);
+ ast_rwlock_unlock(&config_lock);
return -1;
}
cal = unref_calendar(cal);
}
+ ast_rwlock_unlock(&config_lock);
+
return 0;
}
@@ -862,11 +884,13 @@ static int load_config(void *data)
return 0;
}
- if (ast_calendar_config) {
- ast_config_destroy(ast_calendar_config);
+ ast_rwlock_wrlock(&config_lock);
+ if (calendar_config) {
+ ast_config_destroy(calendar_config);
}
- ast_calendar_config = tmpcfg;
+ calendar_config = tmpcfg;
+ ast_rwlock_unlock(&config_lock);
return 0;
}