00001 #ifndef _TALLOC_H_
00002 #define _TALLOC_H_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 typedef void TALLOC_CTX;
00031
00032
00033
00034
00035 #ifndef __location__
00036 #define __TALLOC_STRING_LINE1__(s) #s
00037 #define __TALLOC_STRING_LINE2__(s) __TALLOC_STRING_LINE1__(s)
00038 #define __TALLOC_STRING_LINE3__ __TALLOC_STRING_LINE2__(__LINE__)
00039 #define __location__ __FILE__ ":" __TALLOC_STRING_LINE3__
00040 #endif
00041
00042 #ifndef TALLOC_DEPRECATED
00043 #define TALLOC_DEPRECATED 0
00044 #endif
00045
00046 #ifndef PRINTF_ATTRIBUTE
00047 #if (__GNUC__ >= 3)
00048
00049
00050
00051
00052 #define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2)))
00053 #else
00054 #define PRINTF_ATTRIBUTE(a1, a2)
00055 #endif
00056 #endif
00057
00058
00059
00060 #if (__GNUC__ >= 3)
00061 #define _TALLOC_TYPEOF(ptr) __typeof__(ptr)
00062 #define talloc_set_destructor(ptr, function) \
00063 do { \
00064 int (*_talloc_destructor_fn)(_TALLOC_TYPEOF(ptr)) = (function); \
00065 _talloc_set_destructor((ptr), (int (*)(void *))_talloc_destructor_fn); \
00066 } while(0)
00067
00068
00069 #define talloc_steal(ctx, ptr) ({ _TALLOC_TYPEOF(ptr) __talloc_steal_ret = (_TALLOC_TYPEOF(ptr))_talloc_steal((ctx),(ptr)); __talloc_steal_ret; })
00070 #else
00071 #define talloc_set_destructor(ptr, function) \
00072 _talloc_set_destructor((ptr), (int (*)(void *))(function))
00073 #define _TALLOC_TYPEOF(ptr) void *
00074 #define talloc_steal(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_steal((ctx),(ptr))
00075 #endif
00076
00077 #define talloc_reference(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_reference((ctx),(ptr))
00078 #define talloc_move(ctx, ptr) (_TALLOC_TYPEOF(*(ptr)))_talloc_move((ctx),(void *)(ptr))
00079
00080
00081 #define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type)
00082 #define talloc_size(ctx, size) talloc_named_const(ctx, size, __location__)
00083 #define talloc_ptrtype(ctx, ptr) (_TALLOC_TYPEOF(ptr))talloc_size(ctx, sizeof(*(ptr)))
00084
00085 #define talloc_new(ctx) talloc_named_const(ctx, 0, "talloc_new: " __location__)
00086
00087 #define talloc_zero(ctx, type) (type *)_talloc_zero(ctx, sizeof(type), #type)
00088 #define talloc_zero_size(ctx, size) _talloc_zero(ctx, size, __location__)
00089
00090 #define talloc_zero_array(ctx, type, count) (type *)_talloc_zero_array(ctx, sizeof(type), count, #type)
00091 #define talloc_array(ctx, type, count) (type *)_talloc_array(ctx, sizeof(type), count, #type)
00092 #define talloc_array_size(ctx, size, count) _talloc_array(ctx, size, count, __location__)
00093 #define talloc_array_ptrtype(ctx, ptr, count) (_TALLOC_TYPEOF(ptr))talloc_array_size(ctx, sizeof(*(ptr)), count)
00094
00095 #define talloc_realloc(ctx, p, type, count) (type *)_talloc_realloc_array(ctx, p, sizeof(type), count, #type)
00096 #define talloc_realloc_size(ctx, ptr, size) _talloc_realloc(ctx, ptr, size, __location__)
00097
00098 #define talloc_memdup(t, p, size) _talloc_memdup(t, p, size, __location__)
00099
00100 #define talloc_set_type(ptr, type) talloc_set_name_const(ptr, #type)
00101 #define talloc_get_type(ptr, type) (type *)talloc_check_name(ptr, #type)
00102
00103 #define talloc_find_parent_bytype(ptr, type) (type *)talloc_find_parent_byname(ptr, #type)
00104
00105 #if TALLOC_DEPRECATED
00106 #define talloc_zero_p(ctx, type) talloc_zero(ctx, type)
00107 #define talloc_p(ctx, type) talloc(ctx, type)
00108 #define talloc_array_p(ctx, type, count) talloc_array(ctx, type, count)
00109 #define talloc_realloc_p(ctx, p, type, count) talloc_realloc(ctx, p, type, count)
00110 #define talloc_destroy(ctx) talloc_free(ctx)
00111 #endif
00112
00113
00114 void *_talloc(const void *context, size_t size);
00115 void _talloc_set_destructor(const void *ptr, int (*destructor)(void *));
00116 int talloc_increase_ref_count(const void *ptr);
00117 size_t talloc_reference_count(const void *ptr);
00118 void *_talloc_reference(const void *context, const void *ptr);
00119 int talloc_unlink(const void *context, void *ptr);
00120 const char *talloc_set_name(const void *ptr, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3);
00121 void talloc_set_name_const(const void *ptr, const char *name);
00122 void *talloc_named(const void *context, size_t size,
00123 const char *fmt, ...) PRINTF_ATTRIBUTE(3,4);
00124 void *talloc_named_const(const void *context, size_t size, const char *name);
00125 const char *talloc_get_name(const void *ptr);
00126 void *talloc_check_name(const void *ptr, const char *name);
00127 void *talloc_parent(const void *ptr);
00128 const char *talloc_parent_name(const void *ptr);
00129 void *talloc_init(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2);
00130 int talloc_free(void *ptr);
00131 void talloc_free_children(void *ptr);
00132 void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *name);
00133 void *_talloc_steal(const void *new_ctx, const void *ptr);
00134 void *_talloc_move(const void *new_ctx, const void *pptr);
00135 size_t talloc_total_size(const void *ptr);
00136 size_t talloc_total_blocks(const void *ptr);
00137 void talloc_report_depth_cb(const void *ptr, int depth, int max_depth,
00138 void (*callback)(const void *ptr,
00139 int depth, int max_depth,
00140 int is_ref,
00141 void *private_data),
00142 void *private_data);
00143 void talloc_report_depth_file(const void *ptr, int depth, int max_depth, FILE *f);
00144 void talloc_report_full(const void *ptr, FILE *f);
00145 void talloc_report(const void *ptr, FILE *f);
00146 void talloc_enable_null_tracking(void);
00147 void talloc_disable_null_tracking(void);
00148 void talloc_enable_leak_report(void);
00149 void talloc_enable_leak_report_full(void);
00150 void *_talloc_zero(const void *ctx, size_t size, const char *name);
00151 void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name);
00152 char *talloc_strdup(const void *t, const char *p);
00153 char *talloc_strndup(const void *t, const char *p, size_t n);
00154 char *talloc_append_string(const void *t, char *orig, const char *append);
00155 char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0);
00156 char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0);
00157 char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3);
00158 char *talloc_asprintf_append(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3);
00159 void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name);
00160 void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name);
00161 void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name);
00162 void *talloc_realloc_fn(const void *context, void *ptr, size_t size);
00163 void *talloc_autofree_context(void);
00164 size_t talloc_get_size(const void *ctx);
00165 void *talloc_find_parent_byname(const void *ctx, const char *name);
00166 void talloc_show_parents(const void *context, FILE *file);
00167 int talloc_is_parent(const void *context, const void *ptr);
00168
00169 #endif