mirror of
https://github.com/asterisk/asterisk.git
synced 2025-11-17 07:18: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) * named_acl Change-Id: Ide4c1449a894bce70dea1fef664dade9b57578f1
This commit is contained in:
@@ -560,33 +560,10 @@ struct ast_json *ast_bucket_json(const struct ast_bucket *bucket)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Hashing function for file metadata */
|
/*! \brief Hashing function for file metadata */
|
||||||
static int bucket_file_metadata_hash(const void *obj, const int flags)
|
AO2_STRING_FIELD_HASH_FN(ast_bucket_metadata, name)
|
||||||
{
|
|
||||||
const struct ast_bucket_metadata *object;
|
|
||||||
const char *key;
|
|
||||||
|
|
||||||
switch (flags & (OBJ_POINTER | OBJ_KEY | OBJ_PARTIAL_KEY)) {
|
|
||||||
case OBJ_KEY:
|
|
||||||
key = obj;
|
|
||||||
return ast_str_hash(key);
|
|
||||||
case OBJ_POINTER:
|
|
||||||
object = obj;
|
|
||||||
return ast_str_hash(object->name);
|
|
||||||
default:
|
|
||||||
/* Hash can only work on something with a full key */
|
|
||||||
ast_assert(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! \brief Comparison function for file metadata */
|
/*! \brief Comparison function for file metadata */
|
||||||
static int bucket_file_metadata_cmp(void *obj, void *arg, int flags)
|
AO2_STRING_FIELD_CMP_FN(ast_bucket_metadata, name)
|
||||||
{
|
|
||||||
struct ast_bucket_metadata *metadata1 = obj, *metadata2 = arg;
|
|
||||||
const char *name = arg;
|
|
||||||
|
|
||||||
return !strcmp(metadata1->name, flags & OBJ_KEY ? name : metadata2->name) ? CMP_MATCH | CMP_STOP : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! \brief Destructor for bucket files */
|
/*! \brief Destructor for bucket files */
|
||||||
static void bucket_file_destroy(void *obj)
|
static void bucket_file_destroy(void *obj)
|
||||||
@@ -616,7 +593,7 @@ static void *bucket_file_alloc(const char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
file->metadata = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_NOLOCK, METADATA_BUCKETS,
|
file->metadata = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_NOLOCK, METADATA_BUCKETS,
|
||||||
bucket_file_metadata_hash, bucket_file_metadata_cmp);
|
ast_bucket_metadata_hash_fn, ast_bucket_metadata_cmp_fn);
|
||||||
if (!file->metadata) {
|
if (!file->metadata) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -851,33 +828,10 @@ void ast_bucket_file_temporary_destroy(struct ast_bucket_file *file)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Hashing function for scheme container */
|
/*! \brief Hashing function for scheme container */
|
||||||
static int bucket_scheme_hash(const void *obj, const int flags)
|
AO2_STRING_FIELD_HASH_FN(ast_bucket_scheme, name)
|
||||||
{
|
|
||||||
const struct ast_bucket_scheme *object;
|
|
||||||
const char *key;
|
|
||||||
|
|
||||||
switch (flags & (OBJ_POINTER | OBJ_KEY | OBJ_PARTIAL_KEY)) {
|
|
||||||
case OBJ_KEY:
|
|
||||||
key = obj;
|
|
||||||
return ast_str_hash(key);
|
|
||||||
case OBJ_POINTER:
|
|
||||||
object = obj;
|
|
||||||
return ast_str_hash(object->name);
|
|
||||||
default:
|
|
||||||
/* Hash can only work on something with a full key */
|
|
||||||
ast_assert(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! \brief Comparison function for scheme container */
|
/*! \brief Comparison function for scheme container */
|
||||||
static int bucket_scheme_cmp(void *obj, void *arg, int flags)
|
AO2_STRING_FIELD_CMP_FN(ast_bucket_scheme, name)
|
||||||
{
|
|
||||||
struct ast_bucket_scheme *scheme1 = obj, *scheme2 = arg;
|
|
||||||
const char *name = arg;
|
|
||||||
|
|
||||||
return !strcmp(scheme1->name, flags & OBJ_KEY ? name : scheme2->name) ? CMP_MATCH | CMP_STOP : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! \brief Cleanup function for graceful shutdowns */
|
/*! \brief Cleanup function for graceful shutdowns */
|
||||||
static void bucket_cleanup(void)
|
static void bucket_cleanup(void)
|
||||||
@@ -910,8 +864,8 @@ int ast_bucket_init(void)
|
|||||||
{
|
{
|
||||||
ast_register_cleanup(&bucket_cleanup);
|
ast_register_cleanup(&bucket_cleanup);
|
||||||
|
|
||||||
schemes = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_RWLOCK, SCHEME_BUCKETS, bucket_scheme_hash,
|
schemes = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_RWLOCK, SCHEME_BUCKETS,
|
||||||
bucket_scheme_cmp);
|
ast_bucket_scheme_hash_fn, ast_bucket_scheme_cmp_fn);
|
||||||
if (!schemes) {
|
if (!schemes) {
|
||||||
ast_log(LOG_ERROR, "Failed to create container for Bucket schemes\n");
|
ast_log(LOG_ERROR, "Failed to create container for Bucket schemes\n");
|
||||||
return -1;
|
return -1;
|
||||||
|
|||||||
17
main/ccss.c
17
main/ccss.c
@@ -1386,19 +1386,8 @@ struct generic_monitor_pvt {
|
|||||||
int core_id;
|
int core_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int generic_monitor_hash_fn(const void *obj, const int flags)
|
AO2_STRING_FIELD_HASH_FN(generic_monitor_instance_list, device_name)
|
||||||
{
|
AO2_STRING_FIELD_CMP_FN(generic_monitor_instance_list, device_name)
|
||||||
const struct generic_monitor_instance_list *generic_list = obj;
|
|
||||||
return ast_str_hash(generic_list->device_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int generic_monitor_cmp_fn(void *obj, void *arg, int flags)
|
|
||||||
{
|
|
||||||
const struct generic_monitor_instance_list *generic_list1 = obj;
|
|
||||||
const struct generic_monitor_instance_list *generic_list2 = arg;
|
|
||||||
|
|
||||||
return !strcmp(generic_list1->device_name, generic_list2->device_name) ? CMP_MATCH | CMP_STOP : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct generic_monitor_instance_list *find_generic_monitor_instance_list(const char * const device_name)
|
static struct generic_monitor_instance_list *find_generic_monitor_instance_list(const char * const device_name)
|
||||||
{
|
{
|
||||||
@@ -4671,7 +4660,7 @@ int ast_cc_init(void)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (!(generic_monitors = ao2_t_container_alloc(CC_CORE_INSTANCES_BUCKETS,
|
if (!(generic_monitors = ao2_t_container_alloc(CC_CORE_INSTANCES_BUCKETS,
|
||||||
generic_monitor_hash_fn, generic_monitor_cmp_fn,
|
generic_monitor_instance_list_hash_fn, generic_monitor_instance_list_cmp_fn,
|
||||||
"Create generic monitor container"))) {
|
"Create generic monitor container"))) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
188
main/cel.c
188
main/cel.c
@@ -331,129 +331,16 @@ struct cel_backend {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/*! \brief Hashing function for cel_backend */
|
/*! \brief Hashing function for cel_backend */
|
||||||
static int cel_backend_hash(const void *obj, int flags)
|
AO2_STRING_FIELD_HASH_FN(cel_backend, name)
|
||||||
{
|
|
||||||
const struct cel_backend *backend;
|
|
||||||
const char *name;
|
|
||||||
|
|
||||||
switch (flags & OBJ_SEARCH_MASK) {
|
|
||||||
case OBJ_SEARCH_OBJECT:
|
|
||||||
backend = obj;
|
|
||||||
name = backend->name;
|
|
||||||
break;
|
|
||||||
case OBJ_SEARCH_KEY:
|
|
||||||
name = obj;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* Hash can only work on something with a full key. */
|
|
||||||
ast_assert(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ast_str_hash(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! \brief Comparator function for cel_backend */
|
/*! \brief Comparator function for cel_backend */
|
||||||
static int cel_backend_cmp(void *obj, void *arg, int flags)
|
AO2_STRING_FIELD_CMP_FN(cel_backend, name)
|
||||||
{
|
|
||||||
const struct cel_backend *object_left = obj;
|
|
||||||
const struct cel_backend *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:
|
|
||||||
/*
|
|
||||||
* We could also use a partial key struct containing a length
|
|
||||||
* so strlen() does not get called for every comparison instead.
|
|
||||||
*/
|
|
||||||
cmp = strncmp(object_left->name, right_key, strlen(right_key));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/*
|
|
||||||
* What arg points to is specific to this traversal callback
|
|
||||||
* and has no special meaning to astobj2.
|
|
||||||
*/
|
|
||||||
cmp = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (cmp) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* At this point the traversal callback is identical to a sorted
|
|
||||||
* container.
|
|
||||||
*/
|
|
||||||
return CMP_MATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! \brief Hashing function for dialstatus container */
|
/*! \brief Hashing function for dialstatus container */
|
||||||
static int dialstatus_hash(const void *obj, int flags)
|
AO2_STRING_FIELD_HASH_FN(cel_dialstatus, uniqueid)
|
||||||
{
|
|
||||||
const struct cel_dialstatus *dialstatus;
|
|
||||||
const char *key;
|
|
||||||
|
|
||||||
switch (flags & OBJ_SEARCH_MASK) {
|
|
||||||
case OBJ_SEARCH_KEY:
|
|
||||||
key = obj;
|
|
||||||
break;
|
|
||||||
case OBJ_SEARCH_OBJECT:
|
|
||||||
dialstatus = obj;
|
|
||||||
key = dialstatus->uniqueid;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* Hash can only work on something with a full key. */
|
|
||||||
ast_assert(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return ast_str_hash(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! \brief Comparator function for dialstatus container */
|
/*! \brief Comparator function for dialstatus container */
|
||||||
static int dialstatus_cmp(void *obj, void *arg, int flags)
|
AO2_STRING_FIELD_CMP_FN(cel_dialstatus, uniqueid)
|
||||||
{
|
|
||||||
struct cel_dialstatus *object_left = obj;
|
|
||||||
struct cel_dialstatus *object_right = arg;
|
|
||||||
const char *right_key = arg;
|
|
||||||
int cmp;
|
|
||||||
|
|
||||||
switch (flags & OBJ_SEARCH_MASK) {
|
|
||||||
case OBJ_SEARCH_OBJECT:
|
|
||||||
right_key = object_right->uniqueid;
|
|
||||||
/* Fall through */
|
|
||||||
case OBJ_SEARCH_KEY:
|
|
||||||
cmp = strcmp(object_left->uniqueid, right_key);
|
|
||||||
break;
|
|
||||||
case OBJ_SEARCH_PARTIAL_KEY:
|
|
||||||
/*
|
|
||||||
* We could also use a partial key struct containing a length
|
|
||||||
* so strlen() does not get called for every comparison instead.
|
|
||||||
*/
|
|
||||||
cmp = strncmp(object_left->uniqueid, right_key, strlen(right_key));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/*
|
|
||||||
* What arg points to is specific to this traversal callback
|
|
||||||
* and has no special meaning to astobj2.
|
|
||||||
*/
|
|
||||||
cmp = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (cmp) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* At this point the traversal callback is identical to a sorted
|
|
||||||
* container.
|
|
||||||
*/
|
|
||||||
return CMP_MATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int ast_cel_check_enabled(void)
|
unsigned int ast_cel_check_enabled(void)
|
||||||
{
|
{
|
||||||
@@ -1667,71 +1554,14 @@ static int create_routes(void)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int lid_hash(const void *obj, const int flags)
|
AO2_STRING_FIELD_HASH_FN(cel_linkedid, id)
|
||||||
{
|
AO2_STRING_FIELD_CMP_FN(cel_linkedid, id)
|
||||||
const struct cel_linkedid *lid;
|
|
||||||
const char *key;
|
|
||||||
|
|
||||||
switch (flags & OBJ_SEARCH_MASK) {
|
|
||||||
case OBJ_SEARCH_KEY:
|
|
||||||
key = obj;
|
|
||||||
break;
|
|
||||||
case OBJ_SEARCH_OBJECT:
|
|
||||||
lid = obj;
|
|
||||||
key = lid->id;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* Hash can only work on something with a full key. */
|
|
||||||
ast_assert(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return ast_str_hash(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int lid_cmp(void *obj, void *arg, int flags)
|
|
||||||
{
|
|
||||||
const struct cel_linkedid *object_left = obj;
|
|
||||||
const struct cel_linkedid *object_right = arg;
|
|
||||||
const char *right_key = arg;
|
|
||||||
int cmp;
|
|
||||||
|
|
||||||
switch (flags & OBJ_SEARCH_MASK) {
|
|
||||||
case OBJ_SEARCH_OBJECT:
|
|
||||||
right_key = object_right->id;
|
|
||||||
/* Fall through */
|
|
||||||
case OBJ_SEARCH_KEY:
|
|
||||||
cmp = strcmp(object_left->id, right_key);
|
|
||||||
break;
|
|
||||||
case OBJ_SEARCH_PARTIAL_KEY:
|
|
||||||
/*
|
|
||||||
* We could also use a partial key struct containing a length
|
|
||||||
* so strlen() does not get called for every comparison instead.
|
|
||||||
*/
|
|
||||||
cmp = strncmp(object_left->id, right_key, strlen(right_key));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/*
|
|
||||||
* What arg points to is specific to this traversal callback
|
|
||||||
* and has no special meaning to astobj2.
|
|
||||||
*/
|
|
||||||
cmp = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (cmp) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* At this point the traversal callback is identical to a sorted
|
|
||||||
* container.
|
|
||||||
*/
|
|
||||||
return CMP_MATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
int ast_cel_engine_init(void)
|
int ast_cel_engine_init(void)
|
||||||
{
|
{
|
||||||
struct ao2_container *container;
|
struct ao2_container *container;
|
||||||
|
|
||||||
container = ao2_container_alloc(NUM_APP_BUCKETS, lid_hash, lid_cmp);
|
container = ao2_container_alloc(NUM_APP_BUCKETS, cel_linkedid_hash_fn, cel_linkedid_cmp_fn);
|
||||||
ao2_global_obj_replace_unref(cel_linkedids, container);
|
ao2_global_obj_replace_unref(cel_linkedids, container);
|
||||||
ao2_cleanup(container);
|
ao2_cleanup(container);
|
||||||
if (!container) {
|
if (!container) {
|
||||||
@@ -1740,7 +1570,7 @@ int ast_cel_engine_init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
container = ao2_container_alloc(NUM_DIALSTATUS_BUCKETS,
|
container = ao2_container_alloc(NUM_DIALSTATUS_BUCKETS,
|
||||||
dialstatus_hash, dialstatus_cmp);
|
cel_dialstatus_hash_fn, cel_dialstatus_cmp_fn);
|
||||||
ao2_global_obj_replace_unref(cel_dialstatus_store, container);
|
ao2_global_obj_replace_unref(cel_dialstatus_store, container);
|
||||||
ao2_cleanup(container);
|
ao2_cleanup(container);
|
||||||
if (!container) {
|
if (!container) {
|
||||||
@@ -1758,7 +1588,7 @@ int ast_cel_engine_init(void)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
container = ao2_container_alloc(BACKEND_BUCKETS, cel_backend_hash, cel_backend_cmp);
|
container = ao2_container_alloc(BACKEND_BUCKETS, cel_backend_hash_fn, cel_backend_cmp_fn);
|
||||||
ao2_global_obj_replace_unref(cel_backends, container);
|
ao2_global_obj_replace_unref(cel_backends, container);
|
||||||
ao2_cleanup(container);
|
ao2_cleanup(container);
|
||||||
if (!container) {
|
if (!container) {
|
||||||
|
|||||||
22
main/codec.c
22
main/codec.c
@@ -75,24 +75,7 @@ struct internal_ast_codec {
|
|||||||
int __ast_codec_register_with_format(struct ast_codec *codec, const char *format_name,
|
int __ast_codec_register_with_format(struct ast_codec *codec, const char *format_name,
|
||||||
struct ast_module *mod);
|
struct ast_module *mod);
|
||||||
|
|
||||||
static int codec_hash(const void *obj, int flags)
|
AO2_STRING_FIELD_HASH_FN(ast_codec, name)
|
||||||
{
|
|
||||||
const struct ast_codec *codec;
|
|
||||||
const char *key;
|
|
||||||
|
|
||||||
switch (flags & OBJ_SEARCH_MASK) {
|
|
||||||
case OBJ_SEARCH_KEY:
|
|
||||||
key = obj;
|
|
||||||
return ast_str_hash(key);
|
|
||||||
case OBJ_SEARCH_OBJECT:
|
|
||||||
codec = obj;
|
|
||||||
return ast_str_hash(codec->name);
|
|
||||||
default:
|
|
||||||
/* Hash can only work on something with a full key. */
|
|
||||||
ast_assert(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int codec_cmp(void *obj, void *arg, int flags)
|
static int codec_cmp(void *obj, void *arg, int flags)
|
||||||
{
|
{
|
||||||
@@ -267,7 +250,8 @@ static void codec_shutdown(void)
|
|||||||
|
|
||||||
int ast_codec_init(void)
|
int ast_codec_init(void)
|
||||||
{
|
{
|
||||||
codecs = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_RWLOCK, CODEC_BUCKETS, codec_hash, codec_cmp);
|
codecs = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_RWLOCK, CODEC_BUCKETS,
|
||||||
|
ast_codec_hash_fn, codec_cmp);
|
||||||
if (!codecs) {
|
if (!codecs) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,53 +78,8 @@ struct ast_endpoint {
|
|||||||
struct stasis_forward *tech_forward;
|
struct stasis_forward *tech_forward;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int endpoint_hash(const void *obj, int flags)
|
AO2_STRING_FIELD_HASH_FN(ast_endpoint, id)
|
||||||
{
|
AO2_STRING_FIELD_CMP_FN(ast_endpoint, id)
|
||||||
const struct ast_endpoint *endpoint;
|
|
||||||
const char *key;
|
|
||||||
|
|
||||||
switch (flags & OBJ_SEARCH_MASK) {
|
|
||||||
case OBJ_SEARCH_KEY:
|
|
||||||
key = obj;
|
|
||||||
return ast_str_hash(key);
|
|
||||||
case OBJ_SEARCH_OBJECT:
|
|
||||||
endpoint = obj;
|
|
||||||
return ast_str_hash(endpoint->id);
|
|
||||||
default:
|
|
||||||
/* Hash can only work on something with a full key. */
|
|
||||||
ast_assert(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int endpoint_cmp(void *obj, void *arg, int flags)
|
|
||||||
{
|
|
||||||
const struct ast_endpoint *left = obj;
|
|
||||||
const struct ast_endpoint *right = arg;
|
|
||||||
const char *right_key = arg;
|
|
||||||
int cmp;
|
|
||||||
|
|
||||||
switch (flags & OBJ_SEARCH_MASK) {
|
|
||||||
case OBJ_SEARCH_OBJECT:
|
|
||||||
right_key = right->id;
|
|
||||||
/* Fall through */
|
|
||||||
case OBJ_SEARCH_KEY:
|
|
||||||
cmp = strcmp(left->id, right_key);
|
|
||||||
break;
|
|
||||||
case OBJ_SEARCH_PARTIAL_KEY:
|
|
||||||
cmp = strncmp(left->id, right_key, strlen(right_key));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ast_assert(0);
|
|
||||||
cmp = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (cmp) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return CMP_MATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ast_endpoint *ast_endpoint_find_by_id(const char *id)
|
struct ast_endpoint *ast_endpoint_find_by_id(const char *id)
|
||||||
{
|
{
|
||||||
@@ -524,14 +479,14 @@ int ast_endpoint_init(void)
|
|||||||
{
|
{
|
||||||
ast_register_cleanup(endpoint_cleanup);
|
ast_register_cleanup(endpoint_cleanup);
|
||||||
|
|
||||||
endpoints = ao2_container_alloc(ENDPOINT_BUCKETS, endpoint_hash,
|
endpoints = ao2_container_alloc(ENDPOINT_BUCKETS, ast_endpoint_hash_fn,
|
||||||
endpoint_cmp);
|
ast_endpoint_cmp_fn);
|
||||||
if (!endpoints) {
|
if (!endpoints) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
tech_endpoints = ao2_container_alloc(TECH_ENDPOINT_BUCKETS, endpoint_hash,
|
tech_endpoints = ao2_container_alloc(TECH_ENDPOINT_BUCKETS, ast_endpoint_hash_fn,
|
||||||
endpoint_cmp);
|
ast_endpoint_cmp_fn);
|
||||||
if (!tech_endpoints) {
|
if (!tech_endpoints) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,53 +64,8 @@ struct format_interface {
|
|||||||
/*! \brief Container for registered format interfaces */
|
/*! \brief Container for registered format interfaces */
|
||||||
static struct ao2_container *interfaces;
|
static struct ao2_container *interfaces;
|
||||||
|
|
||||||
static int format_interface_hash(const void *obj, int flags)
|
AO2_STRING_FIELD_HASH_FN(format_interface, codec)
|
||||||
{
|
AO2_STRING_FIELD_CMP_FN(format_interface, codec)
|
||||||
const struct format_interface *format_interface;
|
|
||||||
const char *key;
|
|
||||||
|
|
||||||
switch (flags & OBJ_SEARCH_MASK) {
|
|
||||||
case OBJ_SEARCH_KEY:
|
|
||||||
key = obj;
|
|
||||||
return ast_str_hash(key);
|
|
||||||
case OBJ_SEARCH_OBJECT:
|
|
||||||
format_interface = obj;
|
|
||||||
return ast_str_hash(format_interface->codec);
|
|
||||||
default:
|
|
||||||
/* Hash can only work on something with a full key. */
|
|
||||||
ast_assert(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int format_interface_cmp(void *obj, void *arg, int flags)
|
|
||||||
{
|
|
||||||
const struct format_interface *left = obj;
|
|
||||||
const struct format_interface *right = arg;
|
|
||||||
const char *right_key = arg;
|
|
||||||
int cmp;
|
|
||||||
|
|
||||||
switch (flags & OBJ_SEARCH_MASK) {
|
|
||||||
case OBJ_SEARCH_OBJECT:
|
|
||||||
cmp = strcmp(left->codec, right->codec);
|
|
||||||
break;
|
|
||||||
case OBJ_SEARCH_KEY:
|
|
||||||
cmp = strcmp(left->codec, right_key);
|
|
||||||
break;
|
|
||||||
case OBJ_SEARCH_PARTIAL_KEY:
|
|
||||||
cmp = strncmp(left->codec, right_key, strlen(right_key));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ast_assert(0);
|
|
||||||
cmp = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (cmp) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return CMP_MATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! \brief Function called when the process is shutting down */
|
/*! \brief Function called when the process is shutting down */
|
||||||
static void format_shutdown(void)
|
static void format_shutdown(void)
|
||||||
@@ -121,8 +76,8 @@ static void format_shutdown(void)
|
|||||||
|
|
||||||
int ast_format_init(void)
|
int ast_format_init(void)
|
||||||
{
|
{
|
||||||
interfaces = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_RWLOCK, FORMAT_INTERFACE_BUCKETS, format_interface_hash,
|
interfaces = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_RWLOCK, FORMAT_INTERFACE_BUCKETS,
|
||||||
format_interface_cmp);
|
format_interface_hash_fn, format_interface_cmp_fn);
|
||||||
if (!interfaces) {
|
if (!interfaces) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,19 +107,8 @@ struct named_acl {
|
|||||||
char name[ACL_NAME_LENGTH]; /* Same max length as a configuration category */
|
char name[ACL_NAME_LENGTH]; /* Same max length as a configuration category */
|
||||||
};
|
};
|
||||||
|
|
||||||
static int named_acl_hash_fn(const void *obj, const int flags)
|
AO2_STRING_FIELD_HASH_FN(named_acl, name)
|
||||||
{
|
AO2_STRING_FIELD_CMP_FN(named_acl, name)
|
||||||
const struct named_acl *entry = obj;
|
|
||||||
return ast_str_hash(entry->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int named_acl_cmp_fn(void *obj, void *arg, const int flags)
|
|
||||||
{
|
|
||||||
struct named_acl *entry1 = obj;
|
|
||||||
struct named_acl *entry2 = arg;
|
|
||||||
|
|
||||||
return (!strcmp(entry1->name, entry2->name)) ? (CMP_MATCH | CMP_STOP) : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! \brief destructor for named_acl_config */
|
/*! \brief destructor for named_acl_config */
|
||||||
static void named_acl_config_destructor(void *obj)
|
static void named_acl_config_destructor(void *obj)
|
||||||
|
|||||||
@@ -39,46 +39,8 @@ struct ast_named_lock {
|
|||||||
char key[0];
|
char key[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
static int named_locks_hash(const void *obj, const int flags)
|
AO2_STRING_FIELD_HASH_FN(ast_named_lock, key)
|
||||||
{
|
AO2_STRING_FIELD_CMP_FN(ast_named_lock, key)
|
||||||
const struct ast_named_lock *lock = obj;
|
|
||||||
|
|
||||||
switch (flags & OBJ_SEARCH_MASK) {
|
|
||||||
case OBJ_SEARCH_KEY:
|
|
||||||
return ast_str_hash(obj);
|
|
||||||
case OBJ_SEARCH_OBJECT:
|
|
||||||
return ast_str_hash(lock->key);
|
|
||||||
default:
|
|
||||||
/* Hash can only work on something with a full key. */
|
|
||||||
ast_assert(0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int named_locks_cmp(void *obj_left, void *obj_right, int flags)
|
|
||||||
{
|
|
||||||
const struct ast_named_lock *object_left = obj_left;
|
|
||||||
const struct ast_named_lock *object_right = obj_right;
|
|
||||||
const char *right_key = obj_right;
|
|
||||||
int cmp;
|
|
||||||
|
|
||||||
switch (flags & OBJ_SEARCH_MASK) {
|
|
||||||
case OBJ_SEARCH_OBJECT:
|
|
||||||
right_key = object_right->key;
|
|
||||||
/* Fall through */
|
|
||||||
case OBJ_SEARCH_KEY:
|
|
||||||
cmp = strcmp(object_left->key, right_key);
|
|
||||||
break;
|
|
||||||
case OBJ_SEARCH_PARTIAL_KEY:
|
|
||||||
cmp = strncmp(object_left->key, right_key, strlen(right_key));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
cmp = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return cmp ? 0 : CMP_MATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void named_locks_shutdown(void)
|
static void named_locks_shutdown(void)
|
||||||
{
|
{
|
||||||
@@ -88,7 +50,7 @@ static void named_locks_shutdown(void)
|
|||||||
int ast_named_locks_init(void)
|
int ast_named_locks_init(void)
|
||||||
{
|
{
|
||||||
named_locks = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,
|
named_locks = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0,
|
||||||
NAMED_LOCKS_BUCKETS, named_locks_hash, NULL, named_locks_cmp);
|
NAMED_LOCKS_BUCKETS, ast_named_lock_hash_fn, NULL, ast_named_lock_cmp_fn);
|
||||||
if (!named_locks) {
|
if (!named_locks) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|||||||
199
main/sorcery.c
199
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 */
|
/*! \brief Hashing function for sorcery wizards */
|
||||||
static int sorcery_wizard_hash(const void *obj, const int flags)
|
AO2_STRING_FIELD_HASH_FN(ast_sorcery_internal_wizard, callbacks.name)
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! \brief Comparator function for sorcery wizards */
|
/*! \brief Comparator function for sorcery wizards */
|
||||||
static int sorcery_wizard_cmp(void *obj, void *arg, int flags)
|
AO2_STRING_FIELD_CMP_FN(ast_sorcery_internal_wizard, callbacks.name)
|
||||||
{
|
|
||||||
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 */
|
/*! \brief Hashing function for sorcery wizards */
|
||||||
static int object_type_field_hash(const void *obj, const int flags)
|
AO2_STRING_FIELD_HASH_FN(ast_sorcery_object_field, name)
|
||||||
{
|
AO2_STRING_FIELD_CMP_FN(ast_sorcery_object_field, name)
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! \brief Cleanup function for graceful shutdowns */
|
/*! \brief Cleanup function for graceful shutdowns */
|
||||||
static void sorcery_cleanup(void)
|
static void sorcery_cleanup(void)
|
||||||
@@ -446,53 +359,10 @@ static void sorcery_cleanup(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Compare function for sorcery instances */
|
/*! \brief Compare function for sorcery instances */
|
||||||
static int sorcery_instance_cmp(void *obj, void *arg, int flags)
|
AO2_STRING_FIELD_CMP_FN(ast_sorcery, module_name)
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*! \brief Hashing function for sorcery instances */
|
/*! \brief Hashing function for sorcery instances */
|
||||||
static int sorcery_instance_hash(const void *obj, const int flags)
|
AO2_STRING_FIELD_HASH_FN(ast_sorcery, module_name)
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
int ast_sorcery_init(void)
|
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,
|
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) {
|
if (!wizards) {
|
||||||
sorcery_cleanup();
|
sorcery_cleanup();
|
||||||
return -1;
|
return -1;
|
||||||
@@ -524,7 +394,7 @@ int ast_sorcery_init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
instances = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_RWLOCK, 0, INSTANCE_BUCKETS,
|
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) {
|
if (!instances) {
|
||||||
sorcery_cleanup();
|
sorcery_cleanup();
|
||||||
return -1;
|
return -1;
|
||||||
@@ -724,53 +594,10 @@ static void sorcery_destructor(void *obj)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Hashing function for sorcery types */
|
/*! \brief Hashing function for sorcery types */
|
||||||
static int sorcery_type_hash(const void *obj, const int flags)
|
AO2_STRING_FIELD_HASH_FN(ast_sorcery_object_type, name)
|
||||||
{
|
|
||||||
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 */
|
/*! \brief Comparator function for sorcery types */
|
||||||
static int sorcery_type_cmp(void *obj, void *arg, int flags)
|
AO2_STRING_FIELD_CMP_FN(ast_sorcery_object_type, name)
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ast_sorcery *__ast_sorcery_open(const char *module_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;
|
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);
|
ao2_ref(sorcery, -1);
|
||||||
sorcery = NULL;
|
sorcery = NULL;
|
||||||
goto done;
|
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_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) {
|
if (!object_type->fields) {
|
||||||
ao2_ref(object_type, -1);
|
ao2_ref(object_type, -1);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
Reference in New Issue
Block a user