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 /* initialissa 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
;
59 /* debugging value used to track down
60 memory problems. BAD_PTR is defined
69 tc
= malloc(sizeof(*tc
));
79 t
->total_alloc_size
+= size
;
84 /* a talloc version of realloc */
85 void *talloc_realloc(TALLOC_CTX
*t
, void *ptr
, size_t size
)
87 struct talloc_chunk
*tc
;
89 for (tc
=t
->list
; tc
; tc
=tc
->next
) {
91 ptr
= realloc(ptr
, size
);
93 t
->total_alloc_size
+= (size
- tc
->size
);
103 /* destroy a whole pool */
104 void talloc_destroy_pool(TALLOC_CTX
*t
)
106 struct talloc_chunk
*c
;
113 if (t
->list
->ptr
) free(t
->list
->ptr
);
119 t
->total_alloc_size
= 0;
122 /* destroy a whole pool including the context */
123 void talloc_destroy(TALLOC_CTX
*t
)
127 talloc_destroy_pool(t
);
128 memset(t
, 0, sizeof(*t
));
132 /* return the current total size of the pool. */
133 size_t talloc_pool_size(TALLOC_CTX
*t
)
135 return t
->total_alloc_size
;
138 /* talloc and zero memory. */
139 void *talloc_zero(TALLOC_CTX
*t
, size_t size
)
141 void *p
= talloc(t
, size
);
144 memset(p
, '\0', size
);
149 /* memdup with a talloc. */
150 void *talloc_memdup(TALLOC_CTX
*t
, void *p
, size_t size
)
152 void *newp
= talloc(t
,size
);
157 memcpy(newp
, p
, size
);
162 /* strdup with a talloc */
163 char *talloc_strdup(TALLOC_CTX
*t
, char *p
)
165 return talloc_memdup(t
, p
, strlen(p
) + 1);