mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-02 19:16:15 +00:00
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:
@@ -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));
|
||||
|
||||
|
Reference in New Issue
Block a user