Merge "stringfields: Update extended string fields for master only."

This commit is contained in:
zuul
2016-04-21 12:48:27 -05:00
committed by Gerrit Code Review
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));