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