diff options
Diffstat (limited to 'halloc_util.c')
-rw-r--r-- | halloc_util.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/halloc_util.c b/halloc_util.c new file mode 100644 index 00000000..bc575f7e --- /dev/null +++ b/halloc_util.c @@ -0,0 +1,69 @@ +/** \file halloc.c + + A hierarchical memory allocation system. Works just like talloc + used in Samba, except that an arbitrary block allocated with + malloc() can be registered to be freed by halloc_free. + +*/ + +#include "config.h" + +#include <stdlib.h> +#include <unistd.h> + +#include "util.h" +#include "common.h" +#include "halloc.h" + +void *global_context=0; + +void halloc_util_init() +{ + global_context = halloc( 0, 0 ); +} + +void halloc_util_destroy() +{ + halloc_free( global_context ); +} + +array_list_t *al_halloc( void *context ) +{ + array_list_t *res = halloc( context, sizeof( array_list_t ) ); + if( !res ) + die_mem(); + al_init( res ); + halloc_register_function( res, (void (*)(void *)) &al_destroy, res ); + return res; +} + +string_buffer_t *sb_halloc( void *context ) +{ + string_buffer_t *res = halloc( context, sizeof( string_buffer_t ) ); + if( !res ) + die_mem(); + sb_init( res ); + halloc_register_function( res, (void (*)(void *)) &sb_destroy, res ); + return res; +} + +static void halloc_passthrough( void *f ) +{ + void (*func)() = (void (*)() )f; + func(); +} + +void halloc_register_function_void( void *context, void (*func)() ) +{ + halloc_register_function( context, &halloc_passthrough, (void *)func ); +} + +void *halloc_register( void *context, void *data ) +{ + if( !data ) + return 0; + + halloc_register_function( context, &free, data ); + return data; +} + |