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;
83 for (tc=t->list; tc; tc=tc->next) {
85 ptr = realloc(ptr, size);
87 t->total_alloc_size += (size - tc->size);
97 /* destroy a whole pool */
98 void talloc_destroy_pool(TALLOC_CTX *t)
100 struct talloc_chunk *c;
107 if (t->list->ptr) free(t->list->ptr);
113 t->total_alloc_size = 0;
116 /* destroy a whole pool including the context */
117 void talloc_destroy(TALLOC_CTX *t)
121 talloc_destroy_pool(t);
122 memset(t, 0, sizeof(*t));
126 /* return the current total size of the pool. */
127 size_t talloc_pool_size(TALLOC_CTX *t)
129 return t->total_alloc_size;
132 /* talloc and zero memory. */
133 void *talloc_zero(TALLOC_CTX *t, size_t size)
135 void *p = talloc(t, size);
138 memset(p, '\0', size);
143 /* memdup with a talloc. */
144 void *talloc_memdup(TALLOC_CTX *t, void *p, size_t size)
146 void *newp = talloc(t,size);
151 memcpy(newp, p, size);
156 /* strdup with a talloc */
157 char *talloc_strdup(TALLOC_CTX *t, char *p)
159 return talloc_memdup(t, p, strlen(p) + 1);