| OLD | NEW |
| (Empty) |
| 1 #ifndef _TALLOC_H_ | |
| 2 #define _TALLOC_H_ | |
| 3 /* | |
| 4 Unix SMB/CIFS implementation. | |
| 5 Samba temporary memory allocation functions | |
| 6 | |
| 7 Copyright (C) Andrew Tridgell 2004-2005 | |
| 8 Copyright (C) Stefan Metzmacher 2006 | |
| 9 | |
| 10 ** NOTE! The following LGPL license applies to the talloc | |
| 11 ** library. This does NOT imply that all of Samba is released | |
| 12 ** under the LGPL | |
| 13 | |
| 14 This library is free software; you can redistribute it and/or | |
| 15 modify it under the terms of the GNU Lesser General Public | |
| 16 License as published by the Free Software Foundation; either | |
| 17 version 3 of the License, or (at your option) any later version. | |
| 18 | |
| 19 This library is distributed in the hope that it will be useful, | |
| 20 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| 22 Lesser General Public License for more details. | |
| 23 | |
| 24 You should have received a copy of the GNU Lesser General Public | |
| 25 License along with this library; if not, see <http://www.gnu.org/licenses/>. | |
| 26 */ | |
| 27 | |
| 28 #include <stdlib.h> | |
| 29 #include <stdio.h> | |
| 30 #include <stdarg.h> | |
| 31 #ifndef _MSC_VER | |
| 32 #include <stdint.h> | |
| 33 #endif | |
| 34 #include <string.h> | |
| 35 | |
| 36 #define TALLOC_VERSION_MAJOR 2 | |
| 37 #define TALLOC_VERSION_MINOR 0 | |
| 38 | |
| 39 int talloc_version_major(void); | |
| 40 int talloc_version_minor(void); | |
| 41 | |
| 42 /* this is only needed for compatibility with the old talloc */ | |
| 43 typedef void TALLOC_CTX; | |
| 44 | |
| 45 /* | |
| 46 this uses a little trick to allow __LINE__ to be stringified | |
| 47 */ | |
| 48 #ifndef __location__ | |
| 49 #define __TALLOC_STRING_LINE1__(s) #s | |
| 50 #define __TALLOC_STRING_LINE2__(s) __TALLOC_STRING_LINE1__(s) | |
| 51 #define __TALLOC_STRING_LINE3__ __TALLOC_STRING_LINE2__(__LINE__) | |
| 52 #define __location__ __FILE__ ":" __TALLOC_STRING_LINE3__ | |
| 53 #endif | |
| 54 | |
| 55 #ifndef TALLOC_DEPRECATED | |
| 56 #define TALLOC_DEPRECATED 0 | |
| 57 #endif | |
| 58 | |
| 59 #ifndef PRINTF_ATTRIBUTE | |
| 60 #if (__GNUC__ >= 3) | |
| 61 /** Use gcc attribute to check printf fns. a1 is the 1-based index of | |
| 62 * the parameter containing the format, and a2 the index of the first | |
| 63 * argument. Note that some gcc 2.x versions don't handle this | |
| 64 * properly **/ | |
| 65 #define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2))) | |
| 66 #else | |
| 67 #define PRINTF_ATTRIBUTE(a1, a2) | |
| 68 #endif | |
| 69 #endif | |
| 70 | |
| 71 /* try to make talloc_set_destructor() and talloc_steal() type safe, | |
| 72 if we have a recent gcc */ | |
| 73 #if (__GNUC__ >= 3) | |
| 74 #define _TALLOC_TYPEOF(ptr) __typeof__(ptr) | |
| 75 #define talloc_set_destructor(ptr, function) \ | |
| 76 do { \ | |
| 77 int (*_talloc_destructor_fn)(_TALLOC_TYPEOF(ptr)) = (function);
\ | |
| 78 _talloc_set_destructor((ptr), (int (*)(void *))_talloc_destructo
r_fn); \ | |
| 79 } while(0) | |
| 80 /* this extremely strange macro is to avoid some braindamaged warning | |
| 81 stupidity in gcc 4.1.x */ | |
| 82 #define talloc_steal(ctx, ptr) ({ _TALLOC_TYPEOF(ptr) __talloc_steal_ret = (_TAL
LOC_TYPEOF(ptr))_talloc_steal_loc((ctx),(ptr), __location__); __talloc_steal_ret
; }) | |
| 83 #else | |
| 84 #define talloc_set_destructor(ptr, function) \ | |
| 85 _talloc_set_destructor((ptr), (int (*)(void *))(function)) | |
| 86 #define _TALLOC_TYPEOF(ptr) void * | |
| 87 #define talloc_steal(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_steal_loc((ctx),(ptr
), __location__) | |
| 88 #endif | |
| 89 | |
| 90 #define talloc_reference(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_reference_loc((c
tx),(ptr), __location__) | |
| 91 #define talloc_move(ctx, ptr) (_TALLOC_TYPEOF(*(ptr)))_talloc_move((ctx),(void *
)(ptr)) | |
| 92 | |
| 93 /* useful macros for creating type checked pointers */ | |
| 94 #define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) | |
| 95 #define talloc_size(ctx, size) talloc_named_const(ctx, size, __location__) | |
| 96 #define talloc_ptrtype(ctx, ptr) (_TALLOC_TYPEOF(ptr))talloc_size(ctx, sizeof(*(
ptr))) | |
| 97 | |
| 98 #define talloc_new(ctx) talloc_named_const(ctx, 0, "talloc_new: " __location__) | |
| 99 | |
| 100 #define talloc_zero(ctx, type) (type *)_talloc_zero(ctx, sizeof(type), #type) | |
| 101 #define talloc_zero_size(ctx, size) _talloc_zero(ctx, size, __location__) | |
| 102 | |
| 103 #define talloc_zero_array(ctx, type, count) (type *)_talloc_zero_array(ctx, size
of(type), count, #type) | |
| 104 #define talloc_array(ctx, type, count) (type *)_talloc_array(ctx, sizeof(type),
count, #type) | |
| 105 #define talloc_array_size(ctx, size, count) _talloc_array(ctx, size, count, __lo
cation__) | |
| 106 #define talloc_array_ptrtype(ctx, ptr, count) (_TALLOC_TYPEOF(ptr))talloc_array_
size(ctx, sizeof(*(ptr)), count) | |
| 107 #define talloc_array_length(ctx) (talloc_get_size(ctx)/sizeof(*ctx)) | |
| 108 | |
| 109 #define talloc_realloc(ctx, p, type, count) (type *)_talloc_realloc_array(ctx, p
, sizeof(type), count, #type) | |
| 110 #define talloc_realloc_size(ctx, ptr, size) _talloc_realloc(ctx, ptr, size, __lo
cation__) | |
| 111 | |
| 112 #define talloc_memdup(t, p, size) _talloc_memdup(t, p, size, __location__) | |
| 113 | |
| 114 #define talloc_set_type(ptr, type) talloc_set_name_const(ptr, #type) | |
| 115 #define talloc_get_type(ptr, type) (type *)talloc_check_name(ptr, #type) | |
| 116 #define talloc_get_type_abort(ptr, type) (type *)_talloc_get_type_abort(ptr, #ty
pe, __location__) | |
| 117 | |
| 118 #define talloc_find_parent_bytype(ptr, type) (type *)talloc_find_parent_byname(p
tr, #type) | |
| 119 #define talloc_free(ctx) _talloc_free(ctx, __location__) | |
| 120 | |
| 121 | |
| 122 #if TALLOC_DEPRECATED | |
| 123 #define talloc_zero_p(ctx, type) talloc_zero(ctx, type) | |
| 124 #define talloc_p(ctx, type) talloc(ctx, type) | |
| 125 #define talloc_array_p(ctx, type, count) talloc_array(ctx, type, count) | |
| 126 #define talloc_realloc_p(ctx, p, type, count) talloc_realloc(ctx, p, type, count
) | |
| 127 #define talloc_destroy(ctx) talloc_free(ctx) | |
| 128 #define talloc_append_string(c, s, a) (s?talloc_strdup_append(s,a):talloc_strdup
(c, a)) | |
| 129 #endif | |
| 130 | |
| 131 #define TALLOC_FREE(ctx) do { talloc_free(ctx); ctx=NULL; } while(0) | |
| 132 | |
| 133 /* The following definitions come from talloc.c */ | |
| 134 void *_talloc(const void *context, size_t size); | |
| 135 void *talloc_pool(const void *context, size_t size); | |
| 136 void _talloc_set_destructor(const void *ptr, int (*_destructor)(void *)); | |
| 137 int talloc_increase_ref_count(const void *ptr); | |
| 138 size_t talloc_reference_count(const void *ptr); | |
| 139 void *_talloc_reference_loc(const void *context, const void *ptr, const char *lo
cation); | |
| 140 int talloc_unlink(const void *context, void *ptr); | |
| 141 const char *talloc_set_name(const void *ptr, const char *fmt, ...) PRINTF_ATTRIB
UTE(2,3); | |
| 142 void talloc_set_name_const(const void *ptr, const char *name); | |
| 143 void *talloc_named(const void *context, size_t size, | |
| 144 const char *fmt, ...) PRINTF_ATTRIBUTE(3,4); | |
| 145 void *talloc_named_const(const void *context, size_t size, const char *name); | |
| 146 const char *talloc_get_name(const void *ptr); | |
| 147 void *talloc_check_name(const void *ptr, const char *name); | |
| 148 void *_talloc_get_type_abort(const void *ptr, const char *name, const char *loca
tion); | |
| 149 void *talloc_parent(const void *ptr); | |
| 150 const char *talloc_parent_name(const void *ptr); | |
| 151 void *talloc_init(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2); | |
| 152 int _talloc_free(void *ptr, const char *location); | |
| 153 void talloc_free_children(void *ptr); | |
| 154 void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n
ame); | |
| 155 void *_talloc_steal_loc(const void *new_ctx, const void *ptr, const char *locati
on); | |
| 156 void *talloc_reparent(const void *old_parent, const void *new_parent, const void
*ptr); | |
| 157 void *_talloc_move(const void *new_ctx, const void *pptr); | |
| 158 size_t talloc_total_size(const void *ptr); | |
| 159 size_t talloc_total_blocks(const void *ptr); | |
| 160 void talloc_report_depth_cb(const void *ptr, int depth, int max_depth, | |
| 161 void (*callback)(const void *ptr, | |
| 162 int depth, int max_depth, | |
| 163 int is_ref, | |
| 164 void *private_data), | |
| 165 void *private_data); | |
| 166 void talloc_report_depth_file(const void *ptr, int depth, int max_depth, FILE *f
); | |
| 167 void talloc_report_full(const void *ptr, FILE *f); | |
| 168 void talloc_report(const void *ptr, FILE *f); | |
| 169 void talloc_enable_null_tracking(void); | |
| 170 void talloc_enable_null_tracking_no_autofree(void); | |
| 171 void talloc_disable_null_tracking(void); | |
| 172 void talloc_enable_leak_report(void); | |
| 173 void talloc_enable_leak_report_full(void); | |
| 174 void *_talloc_zero(const void *ctx, size_t size, const char *name); | |
| 175 void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name
); | |
| 176 void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char
*name); | |
| 177 void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const
char *name); | |
| 178 void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned
count, const char *name); | |
| 179 void *talloc_realloc_fn(const void *context, void *ptr, size_t size); | |
| 180 void *talloc_autofree_context(void); | |
| 181 size_t talloc_get_size(const void *ctx); | |
| 182 void *talloc_find_parent_byname(const void *ctx, const char *name); | |
| 183 void talloc_show_parents(const void *context, FILE *file); | |
| 184 int talloc_is_parent(const void *context, const void *ptr); | |
| 185 | |
| 186 char *talloc_strdup(const void *t, const char *p); | |
| 187 char *talloc_strdup_append(char *s, const char *a); | |
| 188 char *talloc_strdup_append_buffer(char *s, const char *a); | |
| 189 | |
| 190 char *talloc_strndup(const void *t, const char *p, size_t n); | |
| 191 char *talloc_strndup_append(char *s, const char *a, size_t n); | |
| 192 char *talloc_strndup_append_buffer(char *s, const char *a, size_t n); | |
| 193 | |
| 194 char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIB
UTE(2,0); | |
| 195 char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) PRINTF_ATTRI
BUTE(2,0); | |
| 196 char *talloc_vasprintf_append_buffer(char *s, const char *fmt, va_list ap) PRINT
F_ATTRIBUTE(2,0); | |
| 197 | |
| 198 char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3)
; | |
| 199 char *talloc_asprintf_append(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3
); | |
| 200 char *talloc_asprintf_append_buffer(char *s, const char *fmt, ...) PRINTF_ATTRIB
UTE(2,3); | |
| 201 | |
| 202 void talloc_set_abort_fn(void (*abort_fn)(const char *reason)); | |
| 203 void talloc_set_log_fn(void (*log_fn)(const char *message)); | |
| 204 void talloc_set_log_stderr(void); | |
| 205 | |
| 206 #endif | |
| OLD | NEW |