aboutsummaryrefslogtreecommitdiffhomepage
path: root/halloc_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'halloc_util.c')
-rw-r--r--halloc_util.c69
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;
+}
+