summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/asterisk/calendar.h2
-rw-r--r--main/loader.c4
-rw-r--r--res/res_calendar.c2
3 files changed, 7 insertions, 1 deletions
diff --git a/include/asterisk/calendar.h b/include/asterisk/calendar.h
index a02570bf3..da4af01ef 100644
--- a/include/asterisk/calendar.h
+++ b/include/asterisk/calendar.h
@@ -25,6 +25,7 @@
#include "asterisk/linkedlists.h"
#include "asterisk/lock.h"
#include "asterisk/dial.h"
+#include "asterisk/module.h"
/*! \file calendar.h
* \brief A general API for managing calendar events with Asterisk
@@ -69,6 +70,7 @@ struct ast_calendar_tech {
const char *type;
const char *description;
const char *module;
+ struct ast_module_user *user;
int (* is_busy)(struct ast_calendar *calendar); /*!< Override default busy determination */
void *(* load_calendar)(void *data); /*!< Create private structure, add calendar events, etc. */
void *(* unref_calendar)(void *obj); /*!< Function to be called to free the private structure */
diff --git a/main/loader.c b/main/loader.c
index f9b2de943..44046ae2a 100644
--- a/main/loader.c
+++ b/main/loader.c
@@ -239,7 +239,9 @@ void __ast_module_user_hangup_all(struct ast_module *mod)
AST_LIST_LOCK(&mod->users);
while ((u = AST_LIST_REMOVE_HEAD(&mod->users, entry))) {
- ast_softhangup(u->chan, AST_SOFTHANGUP_APPUNLOAD);
+ if (u->chan) {
+ ast_softhangup(u->chan, AST_SOFTHANGUP_APPUNLOAD);
+ }
ast_atomic_fetchadd_int(&mod->usecount, -1);
ast_free(u);
}
diff --git a/res/res_calendar.c b/res/res_calendar.c
index e5a0d929e..4bcb2639b 100644
--- a/res/res_calendar.c
+++ b/res/res_calendar.c
@@ -532,6 +532,7 @@ int ast_calendar_register(struct ast_calendar_tech *tech)
}
}
AST_LIST_INSERT_HEAD(&techs, tech, list);
+ tech->user = ast_module_user_add(NULL);
AST_LIST_UNLOCK(&techs);
ast_verb(2, "Registered calendar type '%s' (%s)\n", tech->type, tech->description);
@@ -564,6 +565,7 @@ void ast_calendar_unregister(struct ast_calendar_tech *tech)
ao2_callback(calendars, OBJ_UNLINK | OBJ_NODATA | OBJ_MULTIPLE, match_caltech_cb, tech);
AST_LIST_REMOVE_CURRENT(list);
+ ast_module_user_remove(iter->user);
ast_verb(2, "Unregistered calendar type '%s'\n", tech->type);
break;
}