From caa416d5f305526c1ef7ed9065ab5361d87ebba1 Mon Sep 17 00:00:00 2001 From: George Joseph Date: Wed, 13 Apr 2016 12:38:01 -0600 Subject: stringfields: Update extended string fields for master only. In 13, the new ast_string_field_header structure had to be dynamically allocated and assigned to a pointer in ast_string_field_mgr to preserve ABI compatability. In master, it can be converted to being a structure-in-place in ast_string_field_mgr to eliminate the extra alloc and free calls. Change-Id: Ia97c5345eec68717a15dc16fe2e6746ff2a926f4 --- main/stringfields.c | 55 +++++++++++++++-------------------------------------- 1 file changed, 15 insertions(+), 40 deletions(-) (limited to 'main/stringfields.c') diff --git a/main/stringfields.c b/main/stringfields.c index 67dd06c9b..e82b49b98 100644 --- a/main/stringfields.c +++ b/main/stringfields.c @@ -118,29 +118,23 @@ int __ast_string_field_free_memory(struct ast_string_field_mgr *mgr, struct ast_string_field_pool *cur = NULL; struct ast_string_field_pool *preserve = NULL; - if (!mgr->header) { - return -1; - } - /* reset all the fields regardless of cleanup type */ - AST_VECTOR_CALLBACK_VOID(&mgr->header->string_fields, reset_field); + AST_VECTOR_CALLBACK_VOID(&mgr->string_fields, reset_field); switch (cleanup_type) { case AST_STRINGFIELD_DESTROY: - AST_VECTOR_FREE(&mgr->header->string_fields); + AST_VECTOR_FREE(&mgr->string_fields); - if (mgr->header->embedded_pool) { /* ALWAYS preserve the embedded pool if there is one */ - preserve = mgr->header->embedded_pool; + if (mgr->embedded_pool) { /* ALWAYS preserve the embedded pool if there is one */ + preserve = mgr->embedded_pool; preserve->used = preserve->active = 0; } - ast_free(mgr->header); - mgr->header = NULL; break; case AST_STRINGFIELD_RESET: /* Preserve the embedded pool if there is one, otherwise the last pool */ - if (mgr->header->embedded_pool) { - preserve = mgr->header->embedded_pool; + if (mgr->embedded_pool) { + preserve = mgr->embedded_pool; } else { if (*pool_head == NULL) { ast_log(LOG_WARNING, "trying to reset empty pool\n"); @@ -202,27 +196,19 @@ int __ast_string_field_init(struct ast_string_field_mgr *mgr, struct ast_string_ mgr->owner_line = lineno; #endif - if (!(mgr->header = calloc_wrapper(1, sizeof(*mgr->header), file, lineno, func))) { - return -1; - } - - if (AST_VECTOR_INIT(&mgr->header->string_fields, initial_vector_size)) { - ast_free(mgr->header); - mgr->header = NULL; + if (AST_VECTOR_INIT(&mgr->string_fields, initial_vector_size)) { return -1; } while ((struct ast_string_field_mgr *) p != mgr) { - AST_VECTOR_APPEND(&mgr->header->string_fields, p); + AST_VECTOR_APPEND(&mgr->string_fields, p); *p++ = __ast_string_field_empty; } *pool_head = NULL; - mgr->header->embedded_pool = NULL; + mgr->embedded_pool = NULL; if (add_string_pool(mgr, pool_head, needed, file, lineno, func)) { - AST_VECTOR_FREE(&mgr->header->string_fields); - ast_free(mgr->header); - mgr->header = NULL; + AST_VECTOR_FREE(&mgr->string_fields); return -1; } @@ -428,33 +414,22 @@ void *__ast_calloc_with_stringfields(unsigned int num_structs, size_t struct_siz mgr = allocation + field_mgr_offset; - /* - * The header is calloced in __ast_string_field_init so it also gets calloced here - * so __ast_string_fields_free_memory can always just free mgr->header. - */ - mgr->header = calloc_wrapper(1, sizeof(*mgr->header), file, lineno, func); - if (!mgr->header) { - ast_free(allocation); - return NULL; - } - pool = allocation + struct_size; pool_head = allocation + field_mgr_pool_offset; p = (const char **) pool_head + 1; initial_vector_size = ((size_t) (((char *)mgr) - ((char *)p))) / sizeof(*p); - if (AST_VECTOR_INIT(&mgr->header->string_fields, initial_vector_size)) { - ast_free(mgr->header); + if (AST_VECTOR_INIT(&mgr->string_fields, initial_vector_size)) { ast_free(allocation); return NULL; } while ((struct ast_string_field_mgr *) p != mgr) { - AST_VECTOR_APPEND(&mgr->header->string_fields, p); + AST_VECTOR_APPEND(&mgr->string_fields, p); *p++ = __ast_string_field_empty; } - mgr->header->embedded_pool = pool; + mgr->embedded_pool = pool; *pool_head = pool; pool->size = size_to_alloc - struct_size - sizeof(*pool); #if defined(__AST_DEBUG_MALLOC) @@ -487,8 +462,8 @@ int __ast_string_fields_copy(struct ast_string_field_pool *copy_pool, struct ast_string_field_mgr *copy_mgr, struct ast_string_field_mgr *orig_mgr) { int i; - struct ast_string_field_vector *dest = &(copy_mgr->header->string_fields); - struct ast_string_field_vector *src = &(orig_mgr->header->string_fields); + struct ast_string_field_vector *dest = &(copy_mgr->string_fields); + struct ast_string_field_vector *src = &(orig_mgr->string_fields); ast_assert(AST_VECTOR_SIZE(dest) == AST_VECTOR_SIZE(src)); -- cgit v1.2.3