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/bucket.c | 60 ++-------------- main/ccss.c | 19 ++--- main/cel.c | 188 +++----------------------------------------------- main/codec.c | 22 +----- main/endpoints.c | 57 ++------------- main/format.c | 53 ++------------ main/named_acl.c | 15 +--- main/named_locks.c | 44 +----------- main/sorcery.c | 199 ++++------------------------------------------------- 9 files changed, 52 insertions(+), 605 deletions(-) diff --git a/main/bucket.c b/main/bucket.c index 7618761b9..084d25368 100644 --- a/main/bucket.c +++ b/main/bucket.c @@ -560,33 +560,10 @@ struct ast_json *ast_bucket_json(const struct ast_bucket *bucket) } /*! \brief Hashing function for file metadata */ -static int bucket_file_metadata_hash(const void *obj, const int flags) -{ - 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; - } -} +AO2_STRING_FIELD_HASH_FN(ast_bucket_metadata, name) /*! \brief Comparison function for file metadata */ -static int bucket_file_metadata_cmp(void *obj, void *arg, int flags) -{ - 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; -} +AO2_STRING_FIELD_CMP_FN(ast_bucket_metadata, name) /*! \brief Destructor for bucket files */ 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, - bucket_file_metadata_hash, bucket_file_metadata_cmp); + ast_bucket_metadata_hash_fn, ast_bucket_metadata_cmp_fn); if (!file->metadata) { return NULL; } @@ -851,33 +828,10 @@ void ast_bucket_file_temporary_destroy(struct ast_bucket_file *file) } /*! \brief Hashing function for scheme container */ -static int bucket_scheme_hash(const void *obj, const int flags) -{ - 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; - } -} +AO2_STRING_FIELD_HASH_FN(ast_bucket_scheme, name) /*! \brief Comparison function for scheme container */ -static int bucket_scheme_cmp(void *obj, void *arg, int flags) -{ - 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; -} +AO2_STRING_FIELD_CMP_FN(ast_bucket_scheme, name) /*! \brief Cleanup function for graceful shutdowns */ static void bucket_cleanup(void) @@ -910,8 +864,8 @@ int ast_bucket_init(void) { ast_register_cleanup(&bucket_cleanup); - schemes = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_RWLOCK, SCHEME_BUCKETS, bucket_scheme_hash, - bucket_scheme_cmp); + schemes = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_RWLOCK, SCHEME_BUCKETS, + ast_bucket_scheme_hash_fn, ast_bucket_scheme_cmp_fn); if (!schemes) { ast_log(LOG_ERROR, "Failed to create container for Bucket schemes\n"); return -1; diff --git a/main/ccss.c b/main/ccss.c index ca0c17c1f..f11fe1db6 100644 --- a/main/ccss.c +++ b/main/ccss.c @@ -1386,19 +1386,8 @@ struct generic_monitor_pvt { int core_id; }; -static int generic_monitor_hash_fn(const void *obj, const int flags) -{ - 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; -} +AO2_STRING_FIELD_HASH_FN(generic_monitor_instance_list, device_name) +AO2_STRING_FIELD_CMP_FN(generic_monitor_instance_list, device_name) static struct generic_monitor_instance_list *find_generic_monitor_instance_list(const char * const device_name) { @@ -4671,8 +4660,8 @@ int ast_cc_init(void) return -1; } if (!(generic_monitors = ao2_t_container_alloc(CC_CORE_INSTANCES_BUCKETS, - generic_monitor_hash_fn, generic_monitor_cmp_fn, - "Create generic monitor container"))) { + generic_monitor_instance_list_hash_fn, generic_monitor_instance_list_cmp_fn, + "Create generic monitor container"))) { return -1; } if (!(cc_core_taskprocessor = ast_taskprocessor_get("CCSS_core", TPS_REF_DEFAULT))) { diff --git a/main/cel.c b/main/cel.c index 24d7faa85..31cd04542 100644 --- a/main/cel.c +++ b/main/cel.c @@ -331,129 +331,16 @@ struct cel_backend { }; /*! \brief Hashing function for cel_backend */ -static int cel_backend_hash(const void *obj, int flags) -{ - 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); -} +AO2_STRING_FIELD_HASH_FN(cel_backend, name) /*! \brief Comparator function for cel_backend */ -static int cel_backend_cmp(void *obj, void *arg, int flags) -{ - 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; -} +AO2_STRING_FIELD_CMP_FN(cel_backend, name) /*! \brief Hashing function for dialstatus container */ -static int dialstatus_hash(const void *obj, int flags) -{ - 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); -} +AO2_STRING_FIELD_HASH_FN(cel_dialstatus, uniqueid) /*! \brief Comparator function for dialstatus container */ -static int dialstatus_cmp(void *obj, void *arg, int flags) -{ - 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; -} +AO2_STRING_FIELD_CMP_FN(cel_dialstatus, uniqueid) unsigned int ast_cel_check_enabled(void) { @@ -1667,71 +1554,14 @@ static int create_routes(void) return ret; } -static int lid_hash(const void *obj, const int flags) -{ - 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; -} +AO2_STRING_FIELD_HASH_FN(cel_linkedid, id) +AO2_STRING_FIELD_CMP_FN(cel_linkedid, id) int ast_cel_engine_init(void) { 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_cleanup(container); if (!container) { @@ -1740,7 +1570,7 @@ int ast_cel_engine_init(void) } 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_cleanup(container); if (!container) { @@ -1758,7 +1588,7 @@ int ast_cel_engine_init(void) 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_cleanup(container); if (!container) { diff --git a/main/codec.c b/main/codec.c index d0e63682b..05cee4ab6 100644 --- a/main/codec.c +++ b/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, struct ast_module *mod); -static int codec_hash(const void *obj, int flags) -{ - 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; - } -} +AO2_STRING_FIELD_HASH_FN(ast_codec, name) static int codec_cmp(void *obj, void *arg, int flags) { @@ -267,7 +250,8 @@ static void codec_shutdown(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) { return -1; } diff --git a/main/endpoints.c b/main/endpoints.c index 80e7f87fd..88506a4c8 100644 --- a/main/endpoints.c +++ b/main/endpoints.c @@ -78,53 +78,8 @@ struct ast_endpoint { struct stasis_forward *tech_forward; }; -static int endpoint_hash(const void *obj, int flags) -{ - 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; -} +AO2_STRING_FIELD_HASH_FN(ast_endpoint, id) +AO2_STRING_FIELD_CMP_FN(ast_endpoint, 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); - endpoints = ao2_container_alloc(ENDPOINT_BUCKETS, endpoint_hash, - endpoint_cmp); + endpoints = ao2_container_alloc(ENDPOINT_BUCKETS, ast_endpoint_hash_fn, + ast_endpoint_cmp_fn); if (!endpoints) { return -1; } - tech_endpoints = ao2_container_alloc(TECH_ENDPOINT_BUCKETS, endpoint_hash, - endpoint_cmp); + tech_endpoints = ao2_container_alloc(TECH_ENDPOINT_BUCKETS, ast_endpoint_hash_fn, + ast_endpoint_cmp_fn); if (!tech_endpoints) { return -1; } diff --git a/main/format.c b/main/format.c index 758a7fc5e..b81a1f1d4 100644 --- a/main/format.c +++ b/main/format.c @@ -64,53 +64,8 @@ struct format_interface { /*! \brief Container for registered format interfaces */ static struct ao2_container *interfaces; -static int format_interface_hash(const void *obj, int flags) -{ - 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; -} +AO2_STRING_FIELD_HASH_FN(format_interface, codec) +AO2_STRING_FIELD_CMP_FN(format_interface, codec) /*! \brief Function called when the process is shutting down */ static void format_shutdown(void) @@ -121,8 +76,8 @@ static void format_shutdown(void) int ast_format_init(void) { - interfaces = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_RWLOCK, FORMAT_INTERFACE_BUCKETS, format_interface_hash, - format_interface_cmp); + interfaces = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_RWLOCK, FORMAT_INTERFACE_BUCKETS, + format_interface_hash_fn, format_interface_cmp_fn); if (!interfaces) { return -1; } diff --git a/main/named_acl.c b/main/named_acl.c index 458d4d397..9ea89903e 100644 --- a/main/named_acl.c +++ b/main/named_acl.c @@ -107,19 +107,8 @@ struct named_acl { char name[ACL_NAME_LENGTH]; /* Same max length as a configuration category */ }; -static int named_acl_hash_fn(const void *obj, const int flags) -{ - 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; -} +AO2_STRING_FIELD_HASH_FN(named_acl, name) +AO2_STRING_FIELD_CMP_FN(named_acl, name) /*! \brief destructor for named_acl_config */ static void named_acl_config_destructor(void *obj) diff --git a/main/named_locks.c b/main/named_locks.c index 596048388..6b41f2adb 100644 --- a/main/named_locks.c +++ b/main/named_locks.c @@ -39,46 +39,8 @@ struct ast_named_lock { char key[0]; }; -static int named_locks_hash(const void *obj, const int flags) -{ - 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; -} +AO2_STRING_FIELD_HASH_FN(ast_named_lock, key) +AO2_STRING_FIELD_CMP_FN(ast_named_lock, key) static void named_locks_shutdown(void) { @@ -88,7 +50,7 @@ static void named_locks_shutdown(void) int ast_named_locks_init(void) { 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) { return -1; } 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