mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-02 19:16:15 +00:00
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:
206
main/sorcery.c
206
main/sorcery.c
@@ -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;
|
||||
|
Reference in New Issue
Block a user