2 Unix SMB/Netbios implementation.
4 Samba temporary memory allocation functions
5 Copyright (C) Andrew Tridgell 2000
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 /* this is a very simple temporary memory allocator. To use it do the following:
24 1) when you first want to allocate a pool of meomry use
25 talloc_init() and save the resulting context pointer somewhere
27 2) to allocate memory use talloc()
29 3) when _all_ of the memory allocated using this context is no longer needed
32 talloc does not zero the memory. It guarantees memory of a
33 TALLOC_ALIGN alignment
38 /* initialise talloc context. */
39 TALLOC_CTX
*talloc_init(void)
43 t
= (TALLOC_CTX
*)malloc(sizeof(*t
));
47 t
->total_alloc_size
= 0;
52 /* allocate a bit of memory from the specified pool */
53 void *talloc(TALLOC_CTX
*t
, size_t size
)
56 struct talloc_chunk
*tc
;
58 if (size
== 0) return NULL
;
63 tc
= malloc(sizeof(*tc
));
73 t
->total_alloc_size
+= size
;
78 /* a talloc version of realloc */
79 void *talloc_realloc(TALLOC_CTX
*t
, void *ptr
, size_t size
)
81 struct talloc_chunk
*tc
;
84 /* size zero is equivalent to free() */
88 /* realloc(NULL) is equavalent to malloc() */
90 return talloc(t
, size
);
92 for (tc
=t
->list
; tc
; tc
=tc
->next
) {
94 new_ptr
= Realloc(ptr
, size
);
96 t
->total_alloc_size
+= (size
- tc
->size
);
106 /* destroy a whole pool */
107 void talloc_destroy_pool(TALLOC_CTX
*t
)
109 struct talloc_chunk
*c
;
116 SAFE_FREE(t
->list
->ptr
);
122 t
->total_alloc_size
= 0;
125 /* destroy a whole pool including the context */
126 void talloc_destroy(TALLOC_CTX
*t
)
130 talloc_destroy_pool(t
);
131 memset(t
, 0, sizeof(*t
));
135 /* return the current total size of the pool. */
136 size_t talloc_pool_size(TALLOC_CTX
*t
)
138 return t
->total_alloc_size
;
141 /* talloc and zero memory. */
142 void *talloc_zero(TALLOC_CTX
*t
, size_t size
)
144 void *p
= talloc(t
, size
);
147 memset(p
, '\0', size
);
152 /* memdup with a talloc. */
153 void *talloc_memdup(TALLOC_CTX
*t
, void *p
, size_t size
)
155 void *newp
= talloc(t
,size
);
160 memcpy(newp
, p
, size
);
165 /* strdup with a talloc */
166 char *talloc_strdup(TALLOC_CTX
*t
, char *p
)
168 return talloc_memdup(t
, p
, strlen(p
) + 1);