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
This commit is contained in:
George Joseph
2016-04-13 12:38:01 -06:00
parent fddec0c266
commit caa416d5f3
3 changed files with 28 additions and 62 deletions

View File

@@ -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));