Home | History | Annotate | Download | only in talloc
      1 /*
      2  * Similar core function to LGPL licensed talloc from Samba
      3  */
      4 
      5 #ifndef _HIERALLOC_H_
      6 #define _HIERALLOC_H_
      7 
      8 #include <stdio.h>
      9 #include <stdarg.h>
     10 
     11 // allow __LINE__ to be stringified
     12 #ifndef __location__
     13 #define __HIERALLOC_STRING_0__(s)   #s
     14 #define __HIERALLOC_STRING_1__(s)   __HIERALLOC_STRING_0__(s)
     15 #define __HIERALLOC_STRING_2__      __HIERALLOC_STRING_1__(__LINE__)
     16 #define __location__                __FILE__ ":" __HIERALLOC_STRING_2__
     17 #endif
     18 
     19 #define hieralloc(ctx, type) (type *)hieralloc_allocate(ctx, sizeof(type), #type)
     20 #define hieralloc_size(ctx, size) hieralloc_allocate(ctx, size, "sz:"__location__)
     21 #define hieralloc_new(ctx) hieralloc_allocate(ctx, 0, "nw:" __location__)
     22 #define hieralloc_zero(ctx, type) (type *)_hieralloc_zero(ctx, sizeof(type), "zr:"#type)
     23 #define hieralloc_zero_size(ctx, size) _hieralloc_zero(ctx, size, "zrsz:"__location__)
     24 #define hieralloc_array(ctx, type, count) (type *)hieralloc_allocate(ctx, sizeof(type) * count, "ar:"#type)
     25 #define hieralloc_realloc(ctx, p, type, count) (type *)hieralloc_reallocate(ctx, p, sizeof(type) * count, "re:"#type)
     26 
     27 #ifdef __cplusplus
     28 extern "C" {
     29 #endif
     30 // allocate memory and attach to parent context and siblings
     31 void * hieralloc_allocate(const void * context, unsigned size, const char * name);
     32 
     33 // (re)allocate memory and attach to parent context and siblings
     34 void * hieralloc_reallocate(const void * context, void * ptr, unsigned size, const char * name);
     35 
     36 // calls destructor if set, and frees children.
     37 // if destructor returns -1, then do nothing and return -1.
     38 int hieralloc_free(void * ptr);
     39 
     40 // creates 0 allocation to be used as parent context
     41 void * hieralloc_init(const char * name);
     42 
     43 // returns global context
     44 void * hieralloc_autofree_context();
     45 
     46 // sets destructor to be called before freeing; dctor return -1 aborts free
     47 void hieralloc_set_destructor(const void * ptr, int (* destructor)(void *));
     48 
     49 // gets parent context of allocated memory
     50 void * hieralloc_parent(const void * ptr);
     51 
     52 // moves allocation to new parent context; maintain children but update siblings
     53 // returns ptr on success
     54 void * hieralloc_steal(const void * new_ctx, const void * ptr);
     55 
     56 // not implemented from talloc_reference
     57 void * hieralloc_reference(const void * ref_ctx, const void * ptr);
     58 
     59 // not implemented from talloc_unlink
     60 int hieralloc_unlink(const void * ctx, void * ptr);
     61 
     62 // allocate and zero memory
     63 void * _hieralloc_zero(const void * ctx, unsigned size, const char * name);
     64 
     65 // allocate and copy
     66 char * hieralloc_strdup(const void * ctx, const char * str);
     67 
     68 // allocate and copy
     69 char * hieralloc_strndup(const void * ctx, const char * str, unsigned len);
     70 
     71 // reallocate and append
     72 char * hieralloc_strdup_append(char * str, const char * append);
     73 
     74 // reallocate and append
     75 char * hieralloc_strndup_append(char * str, const char * append, unsigned len);
     76 
     77 // allocate and vsprintf
     78 char * hieralloc_vasprintf(const void * ctx, const char * fmt, va_list va);
     79 
     80 // allocate and sprintf
     81 char * hieralloc_asprintf(const void * ctx, const char * fmt, ...);
     82 
     83 // reallocate and append vsprintf
     84 char * hieralloc_vasprintf_append(char * str, const char * fmt, va_list va);
     85 
     86 // reallocate and append sprintf
     87 char * hieralloc_asprintf_append(char * str, const char * fmt, ...);
     88 
     89 // report self and child allocations
     90 void hieralloc_report(const void * ptr, FILE * file);
     91 
     92 void hieralloc_report_brief(const void * ptr, FILE * file);
     93 
     94 void hieralloc_report_lineage(const void * ptr, FILE * file, int tab);
     95 
     96 int hieralloc_find(const void * top, const void * ptr, FILE * file, int tab);
     97 
     98 #ifdef __cplusplus
     99 }
    100 #endif
    101 
    102 #endif
    103