Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3584 | sourcerer | 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 2 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, write to the Free Software |
||
26 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||
27 | */ |
||
28 | |||
29 | #include |
||
30 | #include |
||
31 | #include |
||
32 | |||
33 | /* this is only needed for compatibility with the old talloc */ |
||
34 | typedef void TALLOC_CTX; |
||
35 | |||
36 | /* |
||
37 | this uses a little trick to allow __LINE__ to be stringified |
||
38 | */ |
||
39 | #ifndef __location__ |
||
40 | #define __TALLOC_STRING_LINE1__(s) #s |
||
41 | #define __TALLOC_STRING_LINE2__(s) __TALLOC_STRING_LINE1__(s) |
||
42 | #define __TALLOC_STRING_LINE3__ __TALLOC_STRING_LINE2__(__LINE__) |
||
43 | #define __location__ __FILE__ ":" __TALLOC_STRING_LINE3__ |
||
44 | #endif |
||
45 | |||
46 | #ifndef TALLOC_DEPRECATED |
||
47 | #define TALLOC_DEPRECATED 0 |
||
48 | #endif |
||
49 | |||
50 | #ifndef PRINTF_ATTRIBUTE |
||
51 | #if (__GNUC__ >= 3) |
||
52 | /** Use gcc attribute to check printf fns. a1 is the 1-based index of |
||
53 | * the parameter containing the format, and a2 the index of the first |
||
54 | * argument. Note that some gcc 2.x versions don't handle this |
||
55 | * properly **/ |
||
56 | #define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2))) |
||
57 | #else |
||
58 | #define PRINTF_ATTRIBUTE(a1, a2) |
||
59 | #endif |
||
60 | #endif |
||
61 | |||
62 | /* try to make talloc_set_destructor() and talloc_steal() type safe, |
||
63 | if we have a recent gcc */ |
||
64 | #if (__GNUC__ >= 3) |
||
65 | #define _TALLOC_TYPEOF(ptr) __typeof__(ptr) |
||
66 | #define talloc_set_destructor(ptr, function) \ |
||
67 | do { \ |
||
68 | int (*_talloc_destructor_fn)(_TALLOC_TYPEOF(ptr)) = (function); \ |
||
69 | _talloc_set_destructor((ptr), (int (*)(void *))_talloc_destructor_fn); \ |
||
70 | } while(0) |
||
71 | /* this extremely strange macro is to avoid some braindamaged warning |
||
72 | stupidity in gcc 4.1.x */ |
||
73 | #define talloc_steal(ctx, ptr) ({ _TALLOC_TYPEOF(ptr) __talloc_steal_ret = (_TALLOC_TYPEOF(ptr))_talloc_steal((ctx),(ptr)); __talloc_steal_ret; }) |
||
74 | #else |
||
75 | #define talloc_set_destructor(ptr, function) \ |
||
76 | _talloc_set_destructor((ptr), (int (*)(void *))(function)) |
||
77 | #define _TALLOC_TYPEOF(ptr) void * |
||
78 | #define talloc_steal(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_steal((ctx),(ptr)) |
||
79 | #endif |
||
80 | |||
81 | #define talloc_reference(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_reference((ctx),(ptr)) |
||
82 | #define talloc_move(ctx, ptr) (_TALLOC_TYPEOF(*(ptr)))_talloc_move((ctx),(void *)(ptr)) |
||
83 | |||
84 | /* useful macros for creating type checked pointers */ |
||
85 | #define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) |
||
86 | #define talloc_size(ctx, size) talloc_named_const(ctx, size, __location__) |
||
87 | #define talloc_ptrtype(ctx, ptr) (_TALLOC_TYPEOF(ptr))talloc_size(ctx, sizeof(*(ptr))) |
||
88 | |||
89 | #define talloc_new(ctx) talloc_named_const(ctx, 0, "talloc_new: " __location__) |
||
90 | |||
91 | #define talloc_zero(ctx, type) (type *)_talloc_zero(ctx, sizeof(type), #type) |
||
92 | #define talloc_zero_size(ctx, size) _talloc_zero(ctx, size, __location__) |
||
93 | |||
94 | #define talloc_zero_array(ctx, type, count) (type *)_talloc_zero_array(ctx, sizeof(type), count, #type) |
||
95 | #define talloc_array(ctx, type, count) (type *)_talloc_array(ctx, sizeof(type), count, #type) |
||
96 | #define talloc_array_size(ctx, size, count) _talloc_array(ctx, size, count, __location__) |
||
97 | #define talloc_array_ptrtype(ctx, ptr, count) (_TALLOC_TYPEOF(ptr))talloc_array_size(ctx, sizeof(*(ptr)), count) |
||
98 | |||
99 | #define talloc_realloc(ctx, p, type, count) (type *)_talloc_realloc_array(ctx, p, sizeof(type), count, #type) |
||
100 | #define talloc_realloc_size(ctx, ptr, size) _talloc_realloc(ctx, ptr, size, __location__) |
||
101 | |||
102 | #define talloc_memdup(t, p, size) _talloc_memdup(t, p, size, __location__) |
||
103 | |||
104 | #define talloc_set_type(ptr, type) talloc_set_name_const(ptr, #type) |
||
105 | #define talloc_get_type(ptr, type) (type *)talloc_check_name(ptr, #type) |
||
106 | |||
107 | #define talloc_find_parent_bytype(ptr, type) (type *)talloc_find_parent_byname(ptr, #type) |
||
108 | |||
109 | #if TALLOC_DEPRECATED |
||
110 | #define talloc_zero_p(ctx, type) talloc_zero(ctx, type) |
||
111 | #define talloc_p(ctx, type) talloc(ctx, type) |
||
112 | #define talloc_array_p(ctx, type, count) talloc_array(ctx, type, count) |
||
113 | #define talloc_realloc_p(ctx, p, type, count) talloc_realloc(ctx, p, type, count) |
||
114 | #define talloc_destroy(ctx) talloc_free(ctx) |
||
115 | #endif |
||
116 | |||
117 | /* The following definitions come from talloc.c */ |
||
118 | void *_talloc(const void *context, size_t size); |
||
119 | void _talloc_set_destructor(const void *ptr, int (*destructor)(void *)); |
||
120 | int talloc_increase_ref_count(const void *ptr); |
||
121 | size_t talloc_reference_count(const void *ptr); |
||
122 | void *_talloc_reference(const void *context, const void *ptr); |
||
123 | int talloc_unlink(const void *context, void *ptr); |
||
124 | const char *talloc_set_name(const void *ptr, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); |
||
125 | void talloc_set_name_const(const void *ptr, const char *name); |
||
126 | void *talloc_named(const void *context, size_t size, |
||
127 | const char *fmt, ...) PRINTF_ATTRIBUTE(3,4); |
||
128 | void *talloc_named_const(const void *context, size_t size, const char *name); |
||
129 | const char *talloc_get_name(const void *ptr); |
||
130 | void *talloc_check_name(const void *ptr, const char *name); |
||
131 | void *talloc_parent(const void *ptr); |
||
132 | const char *talloc_parent_name(const void *ptr); |
||
133 | void *talloc_init(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2); |
||
134 | int talloc_free(void *ptr); |
||
135 | void talloc_free_children(void *ptr); |
||
136 | void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *name); |
||
137 | void *_talloc_steal(const void *new_ctx, const void *ptr); |
||
138 | void *_talloc_move(const void *new_ctx, const void *pptr); |
||
139 | size_t talloc_total_size(const void *ptr); |
||
140 | size_t talloc_total_blocks(const void *ptr); |
||
141 | void talloc_report_depth_cb(const void *ptr, int depth, int max_depth, |
||
142 | void (*callback)(const void *ptr, |
||
143 | int depth, int max_depth, |
||
144 | int is_ref, |
||
145 | void *private_data), |
||
146 | void *private_data); |
||
147 | void talloc_report_depth_file(const void *ptr, int depth, int max_depth, FILE *f); |
||
148 | void talloc_report_full(const void *ptr, FILE *f); |
||
149 | void talloc_report(const void *ptr, FILE *f); |
||
150 | void talloc_enable_null_tracking(void); |
||
151 | void talloc_disable_null_tracking(void); |
||
152 | void talloc_enable_leak_report(void); |
||
153 | void talloc_enable_leak_report_full(void); |
||
154 | void *_talloc_zero(const void *ctx, size_t size, const char *name); |
||
155 | void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name); |
||
156 | char *talloc_strdup(const void *t, const char *p); |
||
157 | char *talloc_strndup(const void *t, const char *p, size_t n); |
||
158 | char *talloc_append_string(const void *t, char *orig, const char *append); |
||
159 | char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); |
||
160 | char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); |
||
161 | char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); |
||
162 | char *talloc_asprintf_append(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); |
||
163 | void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name); |
||
164 | void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name); |
||
165 | void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name); |
||
166 | void *talloc_realloc_fn(const void *context, void *ptr, size_t size); |
||
167 | void *talloc_autofree_context(void); |
||
168 | size_t talloc_get_size(const void *ctx); |
||
169 | void *talloc_find_parent_byname(const void *ctx, const char *name); |
||
170 | void talloc_show_parents(const void *context, FILE *file); |
||
171 | int talloc_is_parent(const void *context, const void *ptr); |
||
172 | |||
173 | #endif |