summaryrefslogtreecommitdiff
path: root/main/sorcery.c
diff options
context:
space:
mode:
authorKevin Harwell <kharwell@digium.com>2013-08-30 19:55:56 +0000
committerKevin Harwell <kharwell@digium.com>2013-08-30 19:55:56 +0000
commit9bad1dabcf52db0a75b3dfb7c0c27f613402a01b (patch)
tree8a4b5f2a47df2dbe6fcc8ac29f64ca67affeb9e0 /main/sorcery.c
parent16b8d0cb5a3b15eae8db19c99223170ebed79fef (diff)
Add a reloadable option for sorcery type objects
Some configuration objects currently won't place nice if reloaded. Specifically, in this case the pjsip transport objects. Now when registering an object in sorcery one may specify that the object is allowed to be reloaded or not. If the object is set to not reload then upon reloading of the configuration the objects of that type will not be reloaded. The initially loaded objects of that type however will remain. While the transport objects will not longer be reloaded it is still possible for a user to configure an endpoint to an invalid transport. A couple of log messages were added to help diagnose this problem if it occurs. (closes issue ASTERISK-22382) Reported by: Rusty Newton (closes issue ASTERISK-22384) Reported by: Rusty Newton Review: https://reviewboard.asterisk.org/r/2807/ ........ Merged revisions 398139 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@398140 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/sorcery.c')
-rw-r--r--main/sorcery.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/main/sorcery.c b/main/sorcery.c
index 1bd55d453..3f2346dfe 100644
--- a/main/sorcery.c
+++ b/main/sorcery.c
@@ -110,6 +110,9 @@ struct ast_sorcery_object_type {
/*! \brief Serializer for observers */
struct ast_taskprocessor *serializer;
+
+ /*! \brief Specifies if object type is reloadable or not */
+ unsigned int reloadable:1;
};
/*! \brief Structure for registered object type observer */
@@ -575,7 +578,7 @@ static int sorcery_extended_fields_handler(const void *obj, struct ast_variable
return 0;
}
-int __ast_sorcery_object_register(struct ast_sorcery *sorcery, const char *type, unsigned int hidden, aco_type_item_alloc alloc, sorcery_transform_handler transform, sorcery_apply_handler apply)
+int __ast_sorcery_object_register(struct ast_sorcery *sorcery, const char *type, unsigned int hidden, unsigned int reloadable, aco_type_item_alloc alloc, sorcery_transform_handler transform, sorcery_apply_handler apply)
{
RAII_VAR(struct ast_sorcery_object_type *, object_type, ao2_find(sorcery->types, type, OBJ_KEY), ao2_cleanup);
@@ -589,6 +592,7 @@ int __ast_sorcery_object_register(struct ast_sorcery *sorcery, const char *type,
object_type->type.item_alloc = alloc;
object_type->type.hidden = hidden;
+ object_type->reloadable = reloadable;
object_type->transform = transform;
object_type->apply = apply;
object_type->file->types[0] = &object_type->type;
@@ -695,12 +699,26 @@ int __ast_sorcery_object_field_register(struct ast_sorcery *sorcery, const char
return 0;
}
+/*! \brief Retrieves whether or not the type is reloadable */
+static int sorcery_reloadable(const struct ast_sorcery *sorcery, const char *type)
+{
+ RAII_VAR(struct ast_sorcery_object_type *, object_type,
+ ao2_find(sorcery->types, type, OBJ_KEY), ao2_cleanup);
+ return object_type && object_type->reloadable;
+}
+
static int sorcery_wizard_load(void *obj, void *arg, int flags)
{
struct ast_sorcery_object_wizard *wizard = obj;
struct sorcery_load_details *details = arg;
void (*load)(void *data, const struct ast_sorcery *sorcery, const char *type);
+ if (details->reload && !sorcery_reloadable(details->sorcery, details->type)) {
+ ast_log(LOG_NOTICE, "Type '%s' is not reloadable, "
+ "maintaining previous values\n", details->type);
+ return 0;
+ }
+
load = !details->reload ? wizard->wizard->load : wizard->wizard->reload;
if (load) {