|
|
|
@ -508,13 +508,15 @@ int ast_sorcery_init(void)
|
|
|
|
|
};
|
|
|
|
|
ast_assert(wizards == NULL);
|
|
|
|
|
|
|
|
|
|
if (!(threadpool = ast_threadpool_create("Sorcery", NULL, &options))) {
|
|
|
|
|
threadpool = NULL;
|
|
|
|
|
threadpool = ast_threadpool_create("Sorcery", NULL, &options);
|
|
|
|
|
if (!threadpool) {
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!(wizards = ao2_container_alloc(WIZARD_BUCKETS, sorcery_wizard_hash, sorcery_wizard_cmp))) {
|
|
|
|
|
ast_threadpool_shutdown(threadpool);
|
|
|
|
|
wizards = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, WIZARD_BUCKETS,
|
|
|
|
|
sorcery_wizard_hash, NULL, sorcery_wizard_cmp);
|
|
|
|
|
if (!wizards) {
|
|
|
|
|
sorcery_cleanup();
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -524,8 +526,8 @@ int ast_sorcery_init(void)
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
instances = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_RWLOCK, INSTANCE_BUCKETS,
|
|
|
|
|
sorcery_instance_hash, sorcery_instance_cmp);
|
|
|
|
|
instances = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_RWLOCK, 0, INSTANCE_BUCKETS,
|
|
|
|
|
sorcery_instance_hash, NULL, sorcery_instance_cmp);
|
|
|
|
|
if (!instances) {
|
|
|
|
|
sorcery_cleanup();
|
|
|
|
|
return -1;
|
|
|
|
@ -842,23 +844,30 @@ static struct ast_sorcery_object_type *sorcery_object_type_alloc(const char *typ
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!(object_type->fields = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_NOLOCK, OBJECT_FIELD_BUCKETS,
|
|
|
|
|
object_type_field_hash, object_type_field_cmp))) {
|
|
|
|
|
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);
|
|
|
|
|
if (!object_type->fields) {
|
|
|
|
|
ao2_ref(object_type, -1);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!(object_type->observers = ao2_container_alloc_options(AO2_ALLOC_OPT_LOCK_RWLOCK, 1, NULL, NULL))) {
|
|
|
|
|
object_type->observers = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_RWLOCK, 0,
|
|
|
|
|
NULL, NULL);
|
|
|
|
|
if (!object_type->observers) {
|
|
|
|
|
ao2_ref(object_type, -1);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!(object_type->info = ast_calloc(1, sizeof(*object_type->info) + 2 * sizeof(object_type->info->files[0])))) {
|
|
|
|
|
object_type->info = ast_calloc(1,
|
|
|
|
|
sizeof(*object_type->info) + 2 * sizeof(object_type->info->files[0]));
|
|
|
|
|
if (!object_type->info) {
|
|
|
|
|
ao2_ref(object_type, -1);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!(object_type->file = ast_calloc(1, sizeof(*object_type->file) + 2 * sizeof(object_type->file->types[0])))) {
|
|
|
|
|
object_type->file = ast_calloc(1,
|
|
|
|
|
sizeof(*object_type->file) + 2 * sizeof(object_type->file->types[0]));
|
|
|
|
|
if (!object_type->file) {
|
|
|
|
|
ao2_ref(object_type, -1);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|