summaryrefslogtreecommitdiff
path: root/main/stringfields.c
diff options
context:
space:
mode:
authorGeorge Joseph <george.joseph@fairview5.com>2016-04-13 12:38:01 -0600
committerGeorge Joseph <george.joseph@fairview5.com>2016-04-13 14:01:37 -0600
commitcaa416d5f305526c1ef7ed9065ab5361d87ebba1 (patch)
treef47a773afe7f437bd6650dd23f88a6fc10e279c8 /main/stringfields.c
parentfddec0c2664a65b5ffa18894af60bf4d81a7dafc (diff)
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
Diffstat (limited to 'main/stringfields.c')
-rw-r--r--main/stringfields.c55
1 files changed, 15 insertions, 40 deletions
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));