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 |