From 5e9f5591873fc5c5b5c8dbb0e29a080b8afe9966 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 5 Jan 2000 06:36:36 +0000 Subject: implemented talloc() as described on samba-technical. This fixes the lp_string() bug properly. we still need to add lp_talloc_free() calls in all the main event loops, I've only put it in smbd and nmbd thus far. (This used to be commit aa7f81552540f5dca2c146f5edd805611d5b390f) --- source3/Makefile.in | 2 +- source3/include/includes.h | 1 + source3/include/proto.h | 7 ++++ source3/include/talloc.h | 32 ++++++++++++++++ source3/lib/talloc.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++ source3/nmbd/nmbd.c | 3 ++ source3/param/loadparm.c | 66 +++++++++++++------------------ source3/script/mkproto.awk | 2 +- source3/smbd/process.c | 3 ++ 9 files changed, 171 insertions(+), 41 deletions(-) create mode 100644 source3/include/talloc.h create mode 100644 source3/lib/talloc.c (limited to 'source3') diff --git a/source3/Makefile.in b/source3/Makefile.in index acf7c02c21..6201e63c88 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -99,7 +99,7 @@ LIB_OBJ = lib/charcnv.o lib/charset.o lib/debug.o lib/fault.o \ lib/util_array.o lib/util_str.o lib/util_sid.o \ lib/util_unistr.o lib/util_file.o \ lib/util.o lib/util_sock.o lib/util_sec.o smbd/ssl.o lib/fnmatch.o \ - tdb/tdb.o + tdb/tdb.o lib/talloc.o UBIQX_OBJ = ubiqx/ubi_BinTree.o ubiqx/ubi_Cache.o ubiqx/ubi_SplayTree.o \ ubiqx/ubi_dLinkList.o ubiqx/ubi_sLinkList.o ubiqx/debugparse.o diff --git a/source3/include/includes.h b/source3/include/includes.h index 3e9010bf54..7986c12c91 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -611,6 +611,7 @@ extern int errno; #include "ubi_dLinkList.h" #include "dlinklist.h" #include "../tdb/tdb.h" +#include "talloc.h" #include "interfaces.h" #ifdef HAVE_FNMATCH diff --git a/source3/include/proto.h b/source3/include/proto.h index bb1d5477df..0222e890d2 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -223,6 +223,12 @@ smb_ucs2_t *wsys_getwd(smb_ucs2_t *s); int wsys_chown(const smb_ucs2_t *wfname, uid_t uid, gid_t gid); int wsys_chroot(const smb_ucs2_t *wfname); +/*The following definitions come from lib/talloc.c */ + +TALLOC_CTX *talloc_init(void); +void *talloc(TALLOC_CTX *t, size_t size); +void talloc_destroy(TALLOC_CTX *t); + /*The following definitions come from lib/time.c */ void GetTimeOfDay(struct timeval *tval); @@ -1111,6 +1117,7 @@ void expire_workgroups_and_servers(time_t t); /*The following definitions come from param/loadparm.c */ +void lp_talloc_free(void); char *lp_logfile(void); char *lp_smbrun(void); char *lp_configfile(void); diff --git a/source3/include/talloc.h b/source3/include/talloc.h new file mode 100644 index 0000000000..df68166a5e --- /dev/null +++ b/source3/include/talloc.h @@ -0,0 +1,32 @@ +/* + Unix SMB/Netbios implementation. + Version 3.0 + Samba temporary memory allocation functions + Copyright (C) Andrew Tridgell 2000 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +struct talloc_chunk { + struct talloc_chunk *next; + void *ptr; + size_t alloc_size; + size_t total_size; +}; + +typedef struct { + struct talloc_chunk *list; +} TALLOC_CTX; + diff --git a/source3/lib/talloc.c b/source3/lib/talloc.c new file mode 100644 index 0000000000..518237cde8 --- /dev/null +++ b/source3/lib/talloc.c @@ -0,0 +1,96 @@ +/* + Unix SMB/Netbios implementation. + Version 3.0 + Samba temporary memory allocation functions + Copyright (C) Andrew Tridgell 2000 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* this is a very simple temporary memory allocator. To use it do the following: + + 1) when you first want to allocate a pool of meomry use + talloc_init() and save the resulting context pointer somewhere + + 2) to allocate memory use talloc() + + 3) when _all_ of the memory allocated using this context is no longer needed + use talloc_destroy() + + talloc does not zero the memory. It guarantees memory of a + TALLOC_ALIGN alignment +*/ + +#include "includes.h" + +#define TALLOC_ALIGN 32 +#define TALLOC_CHUNK_SIZE (0x2000) + +/* initialissa talloc context. */ +TALLOC_CTX *talloc_init(void) +{ + TALLOC_CTX *t; + + t = (TALLOC_CTX *)malloc(sizeof(*t)); + if (!t) return NULL; + + t->list = NULL; + + return t; +} + +/* allocate a bit of memory from the specified pool */ +void *talloc(TALLOC_CTX *t, size_t size) +{ + void *p; + + size = (size + TALLOC_ALIGN) & (~TALLOC_ALIGN-1); + + if (!t->list || (t->list->total_size - t->list->alloc_size) < size) { + struct talloc_chunk *c; + size_t asize = (size + TALLOC_CHUNK_SIZE) & ~(TALLOC_CHUNK_SIZE-1); + + c = (struct talloc_chunk *)malloc(sizeof(*c)); + if (!c) return NULL; + c->next = t->list; + c->ptr = (void *)malloc(asize); + if (!c->ptr) { + free(c); + return NULL; + } + c->alloc_size = 0; + c->total_size = asize; + t->list = c; + } + + p = t->list->ptr + t->list->alloc_size; + t->list->alloc_size += size; + return p; +} + +/* destroy a whole pool */ +void talloc_destroy(TALLOC_CTX *t) +{ + struct talloc_chunk *c; + + while (t->list) { + c = t->list->next; + free(t->list->ptr); + free(t->list); + t->list = c; + } + + free(t); +} diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c index 751aede394..5bb3d7fc00 100644 --- a/source3/nmbd/nmbd.c +++ b/source3/nmbd/nmbd.c @@ -475,6 +475,9 @@ static void process(void) /* check for new network interfaces */ reload_interfaces(t); + + /* free up temp memory */ + lp_talloc_free(); } } /* process */ diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c index 6d82554130..b76af54609 100644 --- a/source3/param/loadparm.c +++ b/source3/param/loadparm.c @@ -1092,55 +1092,43 @@ static void init_locals(void) #define NUMBER_OF_STATIC_STRING_BUFS 20 +static TALLOC_CTX *lp_talloc; + /******************************************************************* a -convenience routine to grab string parameters into a rotating buffer, +free up temporary memory - called from the main loop +********************************************************************/ +void lp_talloc_free(void) +{ + if (!lp_talloc) return; + talloc_destroy(lp_talloc); + lp_talloc = NULL; +} + +/******************************************************************* +convenience routine to grab string parameters into temporary memory and run standard_sub_basic on them. The buffers can be written to by callers without affecting the source string. ********************************************************************/ static char *lp_string(const char *s) { - static char *bufs[NUMBER_OF_STATIC_STRING_BUFS]; - static size_t buflen[NUMBER_OF_STATIC_STRING_BUFS]; - static int next = -1; - char *ret; - int i; - size_t len = s?strlen(s):0; - - if (next == -1) { - /* initialisation */ - for (i=0;i