Subversion Repositories Kolibri OS

Rev

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