summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Jordan <mjordan@digium.com>2015-06-26 11:25:58 -0500
committerGerrit Code Review <gerrit2@gerrit.digium.api>2015-06-26 11:25:58 -0500
commit771b9bb4423cb07746b2d5339ac27f2d2e209438 (patch)
tree04722e80a2a41a8812a0c9e8e782cd231c733638
parent8a9628dce57bcfc8759a02b101aed46d5dbbda20 (diff)
parent9ec8a0f3ccdb0e308ed480aff3ad1e1c9a82f674 (diff)
Merge "sorcery: Add ast_sorcery_object_unregister() API call."
-rw-r--r--include/asterisk/sorcery.h11
-rw-r--r--main/sorcery.c19
2 files changed, 30 insertions, 0 deletions
diff --git a/include/asterisk/sorcery.h b/include/asterisk/sorcery.h
index d2dc701d8..0bd22a634 100644
--- a/include/asterisk/sorcery.h
+++ b/include/asterisk/sorcery.h
@@ -617,6 +617,17 @@ int ast_sorcery_get_wizard_mapping(struct ast_sorcery *sorcery,
const char *type, int index, struct ast_sorcery_wizard **wizard, void **data);
/*!
+ * \brief Unregister an object type
+ *
+ * \param sorcery Pointer to a sorcery structure
+ * \param type Type of object
+ *
+ * \retval 0 success
+ * \retval -1 failure
+ */
+int ast_sorcery_object_unregister(struct ast_sorcery *sorcery, const char *type);
+
+/*!
* \brief Register an object type
*
* \param sorcery Pointer to a sorcery structure
diff --git a/main/sorcery.c b/main/sorcery.c
index f84855eff..1ff83de66 100644
--- a/main/sorcery.c
+++ b/main/sorcery.c
@@ -1106,6 +1106,25 @@ static int sorcery_extended_fields_handler(const void *obj, struct ast_variable
return 0;
}
+int ast_sorcery_object_unregister(struct ast_sorcery *sorcery, const char *type)
+{
+ struct ast_sorcery_object_type *object_type;
+ int res = -1;
+
+ ao2_wrlock(sorcery->types);
+ object_type = ao2_find(sorcery->types, type, OBJ_SEARCH_KEY | OBJ_NOLOCK);
+ if (object_type && object_type->type.type == ACO_ITEM) {
+ ao2_unlink_flags(sorcery->types, object_type, OBJ_NOLOCK);
+ res = 0;
+ }
+ ao2_unlock(sorcery->types);
+
+ /* XXX may need to add an instance unregister observer callback on success. */
+
+ ao2_cleanup(object_type);
+ return res;
+}
+
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);