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)
* ast_bucket_file (media_cache.c)
* named_acl

Change-Id: Ide4c1449a894bce70dea1fef664dade9b57578f1
This commit is contained in:
Corey Farrell
2017-12-29 23:59:00 -05:00
parent 80e6b2eff5
commit bc73337e07
10 changed files with 54 additions and 668 deletions

View File

@@ -343,102 +343,12 @@ static sorcery_field_handler sorcery_field_default_handler(enum aco_option_type
return NULL;
}
/*! \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;
/*! \brief Hashing and comparison functions for sorcery wizards */
AO2_STRING_FIELD_HASH_FN(ast_sorcery_internal_wizard, callbacks.name)
AO2_STRING_FIELD_CMP_FN(ast_sorcery_internal_wizard, callbacks.name)
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);
}
/*! \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;
}
/*! \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)
@@ -454,53 +364,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 sorcery_proxy *object_left = obj;
const struct sorcery_proxy *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(sorcery_proxy, module_name)
/*! \brief Hashing function for sorcery instances */
static int sorcery_instance_hash(const void *obj, const int flags)
{
const struct sorcery_proxy *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(sorcery_proxy, module_name)
int ast_sorcery_init(void)
{
@@ -519,7 +386,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;
@@ -532,7 +399,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);
sorcery_proxy_hash_fn, NULL, sorcery_proxy_cmp_fn);
if (!instances) {
sorcery_cleanup();
return -1;
@@ -711,53 +578,8 @@ 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);
}
/*! \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_HASH_FN(ast_sorcery_object_type, name)
AO2_STRING_FIELD_CMP_FN(ast_sorcery_object_type, name)
static void sorcery_proxy_cb(void *weakproxy, void *data)
{
@@ -802,7 +624,9 @@ struct ast_sorcery *__ast_sorcery_open(const char *module_name, const char *file
goto failure_cleanup;
}
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) {
goto failure_cleanup;
}
@@ -878,7 +702,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;