mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-05 04:32:44 +00:00
sorcery: Add ast_sorcery_object_unregister() API call.
Find and unlink the specified sorcery object type to complement ast_sorcery_object_register(). Without this function you cannot completely unload individual modules that use sorcery for configuration. ASTERISK-24907 Reported by: Kevin Harwell Change-Id: I1c04634fe9a90921bf676725c7d6bb2aeaab1c88
This commit is contained in:
@@ -616,6 +616,17 @@ int ast_sorcery_get_wizard_mapping_count(struct ast_sorcery *sorcery,
|
|||||||
int ast_sorcery_get_wizard_mapping(struct ast_sorcery *sorcery,
|
int ast_sorcery_get_wizard_mapping(struct ast_sorcery *sorcery,
|
||||||
const char *type, int index, struct ast_sorcery_wizard **wizard, void **data);
|
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
|
* \brief Register an object type
|
||||||
*
|
*
|
||||||
|
@@ -1106,6 +1106,25 @@ static int sorcery_extended_fields_handler(const void *obj, struct ast_variable
|
|||||||
return 0;
|
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)
|
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);
|
RAII_VAR(struct ast_sorcery_object_type *, object_type, ao2_find(sorcery->types, type, OBJ_KEY), ao2_cleanup);
|
||||||
|
Reference in New Issue
Block a user