From 5b395a7b97775f62083675f13537179150befd3f Mon Sep 17 00:00:00 2001 From: Corey Farrell Date: Fri, 29 Dec 2017 23:59:00 -0500 Subject: core: Use macros to generate ao2_container callbacks where possible. This uses AO2_STRING_FIELD_HASH_FN and AO2_STRING_FIELD_CMP_FN where possible in the Asterisk core. This removes CMP_STOP from the result of CMP_FN callbacks for the following structure types: * ast_bucket_metadata * ast_bucket_scheme * generic_monitor_instance_list (ccss.c) * named_acl Change-Id: Ide4c1449a894bce70dea1fef664dade9b57578f1 --- main/sorcery.c | 199 ++++----------------------------------------------------- 1 file changed, 14 insertions(+), 185 deletions(-) (limited to 'main/sorcery.c') diff --git a/main/sorcery.c b/main/sorcery.c index cb0aff538..c20854f88 100644 --- a/main/sorcery.c +++ b/main/sorcery.c @@ -336,101 +336,14 @@ static sorcery_field_handler sorcery_field_default_handler(enum aco_option_type } /*! \brief Hashing function for sorcery wizards */ -static int sorcery_wizard_hash(const void *obj, const int flags) -{ - const struct ast_sorcery_internal_wizard *object; - const char *key; - - switch (flags & OBJ_SEARCH_MASK) { - case OBJ_SEARCH_KEY: - key = obj; - break; - case OBJ_SEARCH_OBJECT: - object = obj; - key = object->callbacks.name; - break; - default: - ast_assert(0); - return 0; - } - return ast_str_hash(key); -} +AO2_STRING_FIELD_HASH_FN(ast_sorcery_internal_wizard, callbacks.name) /*! \brief Comparator function for sorcery wizards */ -static int sorcery_wizard_cmp(void *obj, void *arg, int flags) -{ - const struct ast_sorcery_internal_wizard *object_left = obj; - const struct ast_sorcery_internal_wizard *object_right = arg; - const char *right_key = arg; - int cmp; - - switch (flags & OBJ_SEARCH_MASK) { - case OBJ_SEARCH_OBJECT: - right_key = object_right->callbacks.name; - /* Fall through */ - case OBJ_SEARCH_KEY: - cmp = strcmp(object_left->callbacks.name, right_key); - break; - case OBJ_SEARCH_PARTIAL_KEY: - cmp = strncmp(object_left->callbacks.name, right_key, strlen(right_key)); - break; - default: - cmp = 0; - break; - } - if (cmp) { - return 0; - } - return CMP_MATCH; -} +AO2_STRING_FIELD_CMP_FN(ast_sorcery_internal_wizard, callbacks.name) /*! \brief Hashing function for sorcery wizards */ -static int object_type_field_hash(const void *obj, const int flags) -{ - const struct ast_sorcery_object_field *object_field; - const char *key; - - switch (flags & OBJ_SEARCH_MASK) { - case OBJ_SEARCH_KEY: - key = obj; - break; - case OBJ_SEARCH_OBJECT: - object_field = obj; - key = object_field->name; - break; - default: - ast_assert(0); - return 0; - } - return ast_str_hash(key); -} - -static int object_type_field_cmp(void *obj, void *arg, int flags) -{ - const struct ast_sorcery_object_field *field_left = obj; - const struct ast_sorcery_object_field *field_right = arg; - const char *right_key = arg; - int cmp; - - switch (flags & OBJ_SEARCH_MASK) { - case OBJ_SEARCH_OBJECT: - right_key = field_right->name; - /* Fall through */ - case OBJ_SEARCH_KEY: - cmp = strcmp(field_left->name, right_key); - break; - case OBJ_SEARCH_PARTIAL_KEY: - cmp = strncmp(field_left->name, right_key, strlen(right_key)); - break; - default: - cmp = 0; - break; - } - if (cmp) { - return 0; - } - return CMP_MATCH; -} +AO2_STRING_FIELD_HASH_FN(ast_sorcery_object_field, name) +AO2_STRING_FIELD_CMP_FN(ast_sorcery_object_field, name) /*! \brief Cleanup function for graceful shutdowns */ static void sorcery_cleanup(void) @@ -446,53 +359,10 @@ static void sorcery_cleanup(void) } /*! \brief Compare function for sorcery instances */ -static int sorcery_instance_cmp(void *obj, void *arg, int flags) -{ - const struct ast_sorcery *object_left = obj; - const struct ast_sorcery *object_right = arg; - const char *right_key = arg; - int cmp; - - switch (flags & OBJ_SEARCH_MASK) { - case OBJ_SEARCH_OBJECT: - right_key = object_right->module_name; - /* Fall through */ - case OBJ_SEARCH_KEY: - cmp = strcmp(object_left->module_name, right_key); - break; - case OBJ_SEARCH_PARTIAL_KEY: - cmp = strncmp(object_left->module_name, right_key, strlen(right_key)); - break; - default: - cmp = 0; - break; - } - if (cmp) { - return 0; - } - return CMP_MATCH; -} +AO2_STRING_FIELD_CMP_FN(ast_sorcery, module_name) /*! \brief Hashing function for sorcery instances */ -static int sorcery_instance_hash(const void *obj, const int flags) -{ - const struct ast_sorcery *object; - const char *key; - - switch (flags & OBJ_SEARCH_MASK) { - case OBJ_SEARCH_KEY: - key = obj; - break; - case OBJ_SEARCH_OBJECT: - object = obj; - key = object->module_name; - break; - default: - ast_assert(0); - return 0; - } - return ast_str_hash(key); -} +AO2_STRING_FIELD_HASH_FN(ast_sorcery, module_name) int ast_sorcery_init(void) { @@ -511,7 +381,7 @@ int ast_sorcery_init(void) } wizards = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, WIZARD_BUCKETS, - sorcery_wizard_hash, NULL, sorcery_wizard_cmp); + ast_sorcery_internal_wizard_hash_fn, NULL, ast_sorcery_internal_wizard_cmp_fn); if (!wizards) { sorcery_cleanup(); return -1; @@ -524,7 +394,7 @@ int ast_sorcery_init(void) } instances = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_RWLOCK, 0, INSTANCE_BUCKETS, - sorcery_instance_hash, NULL, sorcery_instance_cmp); + ast_sorcery_hash_fn, NULL, ast_sorcery_cmp_fn); if (!instances) { sorcery_cleanup(); return -1; @@ -724,53 +594,10 @@ static void sorcery_destructor(void *obj) } /*! \brief Hashing function for sorcery types */ -static int sorcery_type_hash(const void *obj, const int flags) -{ - const struct ast_sorcery_object_type *object; - const char *key; - - switch (flags & OBJ_SEARCH_MASK) { - case OBJ_SEARCH_KEY: - key = obj; - break; - case OBJ_SEARCH_OBJECT: - object = obj; - key = object->name; - break; - default: - ast_assert(0); - return 0; - } - return ast_str_hash(key); -} +AO2_STRING_FIELD_HASH_FN(ast_sorcery_object_type, name) /*! \brief Comparator function for sorcery types */ -static int sorcery_type_cmp(void *obj, void *arg, int flags) -{ - const struct ast_sorcery_object_type *object_left = obj; - const struct ast_sorcery_object_type *object_right = arg; - const char *right_key = arg; - int cmp; - - switch (flags & OBJ_SEARCH_MASK) { - case OBJ_SEARCH_OBJECT: - right_key = object_right->name; - /* Fall through */ - case OBJ_SEARCH_KEY: - cmp = strcmp(object_left->name, right_key); - break; - case OBJ_SEARCH_PARTIAL_KEY: - cmp = strncmp(object_left->name, right_key, strlen(right_key)); - break; - default: - cmp = 0; - break; - } - if (cmp) { - return 0; - } - return CMP_MATCH; -} +AO2_STRING_FIELD_CMP_FN(ast_sorcery_object_type, name) struct ast_sorcery *__ast_sorcery_open(const char *module_name) { @@ -787,7 +614,9 @@ struct ast_sorcery *__ast_sorcery_open(const char *module_name) goto done; } - if (!(sorcery->types = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_RWLOCK, TYPE_BUCKETS, sorcery_type_hash, sorcery_type_cmp))) { + sorcery->types = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_RWLOCK, TYPE_BUCKETS, + ast_sorcery_object_type_hash_fn, ast_sorcery_object_type_cmp_fn); + if (!sorcery->types) { ao2_ref(sorcery, -1); sorcery = NULL; goto done; @@ -863,7 +692,7 @@ static struct ast_sorcery_object_type *sorcery_object_type_alloc(const char *typ } object_type->fields = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_NOLOCK, 0, - OBJECT_FIELD_BUCKETS, object_type_field_hash, NULL, object_type_field_cmp); + OBJECT_FIELD_BUCKETS, ast_sorcery_object_field_hash_fn, NULL, ast_sorcery_object_field_cmp_fn); if (!object_type->fields) { ao2_ref(object_type, -1); return NULL; -- cgit v1.2.3