From 65f96eba32b93ced0717c2639007bba59da55fa4 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 2 Jan 2005 07:47:34 +0000 Subject: r4473: - moved talloc into its own lib/talloc/ area - added gcov flags to Makefile.talloc - expanded talloc testsuite to add a test for realloc with a child ptr - fixed a bug in talloc_realloc() with realloc of a ptr that has child ptrs (This used to be commit 98b5f73c1ba34d7576c5995069b485c1c5ede324) --- source4/lib/talloc/Makefile.talloc | 16 + source4/lib/talloc/config.m4 | 3 + source4/lib/talloc/config.mk | 23 + source4/lib/talloc/talloc.c | 1006 +++++++++++++++++++++++++++++++++++ source4/lib/talloc/talloc.h | 96 ++++ source4/lib/talloc/talloc_guide.txt | 492 +++++++++++++++++ source4/lib/talloc/testsuite.c | 785 +++++++++++++++++++++++++++ 7 files changed, 2421 insertions(+) create mode 100644 source4/lib/talloc/Makefile.talloc create mode 100644 source4/lib/talloc/config.m4 create mode 100644 source4/lib/talloc/config.mk create mode 100644 source4/lib/talloc/talloc.c create mode 100644 source4/lib/talloc/talloc.h create mode 100644 source4/lib/talloc/talloc_guide.txt create mode 100644 source4/lib/talloc/testsuite.c (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.talloc b/source4/lib/talloc/Makefile.talloc new file mode 100644 index 0000000000..88cb0e7159 --- /dev/null +++ b/source4/lib/talloc/Makefile.talloc @@ -0,0 +1,16 @@ +OPT = -g -ftest-coverage -fprofile-arcs +LIBS = -lgcov +#OPT = -g + +CFLAGS = $(OPT) -Wall + +all: testsuite + +testsuite: talloc.o testsuite.o + $(CC) $(CFLAGS) -o testsuite testsuite.o talloc.o $(LIBS) + +clean: + rm -f *~ *.o testsuite *.gc?? + +gcov: + gcov talloc.c diff --git a/source4/lib/talloc/config.m4 b/source4/lib/talloc/config.m4 new file mode 100644 index 0000000000..298c6691b9 --- /dev/null +++ b/source4/lib/talloc/config.m4 @@ -0,0 +1,3 @@ +if test x"$experimental" = x"yes"; then + SMB_LIBRARY_ENABLE(libtalloc,YES) +fi diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk new file mode 100644 index 0000000000..2f38fe04ed --- /dev/null +++ b/source4/lib/talloc/config.mk @@ -0,0 +1,23 @@ +################################################ +# Start SUBSYSTEM LIBTALLOC +[SUBSYSTEM::LIBTALLOC] +INIT_OBJ_FILES = \ + lib/talloc/talloc.o +REQUIRED_SUBSYSTEMS = \ + LIBREPLACE +# +# End SUBSYSTEM LIBTALLOC +################################################ + +################################################ +# Start LIBRARY LIBTALLOC +[LIBRARY::libtalloc] +MAJOR_VERSION = 0 +MINOR_VERSION = 0 +RELEASE_VERSION = 1 +REQUIRED_SUBSYSTEMS = \ + LIBTALLOC +# +# End LIBRARY LIBTALLOC +################################################ + diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c new file mode 100644 index 0000000000..4666e28288 --- /dev/null +++ b/source4/lib/talloc/talloc.c @@ -0,0 +1,1006 @@ +/* + Samba Unix SMB/CIFS implementation. + + Samba trivial allocation library - new interface + + NOTE: Please read talloc_guide.txt for full documentation + + Copyright (C) Andrew Tridgell 2004 + + 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. +*/ + +/* + inspired by http://swapped.cc/halloc/ +*/ + + +#ifdef _SAMBA_BUILD_ +#include "includes.h" +#else +#include +#include +#include +#include +#include +#include "talloc.h" +#endif + +/* use this to force every realloc to change the pointer, to stress test + code that might not cope */ +#define ALWAYS_REALLOC 0 + + +#define MAX_TALLOC_SIZE 0x10000000 +#define TALLOC_MAGIC 0xe814ec4f +#define TALLOC_MAGIC_FREE 0x7faebef3 +#define TALLOC_MAGIC_REFERENCE ((const char *)1) + +/* by default we abort when given a bad pointer (such as when talloc_free() is called + on a pointer that came from malloc() */ +#ifndef TALLOC_ABORT +#define TALLOC_ABORT(reason) abort() +#endif + +#ifndef discard_const_p +#if defined(__intptr_t_defined) || defined(HAVE_INTPTR_T) +# define discard_const_p(type, ptr) ((type *)((intptr_t)(ptr))) +#else +# define discard_const_p(type, ptr) ((type *)(ptr)) +#endif +#endif + +/* this null_context is only used if talloc_enable_leak_report() or + talloc_enable_leak_report_full() is called, otherwise it remains + NULL +*/ +static const void *null_context; + + +struct talloc_reference_handle { + struct talloc_reference_handle *next, *prev; + void *ptr; +}; + +typedef int (*talloc_destructor_t)(void *); + +struct talloc_chunk { + struct talloc_chunk *next, *prev; + struct talloc_chunk *parent, *child; + struct talloc_reference_handle *refs; + size_t size; + unsigned magic; + talloc_destructor_t destructor; + const char *name; +}; + +/* panic if we get a bad magic value */ +static struct talloc_chunk *talloc_chunk_from_ptr(const void *ptr) +{ + struct talloc_chunk *tc = discard_const_p(struct talloc_chunk, ptr)-1; + if (tc->magic != TALLOC_MAGIC) { + if (tc->magic == TALLOC_MAGIC_FREE) { + TALLOC_ABORT("Bad talloc magic value - double free"); + } else { + TALLOC_ABORT("Bad talloc magic value - unknown value"); + } + } + + return tc; +} + +/* hook into the front of the list */ +#define _TLIST_ADD(list, p) \ +do { \ + if (!(list)) { \ + (list) = (p); \ + (p)->next = (p)->prev = NULL; \ + } else { \ + (list)->prev = (p); \ + (p)->next = (list); \ + (p)->prev = NULL; \ + (list) = (p); \ + }\ +} while (0) + +/* remove an element from a list - element doesn't have to be in list. */ +#define _TLIST_REMOVE(list, p) \ +do { \ + if ((p) == (list)) { \ + (list) = (p)->next; \ + if (list) (list)->prev = NULL; \ + } else { \ + if ((p)->prev) (p)->prev->next = (p)->next; \ + if ((p)->next) (p)->next->prev = (p)->prev; \ + } \ + if ((p) && ((p) != (list))) (p)->next = (p)->prev = NULL; \ +} while (0) + + +/* + return the parent chunk of a pointer +*/ +static struct talloc_chunk *talloc_parent_chunk(const void *ptr) +{ + struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); + while (tc->prev) tc=tc->prev; + return tc->parent; +} + +/* + Allocate a bit of memory as a child of an existing pointer +*/ +void *_talloc(const void *context, size_t size) +{ + struct talloc_chunk *tc; + + if (context == NULL) { + context = null_context; + } + + if (size >= MAX_TALLOC_SIZE) { + return NULL; + } + + tc = malloc(sizeof(*tc)+size); + if (tc == NULL) return NULL; + + tc->size = size; + tc->magic = TALLOC_MAGIC; + tc->destructor = NULL; + tc->child = NULL; + tc->name = NULL; + tc->refs = NULL; + + if (context) { + struct talloc_chunk *parent = talloc_chunk_from_ptr(context); + + tc->parent = parent; + + if (parent->child) { + parent->child->parent = NULL; + } + + _TLIST_ADD(parent->child, tc); + } else { + tc->next = tc->prev = tc->parent = NULL; + } + + return (void *)(tc+1); +} + + +/* + setup a destructor to be called on free of a pointer + the destructor should return 0 on success, or -1 on failure. + if the destructor fails then the free is failed, and the memory can + be continued to be used +*/ +void talloc_set_destructor(const void *ptr, int (*destructor)(void *)) +{ + struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); + tc->destructor = destructor; +} + +/* + increase the reference count on a piece of memory. +*/ +void talloc_increase_ref_count(const void *ptr) +{ + talloc_reference(null_context, ptr); +} + +/* + helper for talloc_reference() +*/ +static int talloc_reference_destructor(void *ptr) +{ + struct talloc_reference_handle *handle = ptr; + struct talloc_chunk *tc1 = talloc_chunk_from_ptr(ptr); + struct talloc_chunk *tc2 = talloc_chunk_from_ptr(handle->ptr); + if (tc1->destructor != (talloc_destructor_t)-1) { + tc1->destructor = NULL; + } + _TLIST_REMOVE(tc2->refs, handle); + talloc_free(handle); + return 0; +} + +/* + make a secondary reference to a pointer, hanging off the given context. + the pointer remains valid until both the original caller and this given + context are freed. + + the major use for this is when two different structures need to reference the + same underlying data, and you want to be able to free the two instances separately, + and in either order +*/ +void *talloc_reference(const void *context, const void *ptr) +{ + struct talloc_chunk *tc; + struct talloc_reference_handle *handle; + if (ptr == NULL) return NULL; + + tc = talloc_chunk_from_ptr(ptr); + handle = talloc_named_const(context, sizeof(*handle), TALLOC_MAGIC_REFERENCE); + + if (handle == NULL) return NULL; + + /* note that we hang the destructor off the handle, not the + main context as that allows the caller to still setup their + own destructor on the context if they want to */ + talloc_set_destructor(handle, talloc_reference_destructor); + handle->ptr = discard_const_p(void, ptr); + _TLIST_ADD(tc->refs, handle); + return handle->ptr; +} + +/* + remove a secondary reference to a pointer. This undo's what + talloc_reference() has done. The context and pointer arguments + must match those given to a talloc_reference() +*/ +static int talloc_unreference(const void *context, const void *ptr) +{ + struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); + struct talloc_reference_handle *h; + + if (context == NULL) { + context = null_context; + } + + for (h=tc->refs;h;h=h->next) { + struct talloc_chunk *p = talloc_parent_chunk(h); + if ((p==NULL && context==NULL) || p+1 == context) break; + } + if (h == NULL) { + return -1; + } + + talloc_set_destructor(h, NULL); + _TLIST_REMOVE(tc->refs, h); + talloc_free(h); + return 0; +} + +/* + remove a specific parent context from a pointer. This is a more + controlled varient of talloc_free() +*/ +int talloc_unlink(const void *context, void *ptr) +{ + struct talloc_chunk *tc_p, *new_p; + void *new_parent; + + if (ptr == NULL) { + return -1; + } + + if (context == NULL) { + context = null_context; + } + + if (talloc_unreference(context, ptr) == 0) { + return 0; + } + + if (context == NULL) { + if (talloc_parent_chunk(ptr) != NULL) { + return -1; + } + } else { + if (talloc_chunk_from_ptr(context) != talloc_parent_chunk(ptr)) { + return -1; + } + } + + tc_p = talloc_chunk_from_ptr(ptr); + + if (tc_p->refs == NULL) { + return talloc_free(ptr); + } + + new_p = talloc_parent_chunk(tc_p->refs); + if (new_p) { + new_parent = new_p+1; + } else { + new_parent = NULL; + } + + if (talloc_unreference(new_parent, ptr) != 0) { + return -1; + } + + talloc_steal(new_parent, ptr); + + return 0; +} + +/* + add a name to an existing pointer - va_list version +*/ +static void talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); + +static void talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) +{ + struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); + tc->name = talloc_vasprintf(ptr, fmt, ap); + if (tc->name) { + talloc_set_name_const(tc->name, ".name"); + } +} + +/* + add a name to an existing pointer +*/ +void talloc_set_name(const void *ptr, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + talloc_set_name_v(ptr, fmt, ap); + va_end(ap); +} + +/* + more efficient way to add a name to a pointer - the name must point to a + true string constant +*/ +void talloc_set_name_const(const void *ptr, const char *name) +{ + struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); + tc->name = name; +} + +/* + create a named talloc pointer. Any talloc pointer can be named, and + talloc_named() operates just like talloc() except that it allows you + to name the pointer. +*/ +void *talloc_named(const void *context, size_t size, const char *fmt, ...) +{ + va_list ap; + void *ptr; + + ptr = _talloc(context, size); + if (ptr == NULL) return NULL; + + va_start(ap, fmt); + talloc_set_name_v(ptr, fmt, ap); + va_end(ap); + + return ptr; +} + +/* + create a named talloc pointer. Any talloc pointer can be named, and + talloc_named() operates just like talloc() except that it allows you + to name the pointer. +*/ +void *talloc_named_const(const void *context, size_t size, const char *name) +{ + void *ptr; + + ptr = _talloc(context, size); + if (ptr == NULL) { + return NULL; + } + + talloc_set_name_const(ptr, name); + + return ptr; +} + +/* + return the name of a talloc ptr, or "UNNAMED" +*/ +const char *talloc_get_name(const void *ptr) +{ + struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); + if (tc->name == TALLOC_MAGIC_REFERENCE) { + return ".reference"; + } + if (tc->name) { + return tc->name; + } + return "UNNAMED"; +} + +/* + this is for compatibility with older versions of talloc +*/ +void *talloc_init(const char *fmt, ...) +{ + va_list ap; + void *ptr; + + ptr = _talloc(NULL, 0); + if (ptr == NULL) return NULL; + + va_start(ap, fmt); + talloc_set_name_v(ptr, fmt, ap); + va_end(ap); + + return ptr; +} + + +/* + free a talloc pointer. This also frees all child pointers of this + pointer recursively + + return 0 if the memory is actually freed, otherwise -1. The memory + will not be freed if the ref_count is > 1 or the destructor (if + any) returns non-zero +*/ +int talloc_free(void *ptr) +{ + struct talloc_chunk *tc; + + if (ptr == NULL) { + return -1; + } + + tc = talloc_chunk_from_ptr(ptr); + + if (tc->refs) { + talloc_reference_destructor(tc->refs); + return -1; + } + + if (tc->destructor) { + talloc_destructor_t d = tc->destructor; + if (d == (talloc_destructor_t)-1) { + return -1; + } + tc->destructor = (talloc_destructor_t)-1; + if (d(ptr) == -1) { + tc->destructor = d; + return -1; + } + tc->destructor = NULL; + } + + while (tc->child) { + /* we need to work out who will own an abandoned child + if it cannot be freed. In priority order, the first + choice is owner of any remaining reference to this + pointer, the second choice is our parent, and the + final choice is the null context. */ + void *child = tc->child+1; + const void *new_parent = null_context; + if (tc->child->refs) { + struct talloc_chunk *p = talloc_parent_chunk(tc->child->refs); + if (p) new_parent = p+1; + } + if (talloc_free(child) == -1) { + if (new_parent == null_context) { + struct talloc_chunk *p = talloc_parent_chunk(ptr); + if (p) new_parent = p+1; + } + talloc_steal(new_parent, child); + } + } + + if (tc->parent) { + _TLIST_REMOVE(tc->parent->child, tc); + if (tc->parent->child) { + tc->parent->child->parent = tc->parent; + } + } else { + if (tc->prev) tc->prev->next = tc->next; + if (tc->next) tc->next->prev = tc->prev; + } + + tc->magic = TALLOC_MAGIC_FREE; + + free(tc); + return 0; +} + + + +/* + A talloc version of realloc. The context argument is only used if + ptr is NULL +*/ +void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *name) +{ + struct talloc_chunk *tc; + void *new_ptr; + + /* size zero is equivalent to free() */ + if (size == 0) { + talloc_free(ptr); + return NULL; + } + + if (size >= MAX_TALLOC_SIZE) { + return NULL; + } + + /* realloc(NULL) is equavalent to malloc() */ + if (ptr == NULL) { + return talloc_named_const(context, size, name); + } + + tc = talloc_chunk_from_ptr(ptr); + + /* don't allow realloc on referenced pointers */ + if (tc->refs) { + return NULL; + } + + /* by resetting magic we catch users of the old memory */ + tc->magic = TALLOC_MAGIC_FREE; + +#if ALWAYS_REALLOC + new_ptr = malloc(size + sizeof(*tc)); + if (new_ptr) { + memcpy(new_ptr, tc, tc->size + sizeof(*tc)); + free(tc); + } +#else + new_ptr = realloc(tc, size + sizeof(*tc)); +#endif + if (!new_ptr) { + tc->magic = TALLOC_MAGIC; + return NULL; + } + + tc = new_ptr; + tc->magic = TALLOC_MAGIC; + if (tc->parent) { + tc->parent->child = new_ptr; + } + if (tc->child) { + tc->child->parent = new_ptr; + } + + if (tc->prev) { + tc->prev->next = tc; + } + if (tc->next) { + tc->next->prev = tc; + } + + tc->size = size; + talloc_set_name_const(tc+1, name); + + return (void *)(tc+1); +} + +/* + move a lump of memory from one talloc context to another return the + ptr on success, or NULL if it could not be transferred +*/ +void *talloc_steal(const void *new_ctx, const void *ptr) +{ + struct talloc_chunk *tc, *new_tc; + + if (!ptr) { + return NULL; + } + + if (new_ctx == NULL) { + new_ctx = null_context; + } + + tc = talloc_chunk_from_ptr(ptr); + + if (new_ctx == NULL) { + if (tc->parent) { + _TLIST_REMOVE(tc->parent->child, tc); + if (tc->parent->child) { + tc->parent->child->parent = tc->parent; + } + } else { + if (tc->prev) tc->prev->next = tc->next; + if (tc->next) tc->next->prev = tc->prev; + } + + tc->parent = tc->next = tc->prev = NULL; + return discard_const_p(void, ptr); + } + + new_tc = talloc_chunk_from_ptr(new_ctx); + + if (tc == new_tc) { + return discard_const_p(void, ptr); + } + + if (tc->parent) { + _TLIST_REMOVE(tc->parent->child, tc); + if (tc->parent->child) { + tc->parent->child->parent = tc->parent; + } + } else { + if (tc->prev) tc->prev->next = tc->next; + if (tc->next) tc->next->prev = tc->prev; + } + + tc->parent = new_tc; + if (new_tc->child) new_tc->child->parent = NULL; + _TLIST_ADD(new_tc->child, tc); + + return discard_const_p(void, ptr); +} + +/* + return the total size of a talloc pool (subtree) +*/ +off_t talloc_total_size(const void *ptr) +{ + off_t total = 0; + struct talloc_chunk *c, *tc; + + if (ptr == NULL) { + ptr = null_context; + } + if (ptr == NULL) { + return 0; + } + + tc = talloc_chunk_from_ptr(ptr); + + total = tc->size; + for (c=tc->child;c;c=c->next) { + total += talloc_total_size(c+1); + } + return total; +} + +/* + return the total number of blocks in a talloc pool (subtree) +*/ +off_t talloc_total_blocks(const void *ptr) +{ + off_t total = 0; + struct talloc_chunk *c, *tc = talloc_chunk_from_ptr(ptr); + + total++; + for (c=tc->child;c;c=c->next) { + total += talloc_total_blocks(c+1); + } + return total; +} + +/* + return the number of external references to a pointer +*/ +static int talloc_reference_count(const void *ptr) +{ + struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); + struct talloc_reference_handle *h; + int ret = 0; + + for (h=tc->refs;h;h=h->next) { + ret++; + } + return ret; +} + +/* + report on memory usage by all children of a pointer, giving a full tree view +*/ +static void talloc_report_depth(const void *ptr, FILE *f, int depth) +{ + struct talloc_chunk *c, *tc = talloc_chunk_from_ptr(ptr); + + for (c=tc->child;c;c=c->next) { + if (c->name == TALLOC_MAGIC_REFERENCE) { + struct talloc_reference_handle *handle = (void *)(c+1); + const char *name2 = talloc_get_name(handle->ptr); + fprintf(f, "%*sreference to: %s\n", depth*4, "", name2); + } else { + const char *name = talloc_get_name(c+1); + fprintf(f, "%*s%-30s contains %6lu bytes in %3lu blocks (ref %d)\n", + depth*4, "", + name, + (unsigned long)talloc_total_size(c+1), + (unsigned long)talloc_total_blocks(c+1), + talloc_reference_count(c+1)); + talloc_report_depth(c+1, f, depth+1); + } + } + +} + +/* + report on memory usage by all children of a pointer, giving a full tree view +*/ +void talloc_report_full(const void *ptr, FILE *f) +{ + if (ptr == NULL) { + ptr = null_context; + } + if (ptr == NULL) return; + + fprintf(f,"full talloc report on '%s' (total %lu bytes in %lu blocks)\n", + talloc_get_name(ptr), + (unsigned long)talloc_total_size(ptr), + (unsigned long)talloc_total_blocks(ptr)); + + talloc_report_depth(ptr, f, 1); +} + +/* + report on memory usage by all children of a pointer +*/ +void talloc_report(const void *ptr, FILE *f) +{ + struct talloc_chunk *c, *tc; + + if (ptr == NULL) { + ptr = null_context; + } + if (ptr == NULL) return; + + fprintf(f,"talloc report on '%s' (total %lu bytes in %lu blocks)\n", + talloc_get_name(ptr), + (unsigned long)talloc_total_size(ptr), + (unsigned long)talloc_total_blocks(ptr)); + + tc = talloc_chunk_from_ptr(ptr); + + for (c=tc->child;c;c=c->next) { + fprintf(f, "\t%-30s contains %6lu bytes in %3lu blocks\n", + talloc_get_name(c+1), + (unsigned long)talloc_total_size(c+1), + (unsigned long)talloc_total_blocks(c+1)); + } + +} + +/* + report on any memory hanging off the null context +*/ +static void talloc_report_null(void) +{ + if (talloc_total_size(null_context) != 0) { + talloc_report(null_context, stderr); + } +} + +/* + report on any memory hanging off the null context +*/ +static void talloc_report_null_full(void) +{ + if (talloc_total_size(null_context) != 0) { + talloc_report_full(null_context, stderr); + } +} + +/* + enable leak reporting on exit +*/ +void talloc_enable_leak_report(void) +{ + null_context = talloc_named_const(NULL, 0, "null_context"); + atexit(talloc_report_null); +} + +/* + enable full leak reporting on exit +*/ +void talloc_enable_leak_report_full(void) +{ + null_context = talloc_named_const(NULL, 0, "null_context"); + atexit(talloc_report_null_full); +} + +/* + talloc and zero memory. +*/ +void *_talloc_zero(const void *ctx, size_t size, const char *name) +{ + void *p = talloc_named_const(ctx, size, name); + + if (p) { + memset(p, '\0', size); + } + + return p; +} + + +/* + memdup with a talloc. +*/ +void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name) +{ + void *newp = talloc_named_const(t, size, name); + + if (newp) { + memcpy(newp, p, size); + } + + return newp; +} + +/* + strdup with a talloc +*/ +char *talloc_strdup(const void *t, const char *p) +{ + char *ret; + if (!p) { + return NULL; + } + ret = talloc_memdup(t, p, strlen(p) + 1); + if (ret) { + talloc_set_name_const(ret, ret); + } + return ret; +} + +/* + strndup with a talloc +*/ +char *talloc_strndup(const void *t, const char *p, size_t n) +{ + size_t len; + char *ret; + + for (len=0; p[len] && len= MAX_TALLOC_SIZE/el_size) { + return NULL; + } + return talloc_named_const(ctx, el_size * count, name); +} + +/* + alloc an zero array, checking for integer overflow in the array size +*/ +void *talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name) +{ + if (count >= MAX_TALLOC_SIZE/el_size) { + return NULL; + } + return _talloc_zero(ctx, el_size * count, name); +} + + +/* + realloc an array, checking for integer overflow in the array size +*/ +void *talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name) +{ + if (count >= MAX_TALLOC_SIZE/el_size) { + return NULL; + } + ptr = talloc_realloc(ctx, ptr, el_size * count); + if (ptr) { + talloc_set_name_const(ptr, name); + } + return ptr; +} + +/* + a function version of talloc_realloc(), so it can be passed as a function pointer + to libraries that want a realloc function (a realloc function encapsulates + all the basic capabilities of an allocation library, which is why this is useful) +*/ +void *talloc_realloc_fn(const void *context, void *ptr, size_t size) +{ + return _talloc_realloc(context, ptr, size, NULL); +} diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h new file mode 100644 index 0000000000..6ebba447aa --- /dev/null +++ b/source4/lib/talloc/talloc.h @@ -0,0 +1,96 @@ +#ifndef _TALLOC_H_ +#define _TALLOC_H_ +/* + Unix SMB/CIFS implementation. + Samba temporary memory allocation functions + + Copyright (C) Andrew Tridgell 2004 + + 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 only needed for compatibility with the old talloc */ +typedef void TALLOC_CTX; + +/* + this uses a little trick to allow __LINE__ to be stringified +*/ +#define _STRING_LINE_(s) #s +#define _STRING_LINE2_(s) _STRING_LINE_(s) +#define __LINESTR__ _STRING_LINE2_(__LINE__) +#define __location__ __FILE__ ":" __LINESTR__ + +/* useful macros for creating type checked pointers */ +#define talloc(ctx, size) talloc_named_const(ctx, size, __location__) +#define talloc_zero(ctx, size) _talloc_zero(ctx, size, __location__) +#define talloc_realloc(ctx, ptr, size) _talloc_realloc(ctx, ptr, size, __location__) +#define talloc_p(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) +#define talloc_zero_p(ctx, type) (type *)_talloc_zero(ctx, sizeof(type), #type) +#define talloc_zero_array_p(ctx, type, count) (type *)talloc_zero_array(ctx, sizeof(type), count, __location__) +#define talloc_array_p(ctx, type, count) (type *)talloc_array(ctx, sizeof(type), count, __location__) +#define talloc_realloc_p(ctx, p, type, count) (type *)talloc_realloc_array(ctx, p, sizeof(type), count, __location__) +#define talloc_memdup(t, p, size) _talloc_memdup(t, p, size, __location__) + +#define talloc_destroy(ctx) talloc_free(ctx) + +#define malloc_p(type) (type *)malloc(sizeof(type)) +#define malloc_array_p(type, count) (type *)realloc_array(NULL, sizeof(type), count) +#define realloc_p(p, type, count) (type *)realloc_array(p, sizeof(type), count) + +#define data_blob(ptr, size) data_blob_named(ptr, size, "DATA_BLOB: "__location__) +#define data_blob_talloc(ctx, ptr, size) data_blob_talloc_named(ctx, ptr, size, "DATA_BLOB: "__location__) + +#ifndef PRINTF_ATTRIBUTE +#define PRINTF_ATTRIBUTE(a1, a2) +#endif + + +/* The following definitions come from lib/talloc.c */ +void *_talloc(const void *context, size_t size); +void talloc_set_destructor(const void *ptr, int (*destructor)(void *)); +void talloc_increase_ref_count(const void *ptr); +void *talloc_reference(const void *context, const void *ptr); +int talloc_unlink(const void *context, void *ptr); +void talloc_set_name(const void *ptr, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); +void talloc_set_name_const(const void *ptr, const char *name); +void *talloc_named(const void *context, size_t size, + const char *fmt, ...) PRINTF_ATTRIBUTE(3,4); +void *talloc_named_const(const void *context, size_t size, const char *name); +const char *talloc_get_name(const void *ptr); +void *talloc_init(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2); +int talloc_free(void *ptr); +void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *name); +void *talloc_steal(const void *new_ctx, const void *ptr); +off_t talloc_total_size(const void *ptr); +off_t talloc_total_blocks(const void *ptr); +void talloc_report_full(const void *ptr, FILE *f); +void talloc_report(const void *ptr, FILE *f); +void talloc_enable_leak_report(void); +void talloc_enable_leak_report_full(void); +void *_talloc_zero(const void *ctx, size_t size, const char *name); +void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name); +char *talloc_strdup(const void *t, const char *p); +char *talloc_strndup(const void *t, const char *p, size_t n); +char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); +char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); +char *talloc_asprintf_append(char *s, + const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); +void *talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name); +void *talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name); +void *talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name); +void *talloc_realloc_fn(const void *context, void *ptr, size_t size); + +#endif + diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt new file mode 100644 index 0000000000..b3b148d476 --- /dev/null +++ b/source4/lib/talloc/talloc_guide.txt @@ -0,0 +1,492 @@ +Using talloc in Samba4 +---------------------- + +Andrew Tridgell +September 2004 + +The most current version of this document is available at + http://samba.org/ftp/unpacked/samba4/talloc_guide.txt + +If you are used to talloc from Samba3 then please read this carefully, +as talloc has changed a lot. + +The new talloc is a hierarchical, reference counted memory pool system +with destructors. Quite a mounthful really, but not too bad once you +get used to it. + +Perhaps the biggest change from Samba3 is that there is no distinction +between a "talloc context" and a "talloc pointer". Any pointer +returned from talloc() is itself a valid talloc context. This means +you can do this: + + struct foo *X = talloc_p(mem_ctx, struct foo); + X->name = talloc_strdup(X, "foo"); + +and the pointer X->name would be a "child" of the talloc context "X" +which is itself a child of mem_ctx. So if you do talloc_free(mem_ctx) +then it is all destroyed, whereas if you do talloc_free(X) then just X +and X->name are destroyed, and if you do talloc_free(X->name) then +just the name element of X is destroyed. + +If you think about this, then what this effectively gives you is an +n-ary tree, where you can free any part of the tree with +talloc_free(). + +If you find this confusing, then I suggest you run the LOCAL-TALLOC +smbtorture test to watch talloc in action. You may also like to add +your own tests to source/torture/local/talloc.c to clarify how some +particular situation is handled. + + +Performance +----------- + +All the additional features of talloc() over malloc() do come at a +price. We have a simple performance test in Samba4 that measures +talloc() versus malloc() performance, and it seems that talloc() is +about 10% slower than malloc() on my x86 Debian Linux box. For Samba, +the great reduction in code complexity that we get by using talloc +makes this worthwhile, especially as the total overhead of +talloc/malloc in Samba is already quite small. + + +talloc API +---------- + +The following is a complete guide to the talloc API. Read it all at +least twice. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void *talloc(const void *context, size_t size); + +The talloc() function is the core of the talloc library. It takes a +memory context, and returns a pointer to a new area of memory of the +given size. + +The returned pointer is itself a talloc context, so you can use it as +the context argument to more calls to talloc if you wish. + +The returned pointer is a "child" of the supplied context. This means +that if you talloc_free() the context then the new child disappears as +well. Alternatively you can free just the child. + +The context argument to talloc() can be NULL, in which case a new top +level context is created. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void *talloc_p(const void *context, type); + +The talloc_p() macro is the equivalent of + + (type *)talloc(ctx, sizeof(type)) + +You should use it in preference to talloc() whenever possible, as it +provides additional type safety. It also automatically calls the +talloc_set_name_const() function with the name being a string holding +the name of the type. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +int talloc_free(void *ptr); + +The talloc_free() function frees a piece of talloc memory, and all its +children. You can call talloc_free() on any pointer returned by +talloc(). + +The return value of talloc_free() indicates success or failure, with 0 +returned for success and -1 for failure. The only possible failure +condition is if the pointer had a destructor attached to it and the +destructor returned -1. See talloc_set_destructor() for details on +destructors. + +If this pointer has an additional parent when talloc_free() is called +then the memory is not actually released, but instead the most +recently established parent is destroyed. See talloc_reference() for +details on establishing additional parents. + +For more control on which parent is removed, see talloc_unlink() + +talloc_free() operates recursively on its children. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void *talloc_reference(const void *context, const void *ptr); + +The talloc_reference() function makes "context" an additional parent +of "ptr". + +The return value of talloc_reference() is always the original pointer +"ptr", unless talloc ran out of memory in creating the reference in +which case it will return NULL (each additional reference consumes +around 48 bytes of memory on intel x86 platforms). + +If "ptr" is NULL, then the function is a no-op, and simply returns NULL. + +After creating a reference you can free it in one of the following +ways: + + - you can talloc_free() any parent of the original pointer. That + will reduce the number of parents of this pointer by 1, and will + cause this pointer to be freed if it runs out of parents. + + - you can talloc_free() the pointer itself. That will destroy the + most recently established parent to the pointer and leave the + pointer as a child of its current parent. + +For more control on which parent to remove, see talloc_unlink() + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +int talloc_unlink(const void *context, const void *ptr); + +The talloc_unlink() function removes a specific parent from ptr. The +context passed must either be a context used in talloc_reference() +with this pointer, or must be a direct parent of ptr. + +Note that if the parent has already been removed using talloc_free() +then this function will fail and will return -1. Likewise, if "ptr" +is NULL, then the function will make no modifications and return -1. + +Usually you can just use talloc_free() instead of talloc_unlink(), but +sometimes it is useful to have the additional control on which parent +is removed. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void talloc_set_destructor(const void *ptr, int (*destructor)(void *)); + +The function talloc_set_destructor() sets the "destructor" for the +pointer "ptr". A destructor is a function that is called when the +memory used by a pointer is about to be released. The destructor +receives the pointer as an argument, and should return 0 for success +and -1 for failure. + +The destructor can do anything it wants to, including freeing other +pieces of memory. A common use for destructors is to clean up +operating system resources (such as open file descriptors) contained +in the structure the destructor is placed on. + +You can only place one destructor on a pointer. If you need more than +one destructor then you can create a zero-length child of the pointer +and place an additional destructor on that. + +To remove a destructor call talloc_set_destructor() with NULL for the +destructor. + +If your destructor attempts to talloc_free() the pointer that it is +the destructor for then talloc_free() will return -1 and the free will +be ignored. This would be a pointless operation anyway, as the +destructor is only called when the memory is just about to go away. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void talloc_increase_ref_count(const void *ptr); + +The talloc_increase_ref_count(ptr) function is exactly equivalent to: + + talloc_reference(NULL, ptr); + +You can use either syntax, depending on which you think is clearer in +your code. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void talloc_set_name(const void *ptr, const char *fmt, ...); + +Each talloc pointer has a "name". The name is used principally for +debugging purposes, although it is also possible to set and get the +name on a pointer in as a way of "marking" pointers in your code. + +The main use for names on pointer is for "talloc reports". See +talloc_report() and talloc_report_full() for details. Also see +talloc_enable_leak_report() and talloc_enable_leak_report_full(). + +The talloc_set_name() function allocates memory as a child of the +pointer. It is logically equivalent to: + talloc_set_name_const(ptr, talloc_asprintf(ptr, fmt, ...)); + +Note that multiple calls to talloc_set_name() will allocate more +memory without releasing the name. All of the memory is released when +the ptr is freed using talloc_free(). + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void talloc_set_name_const(const void *ptr, const char *name); + +The function talloc_set_name_const() is just like talloc_set_name(), +but it takes a string constant, and is much faster. It is extensively +used by the "auto naming" macros, such as talloc_p(). + +This function does not allocate any memory. It just copies the +supplied pointer into the internal representation of the talloc +ptr. This means you must not pass a name pointer to memory that will +disappear before the ptr is freed with talloc_free(). + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void *talloc_named(const void *context, size_t size, const char *fmt, ...); + +The talloc_named() function creates a named talloc pointer. It is +equivalent to: + + ptr = talloc(context, size); + talloc_set_name(ptr, fmt, ....); + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void *talloc_named_const(const void *context, size_t size, const char *name); + +This is equivalent to: + + ptr = talloc(context, size); + talloc_set_name_const(ptr, name); + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +const char *talloc_get_name(const void *ptr); + +This returns the current name for the given talloc pointer. See +talloc_set_name() for details. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void *talloc_init(const char *fmt, ...); + +This function creates a zero length named talloc context as a top +level context. It is equivalent to: + + talloc_named(NULL, 0, fmt, ...); + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void *talloc_realloc(const void *context, void *ptr, size_t size); + +The talloc_realloc() function changes the size of a talloc +pointer. It has the following equivalences: + + talloc_realloc(context, NULL, size) ==> talloc(context, size); + talloc_realloc(context, ptr, 0) ==> talloc_free(ptr); + +The "context" argument is only used if "ptr" is not NULL, otherwise it +is ignored. + +talloc_realloc() returns the new pointer, or NULL on failure. The call +will fail either due to a lack of memory, or because the pointer has +more than one parent (see talloc_reference()). + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void *talloc_steal(const void *new_ctx, const void *ptr); + +The talloc_steal() function changes the parent context of a talloc +pointer. It is typically used when the context that the pointer is +currently a child of is going to be freed and you wish to keep the +memory for a longer time. + +The talloc_steal() function returns the pointer that you pass it. It +does not have any failure modes. + +NOTE: It is possible to produce loops in the parent/child relationship +if you are not careful with talloc_steal(). No guarantees are provided +as to your sanity or the safety of your data if you do this. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +off_t talloc_total_size(const void *ptr); + +The talloc_total_size() function returns the total size in bytes used +by this pointer and all child pointers. Mostly useful for debugging. + +Passing NULL is allowed, but it will only give a meaningful result if +talloc_enable_leak_report() or talloc_enable_leak_report_full() has +been called. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +off_t talloc_total_blocks(const void *ptr); + +The talloc_total_blocks() function returns the total memory block +count used by this pointer and all child pointers. Mostly useful for +debugging. + +Passing NULL is allowed, but it will only give a meaningful result if +talloc_enable_leak_report() or talloc_enable_leak_report_full() has +been called. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void talloc_report(const void *ptr, FILE *f); + +The talloc_report() function prints a summary report of all memory +used by ptr. One line of report is printed for each immediate child of +ptr, showing the total memory and number of blocks used by that child. + +You can pass NULL for the pointer, in which case a report is printed +for the top level memory context, but only if +talloc_enable_leak_report() or talloc_enable_leak_report_full() has +been called. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void talloc_report_full(const void *ptr, FILE *f); + +This provides a more detailed report than talloc_report(). It will +recursively print the ensire tree of memory referenced by the +pointer. References in the tree are shown by giving the name of the +pointer that is referenced. + +You can pass NULL for the pointer, in which case a report is printed +for the top level memory context, but only if +talloc_enable_leak_report() or talloc_enable_leak_report_full() has +been called. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void talloc_enable_leak_report(void); + +This enables calling of talloc_report(NULL, stderr) when the program +exits. In Samba4 this is enabled by using the --leak-report command +line option. + +For it to be useful, this function must be called before any other +talloc function as it establishes a "null context" that acts as the +top of the tree. If you don't call this function first then passing +NULL to talloc_report() or talloc_report_full() won't give you the +full tree printout. + +Here is a typical talloc report: + +talloc report on 'null_context' (total 267 bytes in 15 blocks) + libcli/auth/spnego_parse.c:55 contains 31 bytes in 2 blocks + libcli/auth/spnego_parse.c:55 contains 31 bytes in 2 blocks + iconv(UTF8,CP850) contains 42 bytes in 2 blocks + libcli/auth/spnego_parse.c:55 contains 31 bytes in 2 blocks + iconv(CP850,UTF8) contains 42 bytes in 2 blocks + iconv(UTF8,UTF-16LE) contains 45 bytes in 2 blocks + iconv(UTF-16LE,UTF8) contains 45 bytes in 2 blocks + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void talloc_enable_leak_report_full(void); + +This enables calling of talloc_report_full(NULL, stderr) when the +program exits. In Samba4 this is enabled by using the +--leak-report-full command line option. + +For it to be useful, this function must be called before any other +talloc function as it establishes a "null context" that acts as the +top of the tree. If you don't call this function first then passing +NULL to talloc_report() or talloc_report_full() won't give you the +full tree printout. + +Here is a typical full report: + +full talloc report on 'root' (total 18 bytes in 8 blocks) + p1 contains 18 bytes in 7 blocks (ref 0) + r1 contains 13 bytes in 2 blocks (ref 0) + reference to: p2 + p2 contains 1 bytes in 1 blocks (ref 1) + x3 contains 1 bytes in 1 blocks (ref 0) + x2 contains 1 bytes in 1 blocks (ref 0) + x1 contains 1 bytes in 1 blocks (ref 0) + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void *talloc_zero(const void *ctx, size_t size); + +The talloc_zero() function is equivalent to: + + ptr = talloc(ctx, size); + if (ptr) memset(ptr, 0, size); + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void *talloc_memdup(const void *ctx, const void *p, size_t size); + +The talloc_memdup() function is equivalent to: + + ptr = talloc(ctx, size); + if (ptr) memcpy(ptr, p, size); + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +char *talloc_strdup(const void *ctx, const char *p); + +The talloc_strdup() function is equivalent to: + + ptr = talloc(ctx, strlen(p)+1); + if (ptr) memcpy(ptr, p, strlen(p)+1); + +This functions sets the name of the new pointer to the passed +string. This is equivalent to: + talloc_set_name_const(ptr, ptr) + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +char *talloc_strndup(const void *t, const char *p, size_t n); + +The talloc_strndup() function is the talloc equivalent of the C +library function strndup() + +This functions sets the name of the new pointer to the passed +string. This is equivalent to: + talloc_set_name_const(ptr, ptr) + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +char *talloc_vasprintf(const void *t, const char *fmt, va_list ap); + +The talloc_vasprintf() function is the talloc equivalent of the C +library function vasprintf() + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +char *talloc_asprintf(const void *t, const char *fmt, ...); + +The talloc_asprintf() function is the talloc equivalent of the C +library function asprintf() + +This functions sets the name of the new pointer to the passed +string. This is equivalent to: + talloc_set_name_const(ptr, ptr) + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +char *talloc_asprintf_append(char *s, const char *fmt, ...); + +The talloc_asprintf_append() function appends the given formatted +string to the given string. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void *talloc_array_p(const void *ctx, type, uint_t count); + +The talloc_array_p() macro is equivalent to: + + (type *)talloc(ctx, sizeof(type) * count); + +except that it provides integer overflow protection for the multiply, +returning NULL if the multiply overflows. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void *talloc_realloc_p(const void *ctx, void *ptr, type, uint_t count); + +The talloc_realloc_p() macro is equivalent to: + + (type *)talloc_realloc(ctx, ptr, sizeof(type) * count); + +except that it provides integer overflow protection for the multiply, +returning NULL if the multiply overflows. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void *talloc_realloc_fn(const void *ctx, void *ptr, size_t size); + +This is a non-macro version of talloc_realloc(), which is useful +as libraries sometimes want a ralloc function pointer. A realloc() +implementation encapsulates the functionality of malloc(), free() and +realloc() in one call, which is why it is useful to be able to pass +around a single function pointer. + diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c new file mode 100644 index 0000000000..22444b1116 --- /dev/null +++ b/source4/lib/talloc/testsuite.c @@ -0,0 +1,785 @@ +/* + Unix SMB/CIFS implementation. + + local testing of talloc routines. + + Copyright (C) Andrew Tridgell 2004 + + 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. +*/ + +#ifdef _SAMBA_BUILD_ +#include "includes.h" +#else +#include +#include +#include +#include +#include +#include +#include "talloc.h" +#endif + +/* the test suite can be built standalone, or as part of Samba */ +#ifndef _SAMBA_BUILD_ +typedef enum {False=0,True=1} BOOL; + +static struct timeval timeval_current(void) +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return tv; +} + +static double timeval_elapsed(struct timeval *tv) +{ + struct timeval tv2 = timeval_current(); + return (tv2.tv_sec - tv->tv_sec) + + (tv2.tv_usec - tv->tv_usec)*1.0e-6; +} +#endif /* _SAMBA_BUILD_ */ + + +#define CHECK_SIZE(ptr, tsize) do { \ + if (talloc_total_size(ptr) != (tsize)) { \ + printf(__location__ " failed: wrong '%s' tree size: got %u expected %u\n", \ + #ptr, \ + (unsigned)talloc_total_size(ptr), \ + (unsigned)tsize); \ + talloc_report_full(ptr, stdout); \ + return False; \ + } \ +} while (0) + +#define CHECK_BLOCKS(ptr, tblocks) do { \ + if (talloc_total_blocks(ptr) != (tblocks)) { \ + printf(__location__ " failed: wrong '%s' tree blocks: got %u expected %u\n", \ + #ptr, \ + (unsigned)talloc_total_blocks(ptr), \ + (unsigned)tblocks); \ + talloc_report_full(ptr, stdout); \ + return False; \ + } \ +} while (0) + + +/* + test references +*/ +static BOOL test_ref1(void) +{ + void *root, *p1, *p2, *ref, *r1; + + printf("TESTING SINGLE REFERENCE FREE\n"); + + root = talloc_named_const(NULL, 0, "root"); + p1 = talloc_named_const(root, 1, "p1"); + p2 = talloc_named_const(p1, 1, "p2"); + talloc_named_const(p1, 1, "x1"); + talloc_named_const(p1, 2, "x2"); + talloc_named_const(p1, 3, "x3"); + + r1 = talloc_named_const(root, 1, "r1"); + ref = talloc_reference(r1, p2); + talloc_report_full(root, stdout); + + CHECK_BLOCKS(p1, 5); + CHECK_BLOCKS(p2, 1); + CHECK_BLOCKS(r1, 2); + + printf("Freeing p2\n"); + talloc_free(p2); + talloc_report_full(root, stdout); + + CHECK_BLOCKS(p1, 5); + CHECK_BLOCKS(p2, 1); + CHECK_BLOCKS(r1, 1); + + printf("Freeing p1\n"); + talloc_free(p1); + talloc_report_full(root, stdout); + + CHECK_BLOCKS(r1, 1); + + printf("Freeing r1\n"); + talloc_free(r1); + talloc_report_full(NULL, stdout); + + printf("Testing NULL\n"); + if (talloc_reference(root, NULL)) { + return False; + } + + CHECK_BLOCKS(root, 1); + + CHECK_SIZE(root, 0); + + talloc_free(root); + + return True; +} + +/* + test references +*/ +static BOOL test_ref2(void) +{ + void *root, *p1, *p2, *ref, *r1; + + printf("TESTING DOUBLE REFERENCE FREE\n"); + + root = talloc_named_const(NULL, 0, "root"); + p1 = talloc_named_const(root, 1, "p1"); + talloc_named_const(p1, 1, "x1"); + talloc_named_const(p1, 1, "x2"); + talloc_named_const(p1, 1, "x3"); + p2 = talloc_named_const(p1, 1, "p2"); + + r1 = talloc_named_const(root, 1, "r1"); + ref = talloc_reference(r1, p2); + talloc_report_full(root, stdout); + + CHECK_BLOCKS(p1, 5); + CHECK_BLOCKS(p2, 1); + CHECK_BLOCKS(r1, 2); + + printf("Freeing ref\n"); + talloc_free(ref); + talloc_report_full(root, stdout); + + CHECK_BLOCKS(p1, 5); + CHECK_BLOCKS(p2, 1); + CHECK_BLOCKS(r1, 1); + + printf("Freeing p2\n"); + talloc_free(p2); + talloc_report_full(root, stdout); + + CHECK_BLOCKS(p1, 4); + CHECK_BLOCKS(r1, 1); + + printf("Freeing p1\n"); + talloc_free(p1); + talloc_report_full(root, stdout); + + CHECK_BLOCKS(r1, 1); + + printf("Freeing r1\n"); + talloc_free(r1); + talloc_report_full(root, stdout); + + CHECK_SIZE(root, 0); + + talloc_free(root); + + return True; +} + +/* + test references +*/ +static BOOL test_ref3(void) +{ + void *root, *p1, *p2, *ref, *r1; + + printf("TESTING PARENT REFERENCE FREE\n"); + + root = talloc_named_const(NULL, 0, "root"); + p1 = talloc_named_const(root, 1, "p1"); + p2 = talloc_named_const(root, 1, "p2"); + r1 = talloc_named_const(p1, 1, "r1"); + ref = talloc_reference(p2, r1); + talloc_report_full(root, stdout); + + CHECK_BLOCKS(p1, 2); + CHECK_BLOCKS(p2, 2); + CHECK_BLOCKS(r1, 1); + + printf("Freeing p1\n"); + talloc_free(p1); + talloc_report_full(root, stdout); + + CHECK_BLOCKS(p2, 2); + CHECK_BLOCKS(r1, 1); + + printf("Freeing p2\n"); + talloc_free(p2); + talloc_report_full(root, stdout); + + CHECK_SIZE(root, 0); + + talloc_free(root); + + return True; +} + +/* + test references +*/ +static BOOL test_ref4(void) +{ + void *root, *p1, *p2, *ref, *r1; + + printf("TESTING REFERRER REFERENCE FREE\n"); + + root = talloc_named_const(NULL, 0, "root"); + p1 = talloc_named_const(root, 1, "p1"); + talloc_named_const(p1, 1, "x1"); + talloc_named_const(p1, 1, "x2"); + talloc_named_const(p1, 1, "x3"); + p2 = talloc_named_const(p1, 1, "p2"); + + r1 = talloc_named_const(root, 1, "r1"); + ref = talloc_reference(r1, p2); + talloc_report_full(root, stdout); + + CHECK_BLOCKS(p1, 5); + CHECK_BLOCKS(p2, 1); + CHECK_BLOCKS(r1, 2); + + printf("Freeing r1\n"); + talloc_free(r1); + talloc_report_full(root, stdout); + + CHECK_BLOCKS(p1, 5); + CHECK_BLOCKS(p2, 1); + + printf("Freeing p2\n"); + talloc_free(p2); + talloc_report_full(root, stdout); + + CHECK_BLOCKS(p1, 4); + + printf("Freeing p1\n"); + talloc_free(p1); + talloc_report_full(root, stdout); + + CHECK_SIZE(root, 0); + + talloc_free(root); + + return True; +} + + +/* + test references +*/ +static BOOL test_unlink1(void) +{ + void *root, *p1, *p2, *ref, *r1; + + printf("TESTING UNLINK\n"); + + root = talloc_named_const(NULL, 0, "root"); + p1 = talloc_named_const(root, 1, "p1"); + talloc_named_const(p1, 1, "x1"); + talloc_named_const(p1, 1, "x2"); + talloc_named_const(p1, 1, "x3"); + p2 = talloc_named_const(p1, 1, "p2"); + + r1 = talloc_named_const(p1, 1, "r1"); + ref = talloc_reference(r1, p2); + talloc_report_full(root, stdout); + + CHECK_BLOCKS(p1, 7); + CHECK_BLOCKS(p2, 1); + CHECK_BLOCKS(r1, 2); + + printf("Unreferencing r1\n"); + talloc_unlink(r1, p2); + talloc_report_full(root, stdout); + + CHECK_BLOCKS(p1, 6); + CHECK_BLOCKS(p2, 1); + CHECK_BLOCKS(r1, 1); + + printf("Freeing p1\n"); + talloc_free(p1); + talloc_report_full(root, stdout); + + CHECK_SIZE(root, 0); + + talloc_free(root); + + return True; +} + +static int fail_destructor(void *ptr) +{ + return -1; +} + +/* + miscellaneous tests to try to get a higher test coverage percentage +*/ +static BOOL test_misc(void) +{ + void *root, *p1; + char *p2; + double *d; + + printf("TESTING MISCELLANEOUS\n"); + + root = talloc(NULL, 0); + + p1 = talloc(root, 0x7fffffff); + if (p1) { + printf("failed: large talloc allowed\n"); + return False; + } + + p1 = talloc_strdup(root, "foo"); + talloc_increase_ref_count(p1); + talloc_increase_ref_count(p1); + talloc_increase_ref_count(p1); + CHECK_BLOCKS(p1, 1); + CHECK_BLOCKS(root, 2); + talloc_free(p1); + CHECK_BLOCKS(p1, 1); + CHECK_BLOCKS(root, 2); + talloc_unlink(NULL, p1); + CHECK_BLOCKS(p1, 1); + CHECK_BLOCKS(root, 2); + p2 = talloc_strdup(p1, "foo"); + if (talloc_unlink(root, p2) != -1) { + printf("failed: talloc_unlink() of non-reference context should return -1\n"); + return False; + } + if (talloc_unlink(p1, p2) != 0) { + printf("failed: talloc_unlink() of parent should succeed\n"); + return False; + } + talloc_free(p1); + CHECK_BLOCKS(p1, 1); + CHECK_BLOCKS(root, 2); + + talloc_set_name(p1, "my name is %s", "foo"); + if (strcmp(talloc_get_name(p1), "my name is foo") != 0) { + printf("failed: wrong name after talloc_set_name\n"); + return False; + } + CHECK_BLOCKS(p1, 2); + CHECK_BLOCKS(root, 3); + + talloc_set_name_const(p1, NULL); + if (strcmp(talloc_get_name(p1), "UNNAMED") != 0) { + printf("failed: wrong name after talloc_set_name(NULL)\n"); + return False; + } + CHECK_BLOCKS(p1, 2); + CHECK_BLOCKS(root, 3); + + + if (talloc_free(NULL) != -1) { + printf("talloc_free(NULL) should give -1\n"); + return False; + } + + talloc_set_destructor(p1, fail_destructor); + if (talloc_free(p1) != -1) { + printf("Failed destructor should cause talloc_free to fail\n"); + return False; + } + talloc_set_destructor(p1, NULL); + + talloc_report(root, stdout); + + + p2 = talloc_zero(p1, 20); + if (p2[19] != 0) { + printf("Failed to give zero memory\n"); + return False; + } + talloc_free(p2); + + if (talloc_strdup(root, NULL) != NULL) { + printf("failed: strdup on NULL should give NULL\n"); + return False; + } + + p2 = talloc_strndup(p1, "foo", 2); + if (strcmp("fo", p2) != 0) { + printf("failed: strndup doesn't work\n"); + return False; + } + p2 = talloc_asprintf_append(p2, "o%c", 'd'); + if (strcmp("food", p2) != 0) { + printf("failed: talloc_asprintf_append doesn't work\n"); + return False; + } + CHECK_BLOCKS(p2, 1); + CHECK_BLOCKS(p1, 3); + + p2 = talloc_asprintf_append(NULL, "hello %s", "world"); + if (strcmp("hello world", p2) != 0) { + printf("failed: talloc_asprintf_append doesn't work\n"); + return False; + } + CHECK_BLOCKS(p2, 1); + CHECK_BLOCKS(p1, 3); + talloc_free(p2); + + d = talloc_array_p(p1, double, 0x20000000); + if (d) { + printf("failed: integer overflow not detected\n"); + return False; + } + + d = talloc_realloc_p(p1, d, double, 0x20000000); + if (d) { + printf("failed: integer overflow not detected\n"); + return False; + } + + talloc_free(p1); + CHECK_BLOCKS(root, 1); + + p1 = talloc_named(root, 100, "%d bytes", 100); + CHECK_BLOCKS(p1, 2); + CHECK_BLOCKS(root, 3); + talloc_unlink(root, p1); + + p1 = talloc_init("%d bytes", 200); + p2 = talloc_asprintf(p1, "my test '%s'", "string"); + CHECK_BLOCKS(p1, 3); + CHECK_SIZE(p2, 17); + CHECK_BLOCKS(root, 1); + talloc_unlink(NULL, p1); + + p1 = talloc_named_const(root, 10, "p1"); + p2 = talloc_named_const(root, 20, "p2"); + talloc_reference(p1, p2); + talloc_report_full(root, stdout); + talloc_unlink(root, p2); + talloc_report_full(root, stdout); + CHECK_BLOCKS(p2, 1); + CHECK_BLOCKS(p1, 2); + CHECK_BLOCKS(root, 3); + talloc_unlink(p1, p2); + talloc_unlink(root, p1); + + p1 = talloc_named_const(root, 10, "p1"); + p2 = talloc_named_const(root, 20, "p2"); + talloc_reference(NULL, p2); + talloc_report_full(root, stdout); + talloc_unlink(root, p2); + talloc_report_full(root, stdout); + CHECK_BLOCKS(p2, 1); + CHECK_BLOCKS(p1, 1); + CHECK_BLOCKS(root, 2); + talloc_unlink(NULL, p2); + talloc_unlink(root, p1); + + /* Test that talloc_unlink is a no-op */ + + if (talloc_unlink(root, NULL) != -1) { + printf("failed: talloc_unlink(root, NULL) == -1\n"); + return False; + } + + talloc_report(root, stdout); + talloc_report(NULL, stdout); + + CHECK_SIZE(root, 0); + + talloc_free(root); + + CHECK_SIZE(NULL, 0); + + talloc_enable_leak_report(); + talloc_enable_leak_report_full(); + + return True; +} + + +/* + test realloc +*/ +static BOOL test_realloc(void) +{ + void *root, *p1, *p2; + + printf("TESTING REALLOC\n"); + + root = talloc(NULL, 0); + + p1 = talloc(root, 10); + CHECK_SIZE(p1, 10); + + p1 = talloc_realloc(NULL, p1, 20); + CHECK_SIZE(p1, 20); + + talloc(p1, 0); + + p2 = talloc_realloc(p1, NULL, 30); + + talloc(p1, 0); + + p2 = talloc_realloc(p1, p2, 40); + + CHECK_SIZE(p2, 40); + CHECK_SIZE(root, 60); + CHECK_BLOCKS(p1, 4); + + p1 = talloc_realloc(NULL, p1, 20); + CHECK_SIZE(p1, 60); + + talloc_increase_ref_count(p2); + if (talloc_realloc(NULL, p2, 5) != NULL) { + printf("failed: talloc_realloc() on a referenced pointer should fail\n"); + return False; + } + CHECK_BLOCKS(p1, 4); + + talloc_realloc(NULL, p2, 0); + talloc_realloc(NULL, p2, 0); + CHECK_BLOCKS(p1, 3); + + if (talloc_realloc(NULL, p1, 0x7fffffff) != NULL) { + printf("failed: oversize talloc should fail\n"); + return False; + } + + talloc_realloc(NULL, p1, 0); + + CHECK_BLOCKS(root, 1); + CHECK_SIZE(root, 0); + + talloc_free(root); + + return True; +} + + +/* + test realloc with a child +*/ +static BOOL test_realloc_child(void) +{ + void *root; + struct el1 { + int count; + struct el2 { + const char *name; + } **list; + } *el1; + struct el2 *el2; + + printf("TESTING REALLOC WITH CHILD\n"); + + root = talloc(NULL, 0); + + el1 = talloc_p(root, struct el1); + el1->list = talloc_p(el1, struct el2 *); + el1->list[0] = talloc_p(el1->list, struct el2); + el1->list[0]->name = talloc_strdup(el1->list[0], "testing"); + + el2 = talloc_p(el1->list, struct el2); + + el1->list = talloc_realloc_p(el1, el1->list, struct el2 *, 2); + el1->list[1] = el2; + + talloc_free(root); + + return True; +} + +/* + test steal +*/ +static BOOL test_steal(void) +{ + void *root, *p1, *p2; + + printf("TESTING STEAL\n"); + + root = talloc(NULL, 0); + + p1 = talloc_array_p(root, char, 10); + CHECK_SIZE(p1, 10); + + p2 = talloc_realloc_p(root, NULL, char, 20); + CHECK_SIZE(p1, 10); + CHECK_SIZE(root, 30); + + if (talloc_steal(p1, NULL) != NULL) { + printf("failed: stealing NULL should give NULL\n"); + return False; + } + + if (talloc_steal(p1, p1) != p1) { + printf("failed: stealing to ourselves is a nop\n"); + return False; + } + CHECK_BLOCKS(root, 3); + CHECK_SIZE(root, 30); + + talloc_steal(NULL, p1); + talloc_steal(NULL, p2); + CHECK_BLOCKS(root, 1); + CHECK_SIZE(root, 0); + + talloc_free(p1); + talloc_steal(root, p2); + CHECK_BLOCKS(root, 2); + CHECK_SIZE(root, 20); + + talloc_free(p2); + + CHECK_BLOCKS(root, 1); + CHECK_SIZE(root, 0); + + talloc_free(root); + + p1 = talloc(NULL, 3); + CHECK_SIZE(NULL, 3); + talloc_free(p1); + + return True; +} + +/* + test ldb alloc fn +*/ +static BOOL test_ldb(void) +{ + void *root, *p1; + + printf("TESTING LDB\n"); + + root = talloc(NULL, 0); + + p1 = talloc_realloc_fn(root, NULL, 10); + CHECK_BLOCKS(root, 2); + CHECK_SIZE(root, 10); + p1 = talloc_realloc_fn(root, p1, 20); + CHECK_BLOCKS(root, 2); + CHECK_SIZE(root, 20); + p1 = talloc_realloc_fn(root, p1, 0); + CHECK_BLOCKS(root, 1); + CHECK_SIZE(root, 0); + + talloc_free(root); + + + return True; +} + + +static BOOL test_unref_reparent(void) +{ + void *root, *p1, *p2, *c1; + + printf("TESTING UNREFERENCE AFTER PARENT FREED\n"); + + root = talloc_named_const(NULL, 0, "root"); + p1 = talloc_named_const(root, 1, "orig parent"); + p2 = talloc_named_const(root, 1, "parent by reference"); + + c1 = talloc_named_const(p1, 1, "child"); + talloc_reference(p2, c1); + + talloc_free(p1); + talloc_unlink(p2, c1); + + CHECK_SIZE(root, 1); + + talloc_free(p2); + talloc_free(root); + + return True; +} + +/* + measure the speed of talloc versus malloc +*/ +static BOOL test_speed(void) +{ + void *ctx = talloc(NULL, 0); + unsigned count; + struct timeval tv; + + printf("MEASURING TALLOC VS MALLOC SPEED\n"); + + tv = timeval_current(); + count = 0; + do { + void *p1, *p2, *p3; + p1 = talloc(ctx, count); + p2 = talloc_strdup(p1, "foo bar"); + p3 = talloc(p1, 300); + talloc_free(p1); + count += 3; + } while (timeval_elapsed(&tv) < 5.0); + + printf("talloc: %.0f ops/sec\n", count/timeval_elapsed(&tv)); + + talloc_free(ctx); + + tv = timeval_current(); + count = 0; + do { + void *p1, *p2, *p3; + p1 = malloc(count); + p2 = strdup("foo bar"); + p3 = malloc(300); + free(p1); + free(p2); + free(p3); + count += 3; + } while (timeval_elapsed(&tv) < 5.0); + + printf("malloc: %.0f ops/sec\n", count/timeval_elapsed(&tv)); + + return True; +} + + +BOOL torture_local_talloc(void) +{ + BOOL ret = True; + + ret &= test_ref1(); + ret &= test_ref2(); + ret &= test_ref3(); + ret &= test_ref4(); + ret &= test_unlink1(); + ret &= test_misc(); + ret &= test_realloc(); + ret &= test_realloc_child(); + ret &= test_steal(); + ret &= test_unref_reparent(); + ret &= test_ldb(); + if (ret) { + ret &= test_speed(); + } + + return ret; +} + + + +#ifndef _SAMBA_BUILD_ + int main(void) +{ + if (!torture_local_talloc()) { + printf("ERROR: TESTSUIE FAILED\n"); + return -1; + } + return 0; +} +#endif -- cgit From f4b349127bdfe233476fe2efba961912f39a5cbd Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 2 Jan 2005 12:55:33 +0000 Subject: r4479: added the function talloc_autofree_context() which returns a talloc context that will automatically be freed on program exit. This is useful for reducing clutter in leak reports (This used to be commit cf73dda652e0a121901f22771104be6751c0fcb9) --- source4/lib/talloc/talloc.c | 21 +++++++++++++++++++++ source4/lib/talloc/talloc.h | 1 + source4/lib/talloc/talloc_guide.txt | 6 ++++++ 3 files changed, 28 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 4666e28288..9e8868191f 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -67,6 +67,7 @@ NULL */ static const void *null_context; +static void *cleanup_context; struct talloc_reference_handle { @@ -1004,3 +1005,23 @@ void *talloc_realloc_fn(const void *context, void *ptr, size_t size) { return _talloc_realloc(context, ptr, size, NULL); } + + +static void talloc_autofree(void) +{ + talloc_free(cleanup_context); + cleanup_context = NULL; +} + +/* + return a context which will be auto-freed on exit + this is useful for reducing the noise in leak reports +*/ +void *talloc_autofree_context(void) +{ + if (cleanup_context == NULL) { + cleanup_context = talloc_named_const(NULL, 0, "autofree_context"); + atexit(talloc_autofree); + } + return cleanup_context; +} diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 6ebba447aa..9e828f2f0d 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -91,6 +91,7 @@ void *talloc_array(const void *ctx, size_t el_size, unsigned count, const char * void *talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name); void *talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name); void *talloc_realloc_fn(const void *context, void *ptr, size_t size); +void *talloc_autofree_context(void); #endif diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index b3b148d476..ce3c8bde68 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -490,3 +490,9 @@ implementation encapsulates the functionality of malloc(), free() and realloc() in one call, which is why it is useful to be able to pass around a single function pointer. +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void *talloc_autofree_context(void); + +This is a handy utility function that returns a talloc context +which will be automatically freed on program exit. This can be used +to reduce the noise in memory leak reports. -- cgit From cc55aef7c116d03ba2817625b0ba9edb378525e3 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 6 Jan 2005 02:32:43 +0000 Subject: r4547: - added talloc_new(ctx) macro that is a neater form of the common talloc(ctx, 0) call. - cleaned up some talloc usage in various files I'd like to get to the point that we have no calls to talloc(), at which point we will rename talloc_p() to talloc(), to encourage everyone to use the typesafe functions. (This used to be commit e6c81d7c9f8a6938947d3c1c8a971a0d6d50b67a) --- source4/lib/talloc/talloc.h | 1 + source4/lib/talloc/talloc_guide.txt | 9 +++++++++ source4/lib/talloc/testsuite.c | 4 ++-- 3 files changed, 12 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 9e828f2f0d..ee3e0be8eb 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -37,6 +37,7 @@ typedef void TALLOC_CTX; #define talloc_zero(ctx, size) _talloc_zero(ctx, size, __location__) #define talloc_realloc(ctx, ptr, size) _talloc_realloc(ctx, ptr, size, __location__) #define talloc_p(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) +#define talloc_new(ctx) talloc_named_const(ctx, 0, "talloc_new: " __location__) #define talloc_zero_p(ctx, type) (type *)_talloc_zero(ctx, sizeof(type), #type) #define talloc_zero_array_p(ctx, type, count) (type *)talloc_zero_array(ctx, sizeof(type), count, __location__) #define talloc_array_p(ctx, type, count) (type *)talloc_array(ctx, sizeof(type), count, __location__) diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index ce3c8bde68..aa37c60466 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -260,6 +260,15 @@ level context. It is equivalent to: talloc_named(NULL, 0, fmt, ...); +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void *talloc_new(void *ctx); + +This is a utility macro that creates a new memory context hanging +off an exiting context, automatically naming it "talloc_new: __location__" +where __location__ is the source line it is called from. It is +particularly useful for creating a new temporary working context. + + =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- void *talloc_realloc(const void *context, void *ptr, size_t size); diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 22444b1116..a3a448ef40 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -333,7 +333,7 @@ static BOOL test_misc(void) printf("TESTING MISCELLANEOUS\n"); - root = talloc(NULL, 0); + root = talloc_new(NULL); p1 = talloc(root, 0x7fffffff); if (p1) { @@ -515,7 +515,7 @@ static BOOL test_realloc(void) printf("TESTING REALLOC\n"); - root = talloc(NULL, 0); + root = talloc_new(NULL); p1 = talloc(root, 10); CHECK_SIZE(p1, 10); -- cgit From ddc10d4d37984246a6547e34a32d629c689c40d1 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 6 Jan 2005 03:06:58 +0000 Subject: r4549: got rid of a lot more uses of plain talloc(), instead using talloc_size() or talloc_array_p() where appropriate. also fixed a memory leak in pvfs_copy_file() (failed to free a memory context) (This used to be commit 89b74b53546e1570b11b3702f40bee58aed8c503) --- source4/lib/talloc/talloc.h | 1 + source4/lib/talloc/testsuite.c | 18 +++++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index ee3e0be8eb..99a6b7a770 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -34,6 +34,7 @@ typedef void TALLOC_CTX; /* useful macros for creating type checked pointers */ #define talloc(ctx, size) talloc_named_const(ctx, size, __location__) +#define talloc_size(ctx, size) talloc_named_const(ctx, size, __location__) #define talloc_zero(ctx, size) _talloc_zero(ctx, size, __location__) #define talloc_realloc(ctx, ptr, size) _talloc_realloc(ctx, ptr, size, __location__) #define talloc_p(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index a3a448ef40..ced3217105 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -335,7 +335,7 @@ static BOOL test_misc(void) root = talloc_new(NULL); - p1 = talloc(root, 0x7fffffff); + p1 = talloc_size(root, 0x7fffffff); if (p1) { printf("failed: large talloc allowed\n"); return False; @@ -517,7 +517,7 @@ static BOOL test_realloc(void) root = talloc_new(NULL); - p1 = talloc(root, 10); + p1 = talloc_size(root, 10); CHECK_SIZE(p1, 10); p1 = talloc_realloc(NULL, p1, 20); @@ -581,7 +581,7 @@ static BOOL test_realloc_child(void) printf("TESTING REALLOC WITH CHILD\n"); - root = talloc(NULL, 0); + root = talloc_new(NULL); el1 = talloc_p(root, struct el1); el1->list = talloc_p(el1, struct el2 *); @@ -607,7 +607,7 @@ static BOOL test_steal(void) printf("TESTING STEAL\n"); - root = talloc(NULL, 0); + root = talloc_new(NULL); p1 = talloc_array_p(root, char, 10); CHECK_SIZE(p1, 10); @@ -645,7 +645,7 @@ static BOOL test_steal(void) talloc_free(root); - p1 = talloc(NULL, 3); + p1 = talloc_new(NULL); CHECK_SIZE(NULL, 3); talloc_free(p1); @@ -661,7 +661,7 @@ static BOOL test_ldb(void) printf("TESTING LDB\n"); - root = talloc(NULL, 0); + root = talloc_new(NULL); p1 = talloc_realloc_fn(root, NULL, 10); CHECK_BLOCKS(root, 2); @@ -709,7 +709,7 @@ static BOOL test_unref_reparent(void) */ static BOOL test_speed(void) { - void *ctx = talloc(NULL, 0); + void *ctx = talloc_new(NULL); unsigned count; struct timeval tv; @@ -719,9 +719,9 @@ static BOOL test_speed(void) count = 0; do { void *p1, *p2, *p3; - p1 = talloc(ctx, count); + p1 = talloc_size(ctx, count); p2 = talloc_strdup(p1, "foo bar"); - p3 = talloc(p1, 300); + p3 = talloc_size(p1, 300); talloc_free(p1); count += 3; } while (timeval_elapsed(&tv) < 5.0); -- cgit From e159e42d8472f36f51e400e351fc43f2a7dc44f5 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 6 Jan 2005 03:20:56 +0000 Subject: r4550: talloc() is now typesafe. It is exactly equivalent to the old talloc_p() macro. Use talloc_size() if you want the old behaviour. I have kept talloc_p() as an alias for now. Once we change all calls to be plain talloc() then we can remove it. (This used to be commit 2011bbeb841fd6bfccf3d44a49f79203f7f55baa) --- source4/lib/talloc/talloc.c | 4 ++-- source4/lib/talloc/talloc.h | 4 ++-- source4/lib/talloc/talloc_guide.txt | 40 ++++++++++++++++++------------------- source4/lib/talloc/testsuite.c | 4 ++-- 4 files changed, 26 insertions(+), 26 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 9e8868191f..bcadf40cfb 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -857,7 +857,7 @@ char *talloc_strndup(const void *t, const char *p, size_t n) for (len=0; p[len] && len talloc(context, size); + talloc_realloc(context, NULL, size) ==> talloc_size(context, size); talloc_realloc(context, ptr, 0) ==> talloc_free(ptr); The "context" argument is only used if "ptr" is not NULL, otherwise it @@ -407,7 +407,7 @@ void *talloc_zero(const void *ctx, size_t size); The talloc_zero() function is equivalent to: - ptr = talloc(ctx, size); + ptr = talloc_size(ctx, size); if (ptr) memset(ptr, 0, size); @@ -416,7 +416,7 @@ void *talloc_memdup(const void *ctx, const void *p, size_t size); The talloc_memdup() function is equivalent to: - ptr = talloc(ctx, size); + ptr = talloc_size(ctx, size); if (ptr) memcpy(ptr, p, size); @@ -425,7 +425,7 @@ char *talloc_strdup(const void *ctx, const char *p); The talloc_strdup() function is equivalent to: - ptr = talloc(ctx, strlen(p)+1); + ptr = talloc_size(ctx, strlen(p)+1); if (ptr) memcpy(ptr, p, strlen(p)+1); This functions sets the name of the new pointer to the passed @@ -473,7 +473,7 @@ void *talloc_array_p(const void *ctx, type, uint_t count); The talloc_array_p() macro is equivalent to: - (type *)talloc(ctx, sizeof(type) * count); + (type *)talloc_size(ctx, sizeof(type) * count); except that it provides integer overflow protection for the multiply, returning NULL if the multiply overflows. diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index ced3217105..d46964d9b6 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -523,11 +523,11 @@ static BOOL test_realloc(void) p1 = talloc_realloc(NULL, p1, 20); CHECK_SIZE(p1, 20); - talloc(p1, 0); + talloc_new(p1); p2 = talloc_realloc(p1, NULL, 30); - talloc(p1, 0); + talloc_new(p1); p2 = talloc_realloc(p1, p2, 40); -- cgit From 11ce2cfd70df264c5c91b4daaa9a01c5abc673b0 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 7 Jan 2005 04:39:16 +0000 Subject: r4591: - converted the other _p talloc functions to not need _p - added #if TALLOC_DEPRECATED around the _p functions - fixes the code that broke from the above while doing this I fixed quite a number of places that were incorrectly using the non type-safe talloc functions to use the type safe ones. Some were even doing multiplies for array allocation, which is potentially unsafe. (This used to be commit 6e7754abd0c225527fb38363996a6e241b87b37e) --- source4/lib/talloc/talloc.c | 14 ++++------- source4/lib/talloc/talloc.h | 37 ++++++++++++++++++++-------- source4/lib/talloc/talloc_guide.txt | 49 +++++++++++++++++++++---------------- source4/lib/talloc/testsuite.c | 20 +++++++-------- 4 files changed, 70 insertions(+), 50 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index bcadf40cfb..6d11cb00e9 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -932,7 +932,7 @@ static char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) } len = vsnprintf(NULL, 0, fmt, ap2); - s = talloc_realloc(NULL, s, s_len + len+1); + s = talloc_realloc(NULL, s, char, s_len + len+1); if (!s) return NULL; VA_COPY(ap2, ap); @@ -961,7 +961,7 @@ char *talloc_asprintf_append(char *s, const char *fmt, ...) /* alloc an array, checking for integer overflow in the array size */ -void *talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name) +void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name) { if (count >= MAX_TALLOC_SIZE/el_size) { return NULL; @@ -972,7 +972,7 @@ void *talloc_array(const void *ctx, size_t el_size, unsigned count, const char * /* alloc an zero array, checking for integer overflow in the array size */ -void *talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name) +void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name) { if (count >= MAX_TALLOC_SIZE/el_size) { return NULL; @@ -984,16 +984,12 @@ void *talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const c /* realloc an array, checking for integer overflow in the array size */ -void *talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name) +void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name) { if (count >= MAX_TALLOC_SIZE/el_size) { return NULL; } - ptr = talloc_realloc(ctx, ptr, el_size * count); - if (ptr) { - talloc_set_name_const(ptr, name); - } - return ptr; + return _talloc_realloc(ctx, ptr, el_size * count, name); } /* diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 747b1c6ba6..8169782441 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -32,17 +32,26 @@ typedef void TALLOC_CTX; #define __LINESTR__ _STRING_LINE2_(__LINE__) #define __location__ __FILE__ ":" __LINESTR__ +#ifndef TALLOC_DEPRECATED +#define TALLOC_DEPRECATED 0 +#endif + /* useful macros for creating type checked pointers */ #define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) -#define talloc_p(ctx, type) talloc(ctx, type) #define talloc_size(ctx, size) talloc_named_const(ctx, size, __location__) -#define talloc_zero(ctx, size) _talloc_zero(ctx, size, __location__) -#define talloc_realloc(ctx, ptr, size) _talloc_realloc(ctx, ptr, size, __location__) + #define talloc_new(ctx) talloc_named_const(ctx, 0, "talloc_new: " __location__) -#define talloc_zero_p(ctx, type) (type *)_talloc_zero(ctx, sizeof(type), #type) -#define talloc_zero_array_p(ctx, type, count) (type *)talloc_zero_array(ctx, sizeof(type), count, __location__) -#define talloc_array_p(ctx, type, count) (type *)talloc_array(ctx, sizeof(type), count, __location__) -#define talloc_realloc_p(ctx, p, type, count) (type *)talloc_realloc_array(ctx, p, sizeof(type), count, __location__) + +#define talloc_zero(ctx, type) (type *)_talloc_zero(ctx, sizeof(type), #type) +#define talloc_zero_size(ctx, size) _talloc_zero(ctx, size, __location__) + +#define talloc_zero_array(ctx, type, count) (type *)_talloc_zero_array(ctx, sizeof(type), count, __location__) +#define talloc_array(ctx, type, count) (type *)_talloc_array(ctx, sizeof(type), count, __location__) +#define talloc_array_size(ctx, size, count) _talloc_array(ctx, size, count, __location__) + +#define talloc_realloc(ctx, p, type, count) (type *)_talloc_realloc_array(ctx, p, sizeof(type), count, __location__) +#define talloc_realloc_size(ctx, ptr, size) _talloc_realloc(ctx, ptr, size, __location__) + #define talloc_memdup(t, p, size) _talloc_memdup(t, p, size, __location__) #define talloc_destroy(ctx) talloc_free(ctx) @@ -54,6 +63,14 @@ typedef void TALLOC_CTX; #define data_blob(ptr, size) data_blob_named(ptr, size, "DATA_BLOB: "__location__) #define data_blob_talloc(ctx, ptr, size) data_blob_talloc_named(ctx, ptr, size, "DATA_BLOB: "__location__) + +#if TALLOC_DEPRECATED +#define talloc_zero_p(ctx, type) talloc_zero(ctx, type) +#define talloc_p(ctx, type) talloc(ctx, type) +#define talloc_array_p(ctx, type, count) talloc_array(ctx, type, count) +#define talloc_realloc_p(ctx, p, type, count) talloc_realloc(ctx, p, type, count) +#endif + #ifndef PRINTF_ATTRIBUTE #define PRINTF_ATTRIBUTE(a1, a2) #endif @@ -89,9 +106,9 @@ char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIB char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); char *talloc_asprintf_append(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); -void *talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name); -void *talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name); -void *talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name); +void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name); +void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name); +void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name); void *talloc_realloc_fn(const void *context, void *ptr, size_t size); void *talloc_autofree_context(void); diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index af6bdf0275..30b7f64d67 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -5,7 +5,7 @@ Andrew Tridgell September 2004 The most current version of this document is available at - http://samba.org/ftp/unpacked/samba4/talloc_guide.txt + http://samba.org/ftp/unpacked/samba4/source/lib/talloc/talloc_guide.txt If you are used to talloc from Samba3 then please read this carefully, as talloc has changed a lot. @@ -19,7 +19,7 @@ between a "talloc context" and a "talloc pointer". Any pointer returned from talloc() is itself a valid talloc context. This means you can do this: - struct foo *X = talloc_p(mem_ctx, struct foo); + struct foo *X = talloc(mem_ctx, struct foo); X->name = talloc_strdup(X, "foo"); and the pointer X->name would be a "child" of the talloc context "X" @@ -34,7 +34,7 @@ talloc_free(). If you find this confusing, then I suggest you run the LOCAL-TALLOC smbtorture test to watch talloc in action. You may also like to add -your own tests to source/torture/local/talloc.c to clarify how some +your own tests to source/lib/talloc/testsuite.c to clarify how some particular situation is handled. @@ -270,13 +270,13 @@ particularly useful for creating a new temporary working context. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -void *talloc_realloc(const void *context, void *ptr, size_t size); +(type *)talloc_realloc(const void *context, void *ptr, type, count); -The talloc_realloc() function changes the size of a talloc +The talloc_realloc() macro changes the size of a talloc pointer. It has the following equivalences: - talloc_realloc(context, NULL, size) ==> talloc_size(context, size); - talloc_realloc(context, ptr, 0) ==> talloc_free(ptr); + talloc_realloc(context, NULL, type, 1) ==> talloc(context, type); + talloc_realloc(context, ptr, type, 0) ==> talloc_free(ptr); The "context" argument is only used if "ptr" is not NULL, otherwise it is ignored. @@ -286,6 +286,13 @@ will fail either due to a lack of memory, or because the pointer has more than one parent (see talloc_reference()). +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void *talloc_realloc_size(const void *context, void *ptr, size_t size); + +the talloc_realloc_size() function is useful when the type is not +known so the typesafe talloc_realloc() cannot be used. + + =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- void *talloc_steal(const void *new_ctx, const void *ptr); @@ -403,12 +410,18 @@ full talloc report on 'root' (total 18 bytes in 8 blocks) =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -void *talloc_zero(const void *ctx, size_t size); +(type *)talloc_zero(const void *ctx, type); -The talloc_zero() function is equivalent to: +The talloc_zero() macro is equivalent to: - ptr = talloc_size(ctx, size); - if (ptr) memset(ptr, 0, size); + ptr = talloc(ctx, type); + if (ptr) memset(ptr, 0, sizeof(type)); + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void *talloc_zero_size(const void *ctx, size_t size) + +The talloc_zero_size() function is useful when you don't have a known type =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- @@ -469,25 +482,19 @@ string to the given string. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -void *talloc_array_p(const void *ctx, type, uint_t count); +(type *)talloc_array(const void *ctx, type, uint_t count); -The talloc_array_p() macro is equivalent to: +The talloc_array() macro is equivalent to: (type *)talloc_size(ctx, sizeof(type) * count); except that it provides integer overflow protection for the multiply, returning NULL if the multiply overflows. - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -void *talloc_realloc_p(const void *ctx, void *ptr, type, uint_t count); - -The talloc_realloc_p() macro is equivalent to: +void *talloc_array_size(const void *ctx, size_t size, uint_t count); - (type *)talloc_realloc(ctx, ptr, sizeof(type) * count); - -except that it provides integer overflow protection for the multiply, -returning NULL if the multiply overflows. +The talloc_array_size() function is useful when the type is not known =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index d46964d9b6..e7934a10f3 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -398,7 +398,7 @@ static BOOL test_misc(void) talloc_report(root, stdout); - p2 = talloc_zero(p1, 20); + p2 = talloc_zero_size(p1, 20); if (p2[19] != 0) { printf("Failed to give zero memory\n"); return False; @@ -520,41 +520,41 @@ static BOOL test_realloc(void) p1 = talloc_size(root, 10); CHECK_SIZE(p1, 10); - p1 = talloc_realloc(NULL, p1, 20); + p1 = talloc_realloc_size(NULL, p1, 20); CHECK_SIZE(p1, 20); talloc_new(p1); - p2 = talloc_realloc(p1, NULL, 30); + p2 = talloc_realloc_size(p1, NULL, 30); talloc_new(p1); - p2 = talloc_realloc(p1, p2, 40); + p2 = talloc_realloc_size(p1, p2, 40); CHECK_SIZE(p2, 40); CHECK_SIZE(root, 60); CHECK_BLOCKS(p1, 4); - p1 = talloc_realloc(NULL, p1, 20); + p1 = talloc_realloc_size(NULL, p1, 20); CHECK_SIZE(p1, 60); talloc_increase_ref_count(p2); - if (talloc_realloc(NULL, p2, 5) != NULL) { + if (talloc_realloc_size(NULL, p2, 5) != NULL) { printf("failed: talloc_realloc() on a referenced pointer should fail\n"); return False; } CHECK_BLOCKS(p1, 4); - talloc_realloc(NULL, p2, 0); - talloc_realloc(NULL, p2, 0); + talloc_realloc_size(NULL, p2, 0); + talloc_realloc_size(NULL, p2, 0); CHECK_BLOCKS(p1, 3); - if (talloc_realloc(NULL, p1, 0x7fffffff) != NULL) { + if (talloc_realloc_size(NULL, p1, 0x7fffffff) != NULL) { printf("failed: oversize talloc should fail\n"); return False; } - talloc_realloc(NULL, p1, 0); + talloc_realloc_size(NULL, p1, 0); CHECK_BLOCKS(root, 1); CHECK_SIZE(root, 0); -- cgit From 8b1512fc9bf73ade637c9f04974d8c01797d7bdc Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 7 Jan 2005 04:45:11 +0000 Subject: r4592: fixed typo from talloc testsuite fixup for the new syntax (This used to be commit 1177200dd9392c088f5b009f55390ad31c367e5f) --- source4/lib/talloc/testsuite.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index e7934a10f3..005474a2cc 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -645,7 +645,7 @@ static BOOL test_steal(void) talloc_free(root); - p1 = talloc_new(NULL); + p1 = talloc_size(NULL, 3); CHECK_SIZE(NULL, 3); talloc_free(p1); -- cgit From 35a2ced64a3c853289d7fa921e91724ce2998b79 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 7 Jan 2005 04:47:58 +0000 Subject: r4593: don't use the _p function in the testsuite, as when built standalone it doesn't use TALLOC_DEPRECATED (This used to be commit 2fe0e2528f14627832942f6404a4b1be4b556c97) --- source4/lib/talloc/testsuite.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 005474a2cc..d93894b520 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -432,13 +432,13 @@ static BOOL test_misc(void) CHECK_BLOCKS(p1, 3); talloc_free(p2); - d = talloc_array_p(p1, double, 0x20000000); + d = talloc_array(p1, double, 0x20000000); if (d) { printf("failed: integer overflow not detected\n"); return False; } - d = talloc_realloc_p(p1, d, double, 0x20000000); + d = talloc_realloc(p1, d, double, 0x20000000); if (d) { printf("failed: integer overflow not detected\n"); return False; @@ -583,14 +583,14 @@ static BOOL test_realloc_child(void) root = talloc_new(NULL); - el1 = talloc_p(root, struct el1); - el1->list = talloc_p(el1, struct el2 *); - el1->list[0] = talloc_p(el1->list, struct el2); + el1 = talloc(root, struct el1); + el1->list = talloc(el1, struct el2 *); + el1->list[0] = talloc(el1->list, struct el2); el1->list[0]->name = talloc_strdup(el1->list[0], "testing"); - el2 = talloc_p(el1->list, struct el2); + el2 = talloc(el1->list, struct el2); - el1->list = talloc_realloc_p(el1, el1->list, struct el2 *, 2); + el1->list = talloc_realloc(el1, el1->list, struct el2 *, 2); el1->list[1] = el2; talloc_free(root); @@ -609,10 +609,10 @@ static BOOL test_steal(void) root = talloc_new(NULL); - p1 = talloc_array_p(root, char, 10); + p1 = talloc_array(root, char, 10); CHECK_SIZE(p1, 10); - p2 = talloc_realloc_p(root, NULL, char, 20); + p2 = talloc_realloc(root, NULL, char, 20); CHECK_SIZE(p1, 10); CHECK_SIZE(root, 30); -- cgit From 1bdbd21eb23d5591f005da13f1868343a4395dbe Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sun, 9 Jan 2005 02:37:24 +0000 Subject: r4609: add a usefull data_blob_dup_talloc() macro metze (This used to be commit 11e006df1689d4b4b202bca640106fd789495284) --- source4/lib/talloc/talloc.h | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 8169782441..5ac5888876 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -62,6 +62,7 @@ typedef void TALLOC_CTX; #define data_blob(ptr, size) data_blob_named(ptr, size, "DATA_BLOB: "__location__) #define data_blob_talloc(ctx, ptr, size) data_blob_talloc_named(ctx, ptr, size, "DATA_BLOB: "__location__) +#define data_blob_dup_talloc(ctx, blob) data_blob_talloc_named(ctx, (blob)->data, (blob)->length, "DATA_BLOB: "__location__) #if TALLOC_DEPRECATED -- cgit From 0c440d6506db46fdc7a26f5ef2790b6f4644f6e5 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 11 Jan 2005 15:20:55 +0000 Subject: r4687: use struct type and location for easier finding metze (This used to be commit a88aac7a397972c52ca2fb192b58f2a172630a6e) --- source4/lib/talloc/talloc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 5ac5888876..cf03ce5952 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -37,7 +37,7 @@ typedef void TALLOC_CTX; #endif /* useful macros for creating type checked pointers */ -#define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) +#define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type ": " __location__) #define talloc_size(ctx, size) talloc_named_const(ctx, size, __location__) #define talloc_new(ctx) talloc_named_const(ctx, 0, "talloc_new: " __location__) -- cgit From 8ac3838d19d88842cf7c276637e9896b3cc1351b Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 11 Jan 2005 15:37:12 +0000 Subject: r4688: don't run male proto for lib/talloc/ metze (This used to be commit 4ab63d547903814318b74ea030bba9da0f36942f) --- source4/lib/talloc/config.mk | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 2f38fe04ed..fe8f0e929f 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -5,6 +5,7 @@ INIT_OBJ_FILES = \ lib/talloc/talloc.o REQUIRED_SUBSYSTEMS = \ LIBREPLACE +NOPROTO = YES # # End SUBSYSTEM LIBTALLOC ################################################ -- cgit From 90d65c2e85c8042391b8219eeaedd780e6eb3c7c Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 11 Jan 2005 15:38:25 +0000 Subject: r4689: - make talloc_report_depth() public - add talloc_parent() to return the parent context of a pointer these are very use full for debuging metze (This used to be commit 9b9501bc03ef8d4b53049f6b3531d06ed7ef7f89) --- source4/lib/talloc/talloc.c | 8 +++++++- source4/lib/talloc/talloc.h | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 6d11cb00e9..4c8cc31028 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -140,6 +140,12 @@ static struct talloc_chunk *talloc_parent_chunk(const void *ptr) return tc->parent; } +void *talloc_parent(const void *ptr) +{ + struct talloc_chunk *tc = talloc_parent_chunk(ptr); + return (void *)(tc+1); +} + /* Allocate a bit of memory as a child of an existing pointer */ @@ -695,7 +701,7 @@ static int talloc_reference_count(const void *ptr) /* report on memory usage by all children of a pointer, giving a full tree view */ -static void talloc_report_depth(const void *ptr, FILE *f, int depth) +void talloc_report_depth(const void *ptr, FILE *f, int depth) { struct talloc_chunk *c, *tc = talloc_chunk_from_ptr(ptr); diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index cf03ce5952..3483bb9e71 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -89,6 +89,8 @@ void *talloc_named(const void *context, size_t size, const char *fmt, ...) PRINTF_ATTRIBUTE(3,4); void *talloc_named_const(const void *context, size_t size, const char *name); const char *talloc_get_name(const void *ptr); +void talloc_report_depth(const void *ptr, FILE *f, int depth); +void *talloc_parent(const void *ptr); void *talloc_init(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2); int talloc_free(void *ptr); void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *name); -- cgit From 4b73689468ebe2e25a22d73fecb1a035b2303efd Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 12 Jan 2005 11:45:43 +0000 Subject: r4711: - deprecate talloc_destroy() - expanded the talloc_realloc() test a little (I was concerned about a possible bug, which turned out to be an illusion) - don't enable gcov by default in Makefile.talloc (This used to be commit 4ec47cc1083c4cdb780e548177631c5914bf677a) --- source4/lib/talloc/Makefile.talloc | 6 +++--- source4/lib/talloc/talloc.h | 5 ++--- source4/lib/talloc/testsuite.c | 17 ++++++++++++++--- 3 files changed, 19 insertions(+), 9 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.talloc b/source4/lib/talloc/Makefile.talloc index 88cb0e7159..a19b4ce311 100644 --- a/source4/lib/talloc/Makefile.talloc +++ b/source4/lib/talloc/Makefile.talloc @@ -1,6 +1,6 @@ -OPT = -g -ftest-coverage -fprofile-arcs -LIBS = -lgcov -#OPT = -g +#OPT = -g -ftest-coverage -fprofile-arcs +#LIBS = -lgcov +OPT = -O CFLAGS = $(OPT) -Wall diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 3483bb9e71..607ca4ca47 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -4,7 +4,7 @@ Unix SMB/CIFS implementation. Samba temporary memory allocation functions - Copyright (C) Andrew Tridgell 2004 + Copyright (C) Andrew Tridgell 2004-2005 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 @@ -54,8 +54,6 @@ typedef void TALLOC_CTX; #define talloc_memdup(t, p, size) _talloc_memdup(t, p, size, __location__) -#define talloc_destroy(ctx) talloc_free(ctx) - #define malloc_p(type) (type *)malloc(sizeof(type)) #define malloc_array_p(type, count) (type *)realloc_array(NULL, sizeof(type), count) #define realloc_p(p, type, count) (type *)realloc_array(p, sizeof(type), count) @@ -70,6 +68,7 @@ typedef void TALLOC_CTX; #define talloc_p(ctx, type) talloc(ctx, type) #define talloc_array_p(ctx, type, count) talloc_array(ctx, type, count) #define talloc_realloc_p(ctx, p, type, count) talloc_realloc(ctx, p, type, count) +#define talloc_destroy(ctx) talloc_free(ctx) #endif #ifndef PRINTF_ATTRIBUTE diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index d93894b520..bc1c18fdc1 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -575,7 +575,7 @@ static BOOL test_realloc_child(void) int count; struct el2 { const char *name; - } **list; + } **list, **list2, **list3; } *el1; struct el2 *el2; @@ -587,11 +587,22 @@ static BOOL test_realloc_child(void) el1->list = talloc(el1, struct el2 *); el1->list[0] = talloc(el1->list, struct el2); el1->list[0]->name = talloc_strdup(el1->list[0], "testing"); + + el1->list2 = talloc(el1, struct el2 *); + el1->list2[0] = talloc(el1->list2, struct el2); + el1->list2[0]->name = talloc_strdup(el1->list2[0], "testing2"); + + el1->list3 = talloc(el1, struct el2 *); + el1->list3[0] = talloc(el1->list3, struct el2); + el1->list3[0]->name = talloc_strdup(el1->list3[0], "testing2"); el2 = talloc(el1->list, struct el2); + el2 = talloc(el1->list2, struct el2); + el2 = talloc(el1->list3, struct el2); - el1->list = talloc_realloc(el1, el1->list, struct el2 *, 2); - el1->list[1] = el2; + el1->list = talloc_realloc(el1, el1->list, struct el2 *, 100); + el1->list2 = talloc_realloc(el1, el1->list2, struct el2 *, 200); + el1->list3 = talloc_realloc(el1, el1->list3, struct el2 *, 300); talloc_free(root); -- cgit From c710c0671fad507b07cbc2094244fe6f2f909955 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 12 Jan 2005 22:30:54 +0000 Subject: r4718: don't use the deprecated __va_copy() unless va_copy() is unavailable (This used to be commit 603ef69be075821e3ffe2084bb5cfb0bc9cce180) --- source4/lib/talloc/talloc.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 4c8cc31028..e05b196592 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -873,6 +873,8 @@ char *talloc_strndup(const void *t, const char *p, size_t n) #ifndef VA_COPY #ifdef HAVE_VA_COPY +#define VA_COPY(dest, src) va_copy(dest, src) +#elif defined(HAVE___VA_COPY) #define VA_COPY(dest, src) __va_copy(dest, src) #else #define VA_COPY(dest, src) (dest) = (src) -- cgit From 7b79694eadc288592729567c3caa7c70f6662760 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 16 Jan 2005 23:21:52 +0000 Subject: r4790: added type checking helper macros in talloc. These take advantage of the type names that talloc already keeps around for pointers, and allows the user to type check void* private pointers. It can also be used to implement polymorphism in C, as I'm sure someone would have pointed out to me sooner or later :-) (This used to be commit c283e1a3efac3a92e29a35856e20eb61ef4c221e) --- source4/lib/talloc/talloc.c | 19 ++++++++++++++ source4/lib/talloc/talloc.h | 14 ++++++---- source4/lib/talloc/talloc_guide.txt | 32 +++++++++++++++++++++++ source4/lib/talloc/testsuite.c | 51 ++++++++++++++++++++++++++++++++++--- 4 files changed, 107 insertions(+), 9 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index e05b196592..f6f7e899d1 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -424,6 +424,23 @@ const char *talloc_get_name(const void *ptr) return "UNNAMED"; } + +/* + check if a pointer has the given name. If it does, return the pointer, + otherwise return NULL +*/ +void *talloc_check_name(const void *ptr, const char *name) +{ + const char *pname; + if (ptr == NULL) return NULL; + pname = talloc_get_name(ptr); + if (pname == name || strcmp(pname, name) == 0) { + return discard_const_p(void, ptr); + } + return NULL; +} + + /* this is for compatibility with older versions of talloc */ @@ -1029,3 +1046,5 @@ void *talloc_autofree_context(void) } return cleanup_context; } + + diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 607ca4ca47..0a98881054 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -37,7 +37,7 @@ typedef void TALLOC_CTX; #endif /* useful macros for creating type checked pointers */ -#define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type ": " __location__) +#define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) #define talloc_size(ctx, size) talloc_named_const(ctx, size, __location__) #define talloc_new(ctx) talloc_named_const(ctx, 0, "talloc_new: " __location__) @@ -45,11 +45,11 @@ typedef void TALLOC_CTX; #define talloc_zero(ctx, type) (type *)_talloc_zero(ctx, sizeof(type), #type) #define talloc_zero_size(ctx, size) _talloc_zero(ctx, size, __location__) -#define talloc_zero_array(ctx, type, count) (type *)_talloc_zero_array(ctx, sizeof(type), count, __location__) -#define talloc_array(ctx, type, count) (type *)_talloc_array(ctx, sizeof(type), count, __location__) +#define talloc_zero_array(ctx, type, count) (type *)_talloc_zero_array(ctx, sizeof(type), count, #type) +#define talloc_array(ctx, type, count) (type *)_talloc_array(ctx, sizeof(type), count, #type) #define talloc_array_size(ctx, size, count) _talloc_array(ctx, size, count, __location__) -#define talloc_realloc(ctx, p, type, count) (type *)_talloc_realloc_array(ctx, p, sizeof(type), count, __location__) +#define talloc_realloc(ctx, p, type, count) (type *)_talloc_realloc_array(ctx, p, sizeof(type), count, #type) #define talloc_realloc_size(ctx, ptr, size) _talloc_realloc(ctx, ptr, size, __location__) #define talloc_memdup(t, p, size) _talloc_memdup(t, p, size, __location__) @@ -62,6 +62,9 @@ typedef void TALLOC_CTX; #define data_blob_talloc(ctx, ptr, size) data_blob_talloc_named(ctx, ptr, size, "DATA_BLOB: "__location__) #define data_blob_dup_talloc(ctx, blob) data_blob_talloc_named(ctx, (blob)->data, (blob)->length, "DATA_BLOB: "__location__) +#define talloc_set_type(ptr, type) talloc_set_name_const(ptr, #type) +#define talloc_get_type(ptr, type) (type *)talloc_check_name(ptr, #type) + #if TALLOC_DEPRECATED #define talloc_zero_p(ctx, type) talloc_zero(ctx, type) @@ -76,7 +79,7 @@ typedef void TALLOC_CTX; #endif -/* The following definitions come from lib/talloc.c */ +/* The following definitions come from talloc.c */ void *_talloc(const void *context, size_t size); void talloc_set_destructor(const void *ptr, int (*destructor)(void *)); void talloc_increase_ref_count(const void *ptr); @@ -88,6 +91,7 @@ void *talloc_named(const void *context, size_t size, const char *fmt, ...) PRINTF_ATTRIBUTE(3,4); void *talloc_named_const(const void *context, size_t size, const char *name); const char *talloc_get_name(const void *ptr); +void *talloc_check_name(const void *ptr, const char *name); void talloc_report_depth(const void *ptr, FILE *f, int depth); void *talloc_parent(const void *ptr); void *talloc_init(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2); diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index 30b7f64d67..927bd366fd 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -512,3 +512,35 @@ void *talloc_autofree_context(void); This is a handy utility function that returns a talloc context which will be automatically freed on program exit. This can be used to reduce the noise in memory leak reports. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void *talloc_check_name(const void *ptr, const char *name); + +This function checks if a pointer has the specified name. If it does +then the pointer is returned. It it doesn't then NULL is returned. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +(type *)talloc_get_type(const void *ptr, type); + +This macro allows you to do type checking on talloc pointers. It is +particularly useful for void* private pointers. It is equivalent to +this: + + (type *)talloc_check_name(ptr, #type) + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +talloc_set_type(const void *ptr, type); + +This macro allows you to force the name of a pointer to be a +particular type. This can be used in conjunction with +talloc_get_type() to do type checking on void* pointers. + +It is equivalent to this: + talloc_set_name_const(ptr, #type) + + + + diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index bc1c18fdc1..4a1074e045 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -609,6 +609,48 @@ static BOOL test_realloc_child(void) return True; } + +/* + test type checking +*/ +static BOOL test_type(void) +{ + void *root; + struct el1 { + int count; + }; + struct el2 { + int count; + }; + struct el1 *el1; + + printf("TESTING talloc type checking\n"); + + root = talloc_new(NULL); + + el1 = talloc(root, struct el1); + + el1->count = 1; + + if (talloc_get_type(el1, struct el1) != el1) { + printf("type check failed on el1\n"); + return False; + } + if (talloc_get_type(el1, struct el2) != NULL) { + printf("type check failed on el1 with el2\n"); + return False; + } + talloc_set_type(el1, struct el2); + if (talloc_get_type(el1, struct el2) != el1) { + printf("type set failed on el1 with el2\n"); + return False; + } + + talloc_free(root); + + return True; +} + /* test steal */ @@ -664,13 +706,13 @@ static BOOL test_steal(void) } /* - test ldb alloc fn + test talloc_realloc_fn */ -static BOOL test_ldb(void) +static BOOL test_realloc_fn(void) { void *root, *p1; - printf("TESTING LDB\n"); + printf("TESTING talloc_realloc_fn\n"); root = talloc_new(NULL); @@ -774,7 +816,8 @@ BOOL torture_local_talloc(void) ret &= test_realloc_child(); ret &= test_steal(); ret &= test_unref_reparent(); - ret &= test_ldb(); + ret &= test_realloc_fn(); + ret &= test_type(); if (ret) { ret &= test_speed(); } -- cgit From 6717dcca765e5286a36d89eebc5da2d167bcbef2 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 17 Jan 2005 02:52:10 +0000 Subject: r4793: minor doc updates (This used to be commit ad1af519eb1a138e44cc94676f845b8ba65e3371) --- source4/lib/talloc/talloc_guide.txt | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index 927bd366fd..eae6c5e564 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -32,10 +32,9 @@ If you think about this, then what this effectively gives you is an n-ary tree, where you can free any part of the tree with talloc_free(). -If you find this confusing, then I suggest you run the LOCAL-TALLOC -smbtorture test to watch talloc in action. You may also like to add -your own tests to source/lib/talloc/testsuite.c to clarify how some -particular situation is handled. +If you find this confusing, then I suggest you run the testsuite to +watch talloc in action. You may also like to add your own tests to +testsuite.c to clarify how some particular situation is handled. Performance @@ -74,6 +73,7 @@ well. Alternatively you can free just the child. The context argument to talloc() can be NULL, in which case a new top level context is created. + =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- void *talloc_size(const void *context, size_t size); @@ -81,12 +81,6 @@ The function talloc_size() should be used when you don't have a convenient type to pass to talloc(). Unlike talloc(), it is not type safe (as it returns a void *), so you are on your own for type checking. -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -void *talloc_p(const void *context, type); - -talloc_p() is a alias for talloc(). It only exists as a backwards -compatibity macro for code from the bad old days when talloc() was not -type safe. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- int talloc_free(void *ptr); @@ -491,10 +485,13 @@ The talloc_array() macro is equivalent to: except that it provides integer overflow protection for the multiply, returning NULL if the multiply overflows. + =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- void *talloc_array_size(const void *ctx, size_t size, uint_t count); -The talloc_array_size() function is useful when the type is not known +The talloc_array_size() function is useful when the type is not +known. It operates in the same way as talloc_array(), but takes a size +instead of a type. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- @@ -506,6 +503,7 @@ implementation encapsulates the functionality of malloc(), free() and realloc() in one call, which is why it is useful to be able to pass around a single function pointer. + =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- void *talloc_autofree_context(void); @@ -540,7 +538,3 @@ talloc_get_type() to do type checking on void* pointers. It is equivalent to this: talloc_set_name_const(ptr, #type) - - - - -- cgit From 784dde73bc2f59108c6f5123b9206851b97afc32 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 31 Jan 2005 04:51:50 +0000 Subject: r5119: fflush after talloc reports to ensure they are fully on disk when using tee (This used to be commit e73e49aaa64f6f976918f087cf196b00eecc3eb2) --- source4/lib/talloc/talloc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index f6f7e899d1..291ee5a8bf 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -757,6 +757,7 @@ void talloc_report_full(const void *ptr, FILE *f) (unsigned long)talloc_total_blocks(ptr)); talloc_report_depth(ptr, f, 1); + fflush(f); } /* @@ -784,7 +785,7 @@ void talloc_report(const void *ptr, FILE *f) (unsigned long)talloc_total_size(c+1), (unsigned long)talloc_total_blocks(c+1)); } - + fflush(f); } /* -- cgit From dd0d8b2a89309302e94c3fec1c06ce769a1fec60 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 31 Jan 2005 16:36:57 +0000 Subject: r5142: fix compiler warning metze (This used to be commit d8aeb69ea85cc0df89e213482c446eb8e793bc86) --- source4/lib/talloc/testsuite.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 4a1074e045..967874917d 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -641,7 +641,7 @@ static BOOL test_type(void) return False; } talloc_set_type(el1, struct el2); - if (talloc_get_type(el1, struct el2) != el1) { + if (talloc_get_type(el1, struct el2) != (struct el2 *)el1) { printf("type set failed on el1 with el2\n"); return False; } -- cgit From 340d35be2d3f29a3176d86c0960398c2e36f921f Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 22 Mar 2005 04:22:39 +0000 Subject: r5937: - performance improvement to talloc_asprintf_append() - allow standalone talloc to use gcc printf attributes (This used to be commit e25aa54e962796e6e7385afed57aa287ef6f869d) --- source4/lib/talloc/talloc.c | 7 ++----- source4/lib/talloc/talloc.h | 8 ++++++++ 2 files changed, 10 insertions(+), 5 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 291ee5a8bf..72765448c7 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -946,16 +946,13 @@ static char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) PRINT static char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) { + struct talloc_chunk *tc = talloc_chunk_from_ptr(s); int len, s_len; va_list ap2; VA_COPY(ap2, ap); - if (s) { - s_len = strlen(s); - } else { - s_len = 0; - } + s_len = tc->size - 1; len = vsnprintf(NULL, 0, fmt, ap2); s = talloc_realloc(NULL, s, char, s_len + len+1); diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 0a98881054..f639f3c8cf 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -75,8 +75,16 @@ typedef void TALLOC_CTX; #endif #ifndef PRINTF_ATTRIBUTE +#if (__GNUC__ >= 3) +/** Use gcc attribute to check printf fns. a1 is the 1-based index of + * the parameter containing the format, and a2 the index of the first + * argument. Note that some gcc 2.x versions don't handle this + * properly **/ +#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2))) +#else #define PRINTF_ATTRIBUTE(a1, a2) #endif +#endif /* The following definitions come from talloc.c */ -- cgit From 689a803ac7600c1d8bff5e33cce1c098a332c02a Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 22 Mar 2005 05:51:41 +0000 Subject: r5938: - allow NULL string argument to talloc_vasprintf_append() - default to using va_copy(), thus assuming a modern libc (This used to be commit 3060b26c9e745330682f6209d97e723113b65b56) --- source4/lib/talloc/talloc.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 72765448c7..31796a247b 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -36,6 +36,8 @@ #include #include #include "talloc.h" +/* assume a modern system */ +#define HAVE_VA_COPY #endif /* use this to force every realloc to change the pointer, to stress test @@ -946,10 +948,16 @@ static char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) PRINT static char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) { - struct talloc_chunk *tc = talloc_chunk_from_ptr(s); + struct talloc_chunk *tc; int len, s_len; va_list ap2; + if (s == NULL) { + return talloc_vasprintf(NULL, fmt, ap); + } + + tc = talloc_chunk_from_ptr(s); + VA_COPY(ap2, ap); s_len = tc->size - 1; -- cgit From da5349dede9d4add974da3078437a8513a39bbae Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 22 Mar 2005 06:00:51 +0000 Subject: r5939: improve talloc_realloc() docs after feedback from lifeless (This used to be commit 301cbb0d12919f83d6b735c2e23b49fb49d5394d) --- source4/lib/talloc/talloc_guide.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index eae6c5e564..4ab0f8eacc 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -267,9 +267,13 @@ particularly useful for creating a new temporary working context. (type *)talloc_realloc(const void *context, void *ptr, type, count); The talloc_realloc() macro changes the size of a talloc -pointer. It has the following equivalences: +pointer. The "count" argument is the number of elements of type "type" +that you want the resulting pointer to hold. + +talloc_realloc() has the following equivalences: talloc_realloc(context, NULL, type, 1) ==> talloc(context, type); + talloc_realloc(context, NULL, type, N) ==> talloc_array(context, type, N); talloc_realloc(context, ptr, type, 0) ==> talloc_free(ptr); The "context" argument is only used if "ptr" is not NULL, otherwise it -- cgit From ae1ea5619b18be9c37f9647756e06718b17b88f2 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Thu, 24 Mar 2005 08:00:15 +0000 Subject: r6033: Patch from 'lifeless' to clarify behaviour with NULL pointers. Andrew Bartlett (This used to be commit 48c518796797f021c9c7f319ca8cd0a0c185f64c) --- source4/lib/talloc/talloc.c | 3 ++- source4/lib/talloc/talloc_guide.txt | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 31796a247b..0d78dd8d24 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -609,7 +609,8 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n /* move a lump of memory from one talloc context to another return the - ptr on success, or NULL if it could not be transferred + ptr on success, or NULL if it could not be transferred. + passing NULL as ptr will always return NULL with no side effects. */ void *talloc_steal(const void *new_ctx, const void *ptr) { diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index 4ab0f8eacc..aca3ab4937 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -306,6 +306,7 @@ NOTE: It is possible to produce loops in the parent/child relationship if you are not careful with talloc_steal(). No guarantees are provided as to your sanity or the safety of your data if you do this. +talloc_steal (new_ctx, NULL) will return NULL with no sideeffects. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- off_t talloc_total_size(const void *ptr); -- cgit From 0d36266cd4e0034ca5ed2755084a64db3e235ac4 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 26 Mar 2005 10:47:44 +0000 Subject: r6075: added talloc_enable_null_tracking() (asked for by lifeless) (This used to be commit 40b8ee186af3e7f771c680dbbb03fdcf559bf103) --- source4/lib/talloc/talloc.c | 14 ++++++++++++-- source4/lib/talloc/talloc.h | 1 + source4/lib/talloc/talloc_guide.txt | 8 ++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 0d78dd8d24..661282a87d 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -811,12 +811,22 @@ static void talloc_report_null_full(void) } } +/* + enable tracking of the NULL context +*/ +void talloc_enable_null_tracking(void) +{ + if (null_context == NULL) { + null_context = talloc_named_const(NULL, 0, "null_context"); + } +} + /* enable leak reporting on exit */ void talloc_enable_leak_report(void) { - null_context = talloc_named_const(NULL, 0, "null_context"); + talloc_enable_null_tracking(); atexit(talloc_report_null); } @@ -825,7 +835,7 @@ void talloc_enable_leak_report(void) */ void talloc_enable_leak_report_full(void) { - null_context = talloc_named_const(NULL, 0, "null_context"); + talloc_enable_null_tracking(); atexit(talloc_report_null_full); } diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index f639f3c8cf..8b448f63c5 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -110,6 +110,7 @@ off_t talloc_total_size(const void *ptr); off_t talloc_total_blocks(const void *ptr); void talloc_report_full(const void *ptr, FILE *f); void talloc_report(const void *ptr, FILE *f); +void talloc_enable_null_tracking(void); void talloc_enable_leak_report(void); void talloc_enable_leak_report_full(void); void *_talloc_zero(const void *ctx, size_t size, const char *name); diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index aca3ab4937..7d6dfa5cb2 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -408,6 +408,14 @@ full talloc report on 'root' (total 18 bytes in 8 blocks) x1 contains 1 bytes in 1 blocks (ref 0) +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void talloc_enable_null_tracking(void); + +This enables tracking of the NULL memory context without enabling leak +reporting on exit. Useful for when you want to do your own leak +reporting call via talloc_report_null_full(); + + =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- (type *)talloc_zero(const void *ctx, type); -- cgit From acb6110d5ddfdf9c6301d12ae0cc2fe710618b04 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 26 Apr 2005 03:03:54 +0000 Subject: r6474: - added a simple talloc web page at http://talloc.samba.org/ - make it easier to seperataly build talloc for other projects (This used to be commit 27b987d267603977be8798e7e5412b91e18a316b) --- source4/lib/talloc/Makefile.in | 20 ++++++++++++++++ source4/lib/talloc/Makefile.talloc | 16 ------------- source4/lib/talloc/autogen.sh | 7 ++++++ source4/lib/talloc/configure.in | 7 ++++++ source4/lib/talloc/web/index.html | 47 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 81 insertions(+), 16 deletions(-) create mode 100644 source4/lib/talloc/Makefile.in delete mode 100644 source4/lib/talloc/Makefile.talloc create mode 100755 source4/lib/talloc/autogen.sh create mode 100644 source4/lib/talloc/configure.in create mode 100644 source4/lib/talloc/web/index.html (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in new file mode 100644 index 0000000000..ff4fc7f561 --- /dev/null +++ b/source4/lib/talloc/Makefile.in @@ -0,0 +1,20 @@ +#OPT = -g -ftest-coverage -fprofile-arcs +#LIBS = -lgcov +OPT = -O + +CFLAGS = $(OPT) -Wall + +LIBOBJ = talloc.o + +all: libtalloc.a testsuite + +testsuite: $(LIBOBJ) testsuite.o + $(CC) $(CFLAGS) -o testsuite testsuite.o $(LIBOBJ) $(LIBS) + +libtalloc.a: libtalloc.a($(LIBOBJ)) + +clean: + rm -f *~ *.o testsuite *.gc?? + +gcov: + gcov talloc.c diff --git a/source4/lib/talloc/Makefile.talloc b/source4/lib/talloc/Makefile.talloc deleted file mode 100644 index a19b4ce311..0000000000 --- a/source4/lib/talloc/Makefile.talloc +++ /dev/null @@ -1,16 +0,0 @@ -#OPT = -g -ftest-coverage -fprofile-arcs -#LIBS = -lgcov -OPT = -O - -CFLAGS = $(OPT) -Wall - -all: testsuite - -testsuite: talloc.o testsuite.o - $(CC) $(CFLAGS) -o testsuite testsuite.o talloc.o $(LIBS) - -clean: - rm -f *~ *.o testsuite *.gc?? - -gcov: - gcov talloc.c diff --git a/source4/lib/talloc/autogen.sh b/source4/lib/talloc/autogen.sh new file mode 100755 index 0000000000..cdd7fd2e04 --- /dev/null +++ b/source4/lib/talloc/autogen.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +(autoheader && autoconf) || exit 1 + +echo "Now run ./configure and then make." +exit 0 + diff --git a/source4/lib/talloc/configure.in b/source4/lib/talloc/configure.in new file mode 100644 index 0000000000..5c30200118 --- /dev/null +++ b/source4/lib/talloc/configure.in @@ -0,0 +1,7 @@ +AC_DEFUN([SMB_MODULE_DEFAULT], [echo -n ""]) +AC_DEFUN([SMB_LIBRARY_ENABLE], [echo -n ""]) +AC_INIT(talloc.h) +AC_PROG_CC +AC_PATH_PROG(GCOV,gcov) +sinclude(config.m4) +AC_OUTPUT(Makefile) diff --git a/source4/lib/talloc/web/index.html b/source4/lib/talloc/web/index.html new file mode 100644 index 0000000000..2a6c2d0768 --- /dev/null +++ b/source4/lib/talloc/web/index.html @@ -0,0 +1,47 @@ + + + +talloc + + + +

talloc

+ +talloc is a hierarchical pool based memory allocator with +destructors. It is the core memory allocator used in Samba4, and has +made a huge difference in many aspects of Samba4 development.

+ +To get started with talloc, I would recommend you read the talloc guide. + +

Discussion and bug reports

+ +talloc does not currently have its own mailing list or bug tracking +system. For now, please use the samba-technical +mailing list, and the Samba +bugzilla bug tracking system. + +

Download

+ +You can download the latest release either via rsync or anonymous +svn. To fetch via svn use the following command: + +
+  svn co svn://svnanon.samba.org/samba/branches/SAMBA_4_0/source/lib/talloc talloc
+
+ +To fetch via rsync use this command: + +
+  rsync -Pavz samba.org::ftp/unpacked/samba4/source/lib/talloc .
+
+ +
+ +Andrew Tridgell
+talloc AT tridgell.net +
+ + + -- cgit From 26a625e85738b37e5323c4612916ccce89ebb0fa Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 26 Apr 2005 03:42:02 +0000 Subject: r6477: Remove call to autoheader as autogenerated header files are not used by talloc (This used to be commit 5ca8a852067c34fed86f70be7f157714ecdd5501) --- source4/lib/talloc/autogen.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/autogen.sh b/source4/lib/talloc/autogen.sh index cdd7fd2e04..94148edf69 100755 --- a/source4/lib/talloc/autogen.sh +++ b/source4/lib/talloc/autogen.sh @@ -1,6 +1,6 @@ #!/bin/sh -(autoheader && autoconf) || exit 1 +autoconf || exit 1 echo "Now run ./configure and then make." exit 0 -- cgit From 9ced235daba8cb6b516eedb857569de8da1aeb5c Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 26 Apr 2005 03:59:59 +0000 Subject: r6478: Add 'make install' and a pkg-config file (This used to be commit c8e1b7542736bd674b8407872dbbe3a9941fce59) --- source4/lib/talloc/Makefile.in | 9 +++++++++ source4/lib/talloc/configure.in | 2 +- source4/lib/talloc/talloc.pc.in | 10 ++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 source4/lib/talloc/talloc.pc.in (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index ff4fc7f561..a3dd3f3e0b 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -1,6 +1,10 @@ #OPT = -g -ftest-coverage -fprofile-arcs #LIBS = -lgcov OPT = -O +prefix = @prefix@ +exec_prefix = @exec_prefix@ +includedir = @includedir@ +libdir = @libdir@ CFLAGS = $(OPT) -Wall @@ -13,6 +17,11 @@ testsuite: $(LIBOBJ) testsuite.o libtalloc.a: libtalloc.a($(LIBOBJ)) +install: + cp libtalloc.a $(libdir) + cp talloc.h $(includedir) + cp talloc.pc $(libdir)/pkgconfig + clean: rm -f *~ *.o testsuite *.gc?? diff --git a/source4/lib/talloc/configure.in b/source4/lib/talloc/configure.in index 5c30200118..0ebbde9fcf 100644 --- a/source4/lib/talloc/configure.in +++ b/source4/lib/talloc/configure.in @@ -4,4 +4,4 @@ AC_INIT(talloc.h) AC_PROG_CC AC_PATH_PROG(GCOV,gcov) sinclude(config.m4) -AC_OUTPUT(Makefile) +AC_OUTPUT(Makefile talloc.pc) diff --git a/source4/lib/talloc/talloc.pc.in b/source4/lib/talloc/talloc.pc.in new file mode 100644 index 0000000000..7f9ef754cb --- /dev/null +++ b/source4/lib/talloc/talloc.pc.in @@ -0,0 +1,10 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: talloc +Description: A hierarchical pool based memory system with destructors +Version: 4.0 +Libs: @LIBS@ -L${libdir} -ltalloc +Cflags: -I${includedir} @CFLAGS@ -- cgit From a53548d0741421b57b450d3ef62d3ac42c233030 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 28 Apr 2005 14:54:17 +0000 Subject: r6513: Commit talloc_free_children. Volker (This used to be commit 9fa26d2c971a7baee64d8938e31909cac80f0e5a) --- source4/lib/talloc/talloc.c | 57 ++++++++++++++++++++++++------------- source4/lib/talloc/talloc_guide.txt | 8 ++++++ 2 files changed, 45 insertions(+), 20 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 661282a87d..da3a2300b0 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -461,6 +461,42 @@ void *talloc_init(const char *fmt, ...) return ptr; } +/* + this is a replacement for the Samba3 talloc_destroy_pool functionality. It + should probably not be used in new code. It's in here to keep the talloc + code consistent across Samba 3 and 4. +*/ +void talloc_free_children(void *ptr) +{ + struct talloc_chunk *tc; + + if (ptr == NULL) { + return; + } + + tc = talloc_chunk_from_ptr(ptr); + + while (tc->child) { + /* we need to work out who will own an abandoned child + if it cannot be freed. In priority order, the first + choice is owner of any remaining reference to this + pointer, the second choice is our parent, and the + final choice is the null context. */ + void *child = tc->child+1; + const void *new_parent = null_context; + if (tc->child->refs) { + struct talloc_chunk *p = talloc_parent_chunk(tc->child->refs); + if (p) new_parent = p+1; + } + if (talloc_free(child) == -1) { + if (new_parent == null_context) { + struct talloc_chunk *p = talloc_parent_chunk(ptr); + if (p) new_parent = p+1; + } + talloc_steal(new_parent, child); + } + } +} /* free a talloc pointer. This also frees all child pointers of this @@ -498,26 +534,7 @@ int talloc_free(void *ptr) tc->destructor = NULL; } - while (tc->child) { - /* we need to work out who will own an abandoned child - if it cannot be freed. In priority order, the first - choice is owner of any remaining reference to this - pointer, the second choice is our parent, and the - final choice is the null context. */ - void *child = tc->child+1; - const void *new_parent = null_context; - if (tc->child->refs) { - struct talloc_chunk *p = talloc_parent_chunk(tc->child->refs); - if (p) new_parent = p+1; - } - if (talloc_free(child) == -1) { - if (new_parent == null_context) { - struct talloc_chunk *p = talloc_parent_chunk(ptr); - if (p) new_parent = p+1; - } - talloc_steal(new_parent, child); - } - } + talloc_free_children(ptr); if (tc->parent) { _TLIST_REMOVE(tc->parent->child, tc); diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index 7d6dfa5cb2..55349ec05b 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -105,6 +105,14 @@ For more control on which parent is removed, see talloc_unlink() talloc_free() operates recursively on its children. +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +int talloc_free_children(void *ptr); + +The talloc_free_children() walks along the list of all children of a +talloc context and talloc_free()s only the children, not the context +itself. + + =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- void *talloc_reference(const void *context, const void *ptr); -- cgit From 88f0a6e5e26e42fe80c0b907dabdcb16071aeff7 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 5 May 2005 22:31:49 +0000 Subject: r6622: Add talloc manpage in DocBook XML, based on SGML version by Garry Williams (This used to be commit 62550eac1e56e95c8080a0519579fd97ee5d465a) --- source4/lib/talloc/Makefile.in | 13 +- source4/lib/talloc/configure.in | 1 + source4/lib/talloc/talloc.3.xml | 637 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 650 insertions(+), 1 deletion(-) create mode 100644 source4/lib/talloc/talloc.3.xml (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index a3dd3f3e0b..f3fdf5f01c 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -5,6 +5,8 @@ prefix = @prefix@ exec_prefix = @exec_prefix@ includedir = @includedir@ libdir = @libdir@ +mandir = @mandir@ +XSLTPROC = @XSLTPROC@ CFLAGS = $(OPT) -Wall @@ -17,10 +19,19 @@ testsuite: $(LIBOBJ) testsuite.o libtalloc.a: libtalloc.a($(LIBOBJ)) -install: +install: all doc cp libtalloc.a $(libdir) cp talloc.h $(includedir) cp talloc.pc $(libdir)/pkgconfig + cp talloc.3 $(mandir)/man3 + +doc: talloc.3 + +%.3: %.3.xml + $(XSLTPROC) -o $@ http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< + +%.html: %.xml + $(XSLTPROC) -o $@ http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl $< clean: rm -f *~ *.o testsuite *.gc?? diff --git a/source4/lib/talloc/configure.in b/source4/lib/talloc/configure.in index 0ebbde9fcf..c0e307ab05 100644 --- a/source4/lib/talloc/configure.in +++ b/source4/lib/talloc/configure.in @@ -2,6 +2,7 @@ AC_DEFUN([SMB_MODULE_DEFAULT], [echo -n ""]) AC_DEFUN([SMB_LIBRARY_ENABLE], [echo -n ""]) AC_INIT(talloc.h) AC_PROG_CC +AC_PATH_PROG(XSLTPROC,xsltproc) AC_PATH_PROG(GCOV,gcov) sinclude(config.m4) AC_OUTPUT(Makefile talloc.pc) diff --git a/source4/lib/talloc/talloc.3.xml b/source4/lib/talloc/talloc.3.xml new file mode 100644 index 0000000000..7b254ae7c7 --- /dev/null +++ b/source4/lib/talloc/talloc.3.xml @@ -0,0 +1,637 @@ + + + + + talloc + 3 + + + talloc +hierarchical reference counted memory pool system with destructors + + +#include <talloc/talloc.h> + + DESCRIPTION + + If you are used to talloc from Samba3 then please read this + carefully, as talloc has changed a lot. + + + The new talloc is a hierarchical, reference counted memory pool + system with destructors. Quite a mouthful really, but not too bad + once you get used to it. + + + Perhaps the biggest change from Samba3 is that there is no + distinction between a "talloc context" and a "talloc pointer". Any + pointer returned from talloc() is itself a valid talloc context. + This means you can do this: + + + struct foo *X = talloc(mem_ctx, struct foo); + X->name = talloc_strdup(X, "foo"); + + + and the pointer X->name + would be a "child" of the talloc context X which is itself a child of + mem_ctx. So if you do + talloc_free(mem_ctx) then + it is all destroyed, whereas if you do talloc_free(X) then just X and X->name are destroyed, and if + you do talloc_free(X->name) then just + the name element of X is + destroyed. + + + If you think about this, then what this effectively gives you is an + n-ary tree, where you can free any part of the tree with + talloc_free(). + + + If you find this confusing, then I suggest you run the testsuite program to watch talloc + in action. You may also like to add your own tests to testsuite.c to clarify how some + particular situation is handled. + + + TALLOC API + + The following is a complete guide to the talloc API. Read it all at + least twice. + + (type *)talloc(const void *ctx, type); + + The talloc() macro is the core of the talloc library. It takes a + memory ctx and a type, and returns a pointer to a new + area of memory of the given type. + + + The returned pointer is itself a talloc context, so you can use + it as the ctx argument to more + calls to talloc() if you wish. + + + The returned pointer is a "child" of the supplied context. This + means that if you talloc_free() the ctx then the new child disappears as + well. Alternatively you can free just the child. + + + The ctx argument to talloc() + can be NULL, in which case a new top level context is created. + + + void *talloc_size(const void *ctx, size_t size); + + The function talloc_size() should be used when you don't have a + convenient type to pass to talloc(). Unlike talloc(), it is not + type safe (as it returns a void *), so you are on your own for + type checking. + + + int talloc_free(void *ptr); + + The talloc_free() function frees a piece of talloc memory, and + all its children. You can call talloc_free() on any pointer + returned by talloc(). + + + The return value of talloc_free() indicates success or failure, + with 0 returned for success and -1 for failure. The only + possible failure condition is if ptr had a destructor attached to it and + the destructor returned -1. See talloc_set_destructor() + for details on destructors. + + + If this pointer has an additional parent when talloc_free() is + called then the memory is not actually released, but instead the + most recently established parent is destroyed. See talloc_reference() + for details on establishing additional parents. + + + For more control on which parent is removed, see talloc_unlink(). + + + talloc_free() operates recursively on its children. + + + void *talloc_reference(const void *ctx, const void *ptr); + + The talloc_reference() function makes ctx an additional parent of ptr. + + + The return value of talloc_reference() is always the original + pointer ptr, unless talloc ran + out of memory in creating the reference in which case it will + return NULL (each additional reference consumes around 48 bytes + of memory on intel x86 platforms). + + + If ptr is NULL, then the + function is a no-op, and simply returns NULL. + + + After creating a reference you can free it in one of the + following ways: + + + + + + you can talloc_free() any parent of the original pointer. + That will reduce the number of parents of this pointer by 1, + and will cause this pointer to be freed if it runs out of + parents. + + + + + you can talloc_free() the pointer itself. That will destroy + the most recently established parent to the pointer and leave + the pointer as a child of its current parent. + + + + + + For more control on which parent to remove, see talloc_unlink(). + + + int talloc_unlink(const void *ctx, const void *ptr); + + The talloc_unlink() function removes a specific parent from + ptr. The ctx passed must either be a context used + in talloc_reference() with this pointer, or must be a direct + parent of ptr. + + + Note that if the parent has already been removed using + talloc_free() then this function will fail and will return -1. + Likewise, if ptr is NULL, then + the function will make no modifications and return -1. + + + Usually you can just use talloc_free() instead of + talloc_unlink(), but sometimes it is useful to have the + additional control on which parent is removed. + + + void talloc_set_destructor(const void *ptr, int (*destructor)(void *)); + + The function talloc_set_destructor() sets the destructor for the pointer ptr. A destructor is a function that is called + when the memory used by a pointer is about to be released. The + destructor receives ptr as an + argument, and should return 0 for success and -1 for failure. + + + The destructor can do anything + it wants to, including freeing other pieces of memory. A common + use for destructors is to clean up operating system resources + (such as open file descriptors) contained in the structure the + destructor is placed on. + + + You can only place one destructor on a pointer. If you need more + than one destructor then you can create a zero-length child of + the pointer and place an additional destructor on that. + + + To remove a destructor call talloc_set_destructor() with NULL for + the destructor. + + + If your destructor attempts to talloc_free() the pointer that it + is the destructor for then talloc_free() will return -1 and the + free will be ignored. This would be a pointless operation + anyway, as the destructor is only called when the memory is just + about to go away. + + + void talloc_increase_ref_count(const void *<emphasis role="italic">ptr</emphasis>); + + The talloc_increase_ref_count(ptr) function is exactly equivalent to: + + talloc_reference(NULL, ptr); + + You can use either syntax, depending on which you think is + clearer in your code. + + + void talloc_set_name(const void *ptr, const char *fmt, ...); + + Each talloc pointer has a "name". The name is used principally + for debugging purposes, although it is also possible to set and + get the name on a pointer in as a way of "marking" pointers in + your code. + + + The main use for names on pointer is for "talloc reports". See + talloc_report() + and talloc_report_full() + for details. Also see talloc_enable_leak_report() + and talloc_enable_leak_report_full(). + + + The talloc_set_name() function allocates memory as a child of the + pointer. It is logically equivalent to: + + talloc_set_name_const(ptr, talloc_asprintf(ptr, fmt, ...)); + + Note that multiple calls to talloc_set_name() will allocate more + memory without releasing the name. All of the memory is released + when the ptr is freed using talloc_free(). + + + void talloc_set_name_const(const void *<emphasis role="italic">ptr</emphasis>, const char *<emphasis role="italic">name</emphasis>); + + The function talloc_set_name_const() is just like + talloc_set_name(), but it takes a string constant, and is much + faster. It is extensively used by the "auto naming" macros, such + as talloc_p(). + + + This function does not allocate any memory. It just copies the + supplied pointer into the internal representation of the talloc + ptr. This means you must not pass a name pointer to memory that will + disappear before ptr is freed + with talloc_free(). + + + void *talloc_named(const void *<emphasis role="italic">ctx</emphasis>, size_t <emphasis role="italic">size</emphasis>, const char *<emphasis role="italic">fmt</emphasis>, ...); + + The talloc_named() function creates a named talloc pointer. It + is equivalent to: + + ptr = talloc_size(ctx, size); +talloc_set_name(ptr, fmt, ....); + + void *talloc_named_const(const void *<emphasis role="italic">ctx</emphasis>, size_t <emphasis role="italic">size</emphasis>, const char *<emphasis role="italic">name</emphasis>); + + This is equivalent to: + + ptr = talloc_size(ctx, size); +talloc_set_name_const(ptr, name); + + const char *talloc_get_name(const void *<emphasis role="italic">ptr</emphasis>); + + This returns the current name for the given talloc pointer, + ptr. See talloc_set_name() + for details. + + + void *talloc_init(const char *<emphasis role="italic">fmt</emphasis>, ...); + + This function creates a zero length named talloc context as a top + level context. It is equivalent to: + + talloc_named(NULL, 0, fmt, ...); + + void *talloc_new(void *<emphasis role="italic">ctx</emphasis>); + + This is a utility macro that creates a new memory context hanging + off an exiting context, automatically naming it "talloc_new: + __location__" where __location__ is the source line it is called + from. It is particularly useful for creating a new temporary + working context. + + + (<emphasis role="italic">type</emphasis> *)talloc_realloc(const void *<emphasis role="italic">ctx</emphasis>, void *<emphasis role="italic">ptr</emphasis>, <emphasis role="italic">type</emphasis>, <emphasis role="italic">count</emphasis>); + + The talloc_realloc() macro changes the size of a talloc pointer. + It has the following equivalences: + + talloc_realloc(ctx, NULL, type, 1) ==> talloc(ctx, type); +talloc_realloc(ctx, ptr, type, 0) ==> talloc_free(ptr); + + The ctx argument is only used + if ptr is not NULL, otherwise + it is ignored. + + + talloc_realloc() returns the new pointer, or NULL on failure. + The call will fail either due to a lack of memory, or because the + pointer has more than one parent (see talloc_reference()). + + + void *talloc_realloc_size(const void *ctx, void *ptr, size_t size); + + the talloc_realloc_size() function is useful when the type is not + known so the type-safe talloc_realloc() cannot be used. + + + void *talloc_steal(const void *<emphasis role="italic">new_ctx</emphasis>, const void *<emphasis role="italic">ptr</emphasis>); + + The talloc_steal() function changes the parent context of a + talloc pointer. It is typically used when the context that the + pointer is currently a child of is going to be freed and you wish + to keep the memory for a longer time. + + + The talloc_steal() function returns the pointer that you pass it. + It does not have any failure modes. + + + NOTE: It is possible to produce loops in the parent/child + relationship if you are not careful with talloc_steal(). No + guarantees are provided as to your sanity or the safety of your + data if you do this. + + + off_t talloc_total_size(const void *<emphasis role="italic">ptr</emphasis>); + + The talloc_total_size() function returns the total size in bytes + used by this pointer and all child pointers. Mostly useful for + debugging. + + + Passing NULL is allowed, but it will only give a meaningful + result if talloc_enable_leak_report() or + talloc_enable_leak_report_full() has been called. + + + off_t talloc_total_blocks(const void *<emphasis role="italic">ptr</emphasis>); + + The talloc_total_blocks() function returns the total memory block + count used by this pointer and all child pointers. Mostly useful + for debugging. + + + Passing NULL is allowed, but it will only give a meaningful + result if talloc_enable_leak_report() or + talloc_enable_leak_report_full() has been called. + + + void talloc_report(const void *ptr, FILE *f); + + The talloc_report() function prints a summary report of all + memory used by ptr. One line + of report is printed for each immediate child of ptr, showing the + total memory and number of blocks used by that child. + + + You can pass NULL for the pointer, in which case a report is + printed for the top level memory context, but only if + talloc_enable_leak_report() or talloc_enable_leak_report_full() + has been called. + + + void talloc_report_full(const void *<emphasis role="italic">ptr</emphasis>, FILE *<emphasis role="italic">f</emphasis>); + + This provides a more detailed report than talloc_report(). It + will recursively print the entire tree of memory referenced by + the pointer. References in the tree are shown by giving the name + of the pointer that is referenced. + + + You can pass NULL for the pointer, in which case a report is + printed for the top level memory context, but only if + talloc_enable_leak_report() or talloc_enable_leak_report_full() + has been called. + + + void talloc_enable_leak_report(void); + + This enables calling of talloc_report(NULL, stderr) when the + program exits. In Samba4 this is enabled by using the + --leak-report command line option. + + + For it to be useful, this function must be called before any + other talloc function as it establishes a "null context" that + acts as the top of the tree. If you don't call this function + first then passing NULL to talloc_report() or + talloc_report_full() won't give you the full tree printout. + + + Here is a typical talloc report: + + talloc report on 'null_context' (total 267 bytes in 15 blocks) +libcli/auth/spnego_parse.c:55 contains 31 bytes in 2 blocks +libcli/auth/spnego_parse.c:55 contains 31 bytes in 2 blocks +iconv(UTF8,CP850) contains 42 bytes in 2 blocks +libcli/auth/spnego_parse.c:55 contains 31 bytes in 2 blocks +iconv(CP850,UTF8) contains 42 bytes in 2 blocks +iconv(UTF8,UTF-16LE) contains 45 bytes in 2 blocks +iconv(UTF-16LE,UTF8) contains 45 bytes in 2 blocks + + + void talloc_enable_leak_report_full(void); + + This enables calling of talloc_report_full(NULL, stderr) when the + program exits. In Samba4 this is enabled by using the + --leak-report-full command line option. + + + For it to be useful, this function must be called before any + other talloc function as it establishes a "null context" that + acts as the top of the tree. If you don't call this function + first then passing NULL to talloc_report() or + talloc_report_full() won't give you the full tree printout. + + + Here is a typical full report: + + full talloc report on 'root' (total 18 bytes in 8 blocks) +p1 contains 18 bytes in 7 blocks (ref 0) + r1 contains 13 bytes in 2 blocks (ref 0) + reference to: p2 + p2 contains 1 bytes in 1 blocks (ref 1) + x3 contains 1 bytes in 1 blocks (ref 0) + x2 contains 1 bytes in 1 blocks (ref 0) + x1 contains 1 bytes in 1 blocks (ref 0) + + + (<emphasis role="italic">type</emphasis> *)talloc_zero(const void *<emphasis role="italic">ctx</emphasis>, <emphasis role="italic">type</emphasis>); + + The talloc_zero() macro is equivalent to: + + ptr = talloc(ctx, type); +if (ptr) memset(ptr, 0, sizeof(type)); + + void *talloc_zero_size(const void *<emphasis role="italic">ctx</emphasis>, size_t <emphasis role="italic">size</emphasis>) + + The talloc_zero_size() function is useful when you don't have a + known type. + + + void *talloc_memdup(const void *<emphasis role="italic">ctx</emphasis>, const void *<emphasis role="italic">p</emphasis>, size_t size); + + The talloc_memdup() function is equivalent to: + + ptr = talloc_size(ctx, size); +if (ptr) memcpy(ptr, p, size); + + char *talloc_strdup(const void *<emphasis role="italic">ctx</emphasis>, const char *<emphasis role="italic">p</emphasis>); + + The talloc_strdup() function is equivalent to: + + ptr = talloc_size(ctx, strlen(p)+1); +if (ptr) memcpy(ptr, p, strlen(p)+1); + + This function sets the name of the new pointer to the passed + string. This is equivalent to: + + talloc_set_name_const(ptr, ptr) + + char *talloc_strndup(const void *<emphasis role="italic">t</emphasis>, const char *<emphasis role="italic">p</emphasis>, size_t <emphasis role="italic">n</emphasis>); + + The talloc_strndup() function is the talloc equivalent of the C + library function strndup(3). + + + This function sets the name of the new pointer to the passed + string. This is equivalent to: + + talloc_set_name_const(ptr, ptr) + + char *talloc_vasprintf(const void *<emphasis role="italic">t</emphasis>, const char *<emphasis role="italic">fmt</emphasis>, va_list <emphasis role="italic">ap</emphasis>); + + The talloc_vasprintf() function is the talloc equivalent of the C + library function vasprintf(3). + + + char *talloc_asprintf(const void *<emphasis role="italic">t</emphasis>, const char *<emphasis role="italic">fmt</emphasis>, ...); + + The talloc_asprintf() function is the talloc equivalent of the C + library function asprintf(3). + + + This function sets the name of the new pointer to the passed + string. This is equivalent to: + + talloc_set_name_const(ptr, ptr) + + char *talloc_asprintf_append(char *s, const char *fmt, ...); + + The talloc_asprintf_append() function appends the given formatted + string to the given string. + + + (type *)talloc_array(const void *ctx, type, uint_t count); + + The talloc_array() macro is equivalent to: + + (type *)talloc_size(ctx, sizeof(type) * count); + + except that it provides integer overflow protection for the + multiply, returning NULL if the multiply overflows. + + + void *talloc_array_size(const void *ctx, size_t size, uint_t count); + + The talloc_array_size() function is useful when the type is not + known. It operates in the same way as talloc_array(), but takes a + size instead of a type. + + + void *talloc_realloc_fn(const void *ctx, void *ptr, size_t size) + + This is a non-macro version of talloc_realloc(), which is useful + as libraries sometimes want a realloc function pointer. A + realloc(3) implementation encapsulates the functionality of + malloc(3), free(3) and realloc(3) in one call, which is why it is + useful to be able to pass around a single function pointer. + + + void *talloc_autofree_context(void); + + This is a handy utility function that returns a talloc context + which will be automatically freed on program exit. This can be + used to reduce the noise in memory leak reports. + + + void *talloc_check_name(const void *ptr, const char *name); + + This function checks if a pointer has the specified name. If it does then the pointer is + returned. It it doesn't then NULL is returned. + + + (type *)talloc_get_type(const void *ptr, type); + + This macro allows you to do type checking on talloc pointers. It + is particularly useful for void* private pointers. It is + equivalent to this: + + (type *)talloc_check_name(ptr, #type) + + talloc_set_type(const void *ptr, type); + + This macro allows you to force the name of a pointer to be a + particular type. This can be + used in conjunction with talloc_get_type() to do type checking on + void* pointers. + + + It is equivalent to this: + + talloc_set_name_const(ptr, #type) + + + PERFORMANCE + + All the additional features of talloc(3) over malloc(3) do come at a + price. We have a simple performance test in Samba4 that measures + talloc() versus malloc() performance, and it seems that talloc() is + about 10% slower than malloc() on my x86 Debian Linux box. For + Samba, the great reduction in code complexity that we get by using + talloc makes this worthwhile, especially as the total overhead of + talloc/malloc in Samba is already quite small. + + + SEE ALSO + + malloc(3), strndup(3), vasprintf(3), asprintf(3), + + + + COPYRIGHT/LICENSE + + Copyright (C) Andrew Tridgell 2004 + + + 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. + + + -- cgit From 157a32956a111b8cffcfa8d1c62a0ca67cdc0b22 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Sat, 7 May 2005 15:22:45 +0000 Subject: r6645: Add talloc_get_size() function. Sometimes it is usefull to know this data. Simo. (This used to be commit df401847827ef660d8b9d55af9b27bb85bad6b5f) --- source4/lib/talloc/talloc.c | 10 ++++++++++ source4/lib/talloc/talloc.h | 1 + source4/lib/talloc/talloc_guide.txt | 8 ++++++++ 3 files changed, 19 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index da3a2300b0..248af6ea3e 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1082,3 +1082,13 @@ void *talloc_autofree_context(void) } +size_t talloc_get_size(const void *context) { + struct talloc_chunk *tc; + + if (context == NULL) + return 0; + + tc = talloc_chunk_from_ptr(context); + + return tc->size; +} diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 8b448f63c5..ab549cf624 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -126,6 +126,7 @@ void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name); void *talloc_realloc_fn(const void *context, void *ptr, size_t size); void *talloc_autofree_context(void); +size_t talloc_get_size(const void *ctx); #endif diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index 55349ec05b..c23ac77cad 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -559,3 +559,11 @@ talloc_get_type() to do type checking on void* pointers. It is equivalent to this: talloc_set_name_const(ptr, #type) + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +talloc_get_size(const void *ctx); + +This function lets you know the amount of memory alloced so far by +this context. It does NOT account for subcontext memory. +This can be used to calculate the size of an array. + -- cgit From 13bb5c34863c85f7d0cec13d7649ade242acbd52 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Sat, 7 May 2005 16:27:56 +0000 Subject: r6650: keep style consistent (This used to be commit 34671674ee326ea835408f8c1fdb105ea50ccc55) --- source4/lib/talloc/talloc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 248af6ea3e..cb5e91341e 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1082,7 +1082,8 @@ void *talloc_autofree_context(void) } -size_t talloc_get_size(const void *context) { +size_t talloc_get_size(const void *context) +{ struct talloc_chunk *tc; if (context == NULL) -- cgit From c1d31ac8fc22a46d3ce7d99058e48058464f4e06 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sat, 7 May 2005 22:10:26 +0000 Subject: r6660: Sorry for the spam... I think now I've got a version that should compile on trunk, 3_0 and 4_0. Volker (This used to be commit 777c489cad610fef140ec80d5644111b04a314c1) --- source4/lib/talloc/talloc.c | 11 ++++++++++- source4/lib/talloc/testsuite.c | 14 +++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index cb5e91341e..3650ab7f51 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -29,6 +29,16 @@ #ifdef _SAMBA_BUILD_ #include "includes.h" +#if ((SAMBA_VERSION_MAJOR==3)&&(SAMBA_VERSION_MINOR<9)) +/* This is to circumvent SAMBA3's paranoid malloc checker. Here in this file + * we trust ourselves... */ +#ifdef malloc +#undef malloc +#endif +#ifdef realloc +#undef realloc +#endif +#endif #else #include #include @@ -1081,7 +1091,6 @@ void *talloc_autofree_context(void) return cleanup_context; } - size_t talloc_get_size(const void *context) { struct talloc_chunk *tc; diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 967874917d..0447749abd 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -35,6 +35,10 @@ /* the test suite can be built standalone, or as part of Samba */ #ifndef _SAMBA_BUILD_ typedef enum {False=0,True=1} BOOL; +#endif + +/* Samba3 does not define the timeval functions below */ +#if !defined(_SAMBA_BUILD_) || ((SAMBA_VERSION_MAJOR==3)&&(SAMBA_VERSION_MINOR<9)) static struct timeval timeval_current(void) { @@ -51,6 +55,14 @@ static double timeval_elapsed(struct timeval *tv) } #endif /* _SAMBA_BUILD_ */ +#if SAMBA_VERSION_MAJOR<4 +#ifdef malloc +#undef malloc +#endif +#ifdef strdup +#undef strdup +#endif +#endif #define CHECK_SIZE(ptr, tsize) do { \ if (talloc_total_size(ptr) != (tsize)) { \ @@ -827,7 +839,7 @@ BOOL torture_local_talloc(void) -#ifndef _SAMBA_BUILD_ +#if !defined(_SAMBA_BUILD_) || ((SAMBA_VERSION_MAJOR==3)&&(SAMBA_VERSION_MINOR<9)) int main(void) { if (!torture_local_talloc()) { -- cgit From 30f817a2027d9f0629772458eb963cb3dd89864f Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 7 May 2005 22:54:51 +0000 Subject: r6661: fix up talloc autoconf to have a chance of working on the build farm (This used to be commit 9318744fd496a829a57fc8e0f21d4b26b1eb74c7) --- source4/lib/talloc/Makefile.in | 15 ++- source4/lib/talloc/configure.in | 1 + source4/lib/talloc/install-sh | 238 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 250 insertions(+), 4 deletions(-) create mode 100755 source4/lib/talloc/install-sh (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index f3fdf5f01c..b6bc271986 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -7,6 +7,7 @@ includedir = @includedir@ libdir = @libdir@ mandir = @mandir@ XSLTPROC = @XSLTPROC@ +INSTALLCMD=@INSTALL@ CFLAGS = $(OPT) -Wall @@ -20,10 +21,13 @@ testsuite: $(LIBOBJ) testsuite.o libtalloc.a: libtalloc.a($(LIBOBJ)) install: all doc - cp libtalloc.a $(libdir) - cp talloc.h $(includedir) - cp talloc.pc $(libdir)/pkgconfig - cp talloc.3 $(mandir)/man3 + ${INSTALLCMD} -d ${libdir} + ${INSTALLCMD} -m 755 libtalloc.a $(libdir) + ${INSTALLCMD} -d ${includedir} + ${INSTALLCMD} -m 644 talloc.h $(includedir) + ${INSTALLCMD} -m 644 talloc.pc $(libdir)/pkgconfig + ${INSTALLCMD} -d ${mandir}/man3 + ${INSTALLCMD} -m 644 talloc.3 $(mandir)/man3 doc: talloc.3 @@ -36,5 +40,8 @@ doc: talloc.3 clean: rm -f *~ *.o testsuite *.gc?? +test: testsuite + ./testsuite + gcov: gcov talloc.c diff --git a/source4/lib/talloc/configure.in b/source4/lib/talloc/configure.in index c0e307ab05..05e6577ce8 100644 --- a/source4/lib/talloc/configure.in +++ b/source4/lib/talloc/configure.in @@ -2,6 +2,7 @@ AC_DEFUN([SMB_MODULE_DEFAULT], [echo -n ""]) AC_DEFUN([SMB_LIBRARY_ENABLE], [echo -n ""]) AC_INIT(talloc.h) AC_PROG_CC +AC_PROG_INSTALL AC_PATH_PROG(XSLTPROC,xsltproc) AC_PATH_PROG(GCOV,gcov) sinclude(config.m4) diff --git a/source4/lib/talloc/install-sh b/source4/lib/talloc/install-sh new file mode 100755 index 0000000000..58719246f0 --- /dev/null +++ b/source4/lib/talloc/install-sh @@ -0,0 +1,238 @@ +#! /bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. +# + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 -- cgit From 3059fb2bc748a8ff1876d0f840a50b73139445f2 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 7 May 2005 23:14:17 +0000 Subject: r6662: add an installcheck target for talloc (This used to be commit 2f78428cfd823b499c60ac3cc02650183b760ef0) --- source4/lib/talloc/Makefile.in | 3 +++ 1 file changed, 3 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index b6bc271986..a986d7766c 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -45,3 +45,6 @@ test: testsuite gcov: gcov talloc.c + +installcheck: + $(MAKE) test -- cgit From 238f36b8995d959ffe5174054bf71228119ce802 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 7 May 2005 23:19:44 +0000 Subject: r6663: only use -Wall for gcc (This used to be commit b7fbe2173d45456c77fad9673073173704a1b266) --- source4/lib/talloc/Makefile.in | 4 +--- source4/lib/talloc/configure.in | 3 +++ 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index a986d7766c..ec906f9453 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -1,5 +1,3 @@ -#OPT = -g -ftest-coverage -fprofile-arcs -#LIBS = -lgcov OPT = -O prefix = @prefix@ exec_prefix = @exec_prefix@ @@ -9,7 +7,7 @@ mandir = @mandir@ XSLTPROC = @XSLTPROC@ INSTALLCMD=@INSTALL@ -CFLAGS = $(OPT) -Wall +CFLAGS = $(OPT) LIBOBJ = talloc.o diff --git a/source4/lib/talloc/configure.in b/source4/lib/talloc/configure.in index 05e6577ce8..2dfb66a17e 100644 --- a/source4/lib/talloc/configure.in +++ b/source4/lib/talloc/configure.in @@ -2,6 +2,9 @@ AC_DEFUN([SMB_MODULE_DEFAULT], [echo -n ""]) AC_DEFUN([SMB_LIBRARY_ENABLE], [echo -n ""]) AC_INIT(talloc.h) AC_PROG_CC +if test "x$GCC" = "xyes"; then + CFLAGS="$CFLAGS -Wall -W" +fi AC_PROG_INSTALL AC_PATH_PROG(XSLTPROC,xsltproc) AC_PATH_PROG(GCOV,gcov) -- cgit From 8797d0e29b4c4b2ee19fd7c17c9803fbd4a4d25f Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sun, 8 May 2005 13:22:55 +0000 Subject: r6664: Obey overrided CC in the Makefile (should fix build on several buildfarm hosts) (This used to be commit cbd7af4fcf72fd21b2a8ea2ee8f9f61f90f36f03) --- source4/lib/talloc/Makefile.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index ec906f9453..faf4382b39 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -5,7 +5,8 @@ includedir = @includedir@ libdir = @libdir@ mandir = @mandir@ XSLTPROC = @XSLTPROC@ -INSTALLCMD=@INSTALL@ +INSTALLCMD = @INSTALL@ +CC = @CC@ CFLAGS = $(OPT) -- cgit From 9add53863f4bfd870e8af102057a1084e9849d20 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 12 May 2005 02:54:42 +0000 Subject: r6741: prevent talloc_strndup() from reading one byte past the end of a buffer, giving valgrind errors (This used to be commit 7af0c547e0c0da3bc78a1ee6c2ab29114d8625cc) --- source4/lib/talloc/talloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 3650ab7f51..46abd89bac 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -919,7 +919,7 @@ char *talloc_strndup(const void *t, const char *p, size_t n) size_t len; char *ret; - for (len=0; p[len] && len Date: Mon, 16 May 2005 01:17:44 +0000 Subject: r6802: - fixed CFLAGS - don't fail if we don't have xsltproc (This used to be commit 235f5c510b4b68edf2a36d049bc0ff2afb73fd72) --- source4/lib/talloc/Makefile.in | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index faf4382b39..6efa9e1920 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -1,4 +1,3 @@ -OPT = -O prefix = @prefix@ exec_prefix = @exec_prefix@ includedir = @includedir@ @@ -7,8 +6,7 @@ mandir = @mandir@ XSLTPROC = @XSLTPROC@ INSTALLCMD = @INSTALL@ CC = @CC@ - -CFLAGS = $(OPT) +CFLAGS=@CFLAGS@ LIBOBJ = talloc.o @@ -26,15 +24,15 @@ install: all doc ${INSTALLCMD} -m 644 talloc.h $(includedir) ${INSTALLCMD} -m 644 talloc.pc $(libdir)/pkgconfig ${INSTALLCMD} -d ${mandir}/man3 - ${INSTALLCMD} -m 644 talloc.3 $(mandir)/man3 + test -z "$(XSLTPROC)" || ${INSTALLCMD} -m 644 talloc.3 $(mandir)/man3 doc: talloc.3 %.3: %.3.xml - $(XSLTPROC) -o $@ http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< + test -z "$(XSLTPROC)" || $(XSLTPROC) -o $@ http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< %.html: %.xml - $(XSLTPROC) -o $@ http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl $< + test -z "$(XSLTPROC)" || $(XSLTPROC) -o $@ http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl $< clean: rm -f *~ *.o testsuite *.gc?? -- cgit From 1f474c2692af8ba704a4071fe6e496cb43e19bae Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 16 May 2005 01:57:27 +0000 Subject: r6804: Add config.h for talloc (and use it) (This used to be commit c2ce09d38003fd43212de9cd08e4a781cc2aff88) --- source4/lib/talloc/autogen.sh | 1 + source4/lib/talloc/config.m4 | 9 +++++++++ source4/lib/talloc/configure.in | 2 ++ source4/lib/talloc/talloc.c | 18 +++++++++++++----- source4/lib/talloc/testsuite.c | 10 ++++++---- 5 files changed, 31 insertions(+), 9 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/autogen.sh b/source4/lib/talloc/autogen.sh index 94148edf69..e118019a39 100755 --- a/source4/lib/talloc/autogen.sh +++ b/source4/lib/talloc/autogen.sh @@ -1,6 +1,7 @@ #!/bin/sh autoconf || exit 1 +autoheader || exit 1 echo "Now run ./configure and then make." exit 0 diff --git a/source4/lib/talloc/config.m4 b/source4/lib/talloc/config.m4 index 298c6691b9..5f653e6577 100644 --- a/source4/lib/talloc/config.m4 +++ b/source4/lib/talloc/config.m4 @@ -1,3 +1,12 @@ if test x"$experimental" = x"yes"; then SMB_LIBRARY_ENABLE(libtalloc,YES) fi + +AC_CACHE_CHECK([for va_copy],samba_cv_HAVE_VA_COPY,[ +AC_TRY_LINK([#include +va_list ap1,ap2;], [va_copy(ap1,ap2);], +samba_cv_HAVE_VA_COPY=yes,samba_cv_HAVE_VA_COPY=no)]) +if test x"$samba_cv_HAVE_VA_COPY" = x"yes"; then + AC_DEFINE(HAVE_VA_COPY,1,[Whether va_copy() is available]) +fi + diff --git a/source4/lib/talloc/configure.in b/source4/lib/talloc/configure.in index 2dfb66a17e..436fe365da 100644 --- a/source4/lib/talloc/configure.in +++ b/source4/lib/talloc/configure.in @@ -8,5 +8,7 @@ fi AC_PROG_INSTALL AC_PATH_PROG(XSLTPROC,xsltproc) AC_PATH_PROG(GCOV,gcov) +AC_CHECK_HEADERS(stdint.h stdarg.h) +AC_CONFIG_HEADER(config.h) sinclude(config.m4) AC_OUTPUT(Makefile talloc.pc) diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 46abd89bac..ca2fd9a288 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -28,7 +28,6 @@ #ifdef _SAMBA_BUILD_ -#include "includes.h" #if ((SAMBA_VERSION_MAJOR==3)&&(SAMBA_VERSION_MINOR<9)) /* This is to circumvent SAMBA3's paranoid malloc checker. Here in this file * we trust ourselves... */ @@ -39,17 +38,26 @@ #undef realloc #endif #endif -#else +#endif + +#include "config.h" + #include #include #include + +#ifdef HAVE_STDARG_H #include +#else +#include +#endif + +#ifdef HAVE_STDINT_H #include -#include "talloc.h" -/* assume a modern system */ -#define HAVE_VA_COPY #endif +#include "talloc.h" + /* use this to force every realloc to change the pointer, to stress test code that might not cope */ #define ALWAYS_REALLOC 0 diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 0447749abd..0e3d334316 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -20,17 +20,19 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#ifdef _SAMBA_BUILD_ -#include "includes.h" -#else +#include "config.h" #include #include #include + +#ifdef HAVE_STDARG_H #include +#endif + #include #include + #include "talloc.h" -#endif /* the test suite can be built standalone, or as part of Samba */ #ifndef _SAMBA_BUILD_ -- cgit From 5251703764846f0ed2c06127d67f4b4f65d08945 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 16 May 2005 02:38:50 +0000 Subject: r6807: Fix in-tree build of talloc testsuite (This used to be commit 3541ebe31bef8ccae7a8a1ea4f451ddfbd24460a) --- source4/lib/talloc/testsuite.c | 7 ------- 1 file changed, 7 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 0e3d334316..1d5665c338 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -34,13 +34,7 @@ #include "talloc.h" -/* the test suite can be built standalone, or as part of Samba */ -#ifndef _SAMBA_BUILD_ typedef enum {False=0,True=1} BOOL; -#endif - -/* Samba3 does not define the timeval functions below */ -#if !defined(_SAMBA_BUILD_) || ((SAMBA_VERSION_MAJOR==3)&&(SAMBA_VERSION_MINOR<9)) static struct timeval timeval_current(void) { @@ -55,7 +49,6 @@ static double timeval_elapsed(struct timeval *tv) return (tv2.tv_sec - tv->tv_sec) + (tv2.tv_usec - tv->tv_usec)*1.0e-6; } -#endif /* _SAMBA_BUILD_ */ #if SAMBA_VERSION_MAJOR<4 #ifdef malloc -- cgit From 9e044848e394e4395f88b77361e7be06833e3bb8 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 16 May 2005 02:45:36 +0000 Subject: r6808: - test for gcov not needed - samba malloc wrapper avoidance not needed now we don't use includes.h - make testsuite work when BOOL, True, False already defined (This used to be commit c8a274c8735957a8a8dd21421abd65a8a1af20f7) --- source4/lib/talloc/configure.in | 1 - source4/lib/talloc/talloc.c | 13 ------------- source4/lib/talloc/testsuite.c | 11 ++++++++++- 3 files changed, 10 insertions(+), 15 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/configure.in b/source4/lib/talloc/configure.in index 436fe365da..8a87ab8754 100644 --- a/source4/lib/talloc/configure.in +++ b/source4/lib/talloc/configure.in @@ -7,7 +7,6 @@ if test "x$GCC" = "xyes"; then fi AC_PROG_INSTALL AC_PATH_PROG(XSLTPROC,xsltproc) -AC_PATH_PROG(GCOV,gcov) AC_CHECK_HEADERS(stdint.h stdarg.h) AC_CONFIG_HEADER(config.h) sinclude(config.m4) diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index ca2fd9a288..01d1b9f255 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -27,19 +27,6 @@ */ -#ifdef _SAMBA_BUILD_ -#if ((SAMBA_VERSION_MAJOR==3)&&(SAMBA_VERSION_MINOR<9)) -/* This is to circumvent SAMBA3's paranoid malloc checker. Here in this file - * we trust ourselves... */ -#ifdef malloc -#undef malloc -#endif -#ifdef realloc -#undef realloc -#endif -#endif -#endif - #include "config.h" #include diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 1d5665c338..60da1c3f87 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -34,7 +34,15 @@ #include "talloc.h" -typedef enum {False=0,True=1} BOOL; +#ifndef False +#define False 0 +#endif +#ifndef True +#define True 1 +#endif +#ifndef BOOL +#define BOOL int +#endif static struct timeval timeval_current(void) { @@ -706,6 +714,7 @@ static BOOL test_steal(void) talloc_free(root); p1 = talloc_size(NULL, 3); + talloc_report_full(NULL, stdout); CHECK_SIZE(NULL, 3); talloc_free(p1); -- cgit From 3fd2a38e62a9c7c444d7dd9f56673fa216a00fdd Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 16 May 2005 06:33:37 +0000 Subject: r6812: more talloc portability tweaks (This used to be commit 450ac2e4dea25910ee5384747bdb6ad7323e967d) --- source4/lib/talloc/config.m4 | 5 +---- source4/lib/talloc/configure.in | 3 +-- source4/lib/talloc/talloc.c | 1 + 3 files changed, 3 insertions(+), 6 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.m4 b/source4/lib/talloc/config.m4 index 5f653e6577..60e89f4392 100644 --- a/source4/lib/talloc/config.m4 +++ b/source4/lib/talloc/config.m4 @@ -1,7 +1,3 @@ -if test x"$experimental" = x"yes"; then - SMB_LIBRARY_ENABLE(libtalloc,YES) -fi - AC_CACHE_CHECK([for va_copy],samba_cv_HAVE_VA_COPY,[ AC_TRY_LINK([#include va_list ap1,ap2;], [va_copy(ap1,ap2);], @@ -10,3 +6,4 @@ if test x"$samba_cv_HAVE_VA_COPY" = x"yes"; then AC_DEFINE(HAVE_VA_COPY,1,[Whether va_copy() is available]) fi +AC_CHECK_TYPES(intptr_t) diff --git a/source4/lib/talloc/configure.in b/source4/lib/talloc/configure.in index 8a87ab8754..8e7e8252fd 100644 --- a/source4/lib/talloc/configure.in +++ b/source4/lib/talloc/configure.in @@ -1,5 +1,4 @@ -AC_DEFUN([SMB_MODULE_DEFAULT], [echo -n ""]) -AC_DEFUN([SMB_LIBRARY_ENABLE], [echo -n ""]) +AC_PREREQ(2.50) AC_INIT(talloc.h) AC_PROG_CC if test "x$GCC" = "xyes"; then diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 01d1b9f255..d3fa961c74 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -32,6 +32,7 @@ #include #include #include +#include #ifdef HAVE_STDARG_H #include -- cgit From a0e786c4464a0b25574093295751afd906034c6b Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 16 May 2005 21:08:44 +0000 Subject: r6828: More portability fixes (This used to be commit f46c532883e18b8780ff73d3ac0899690eeab3f4) --- source4/lib/talloc/Makefile.in | 2 +- source4/lib/talloc/configure.in | 2 +- source4/lib/talloc/talloc.c | 9 +++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index 6efa9e1920..f11124e707 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -6,7 +6,7 @@ mandir = @mandir@ XSLTPROC = @XSLTPROC@ INSTALLCMD = @INSTALL@ CC = @CC@ -CFLAGS=@CFLAGS@ +CFLAGS = @CFLAGS@ -DHAVE_CONFIG_H= LIBOBJ = talloc.o diff --git a/source4/lib/talloc/configure.in b/source4/lib/talloc/configure.in index 8e7e8252fd..d4afacc7a7 100644 --- a/source4/lib/talloc/configure.in +++ b/source4/lib/talloc/configure.in @@ -6,7 +6,7 @@ if test "x$GCC" = "xyes"; then fi AC_PROG_INSTALL AC_PATH_PROG(XSLTPROC,xsltproc) -AC_CHECK_HEADERS(stdint.h stdarg.h) +AC_CHECK_HEADERS(stdint.h stdarg.h unistd.h sys/types.h) AC_CONFIG_HEADER(config.h) sinclude(config.m4) AC_OUTPUT(Makefile talloc.pc) diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index d3fa961c74..8a29c8c014 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -27,12 +27,21 @@ */ +#ifdef HAVE_CONFIG_H #include "config.h" +#endif #include #include #include + +#ifdef HAVE_SYS_TYPES_H +#include +#endif + +#ifdef HAVE_UNISTD_H #include +#endif #ifdef HAVE_STDARG_H #include -- cgit From eaa11475cdf64449bf53560e9f89c282c0197478 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 16 May 2005 21:22:54 +0000 Subject: r6830: put header checks in config.m4 so when it is included by other projects the right configure checks are done (This used to be commit 57c8db4f9aecd161d61cf0011e960edc718d7cf0) --- source4/lib/talloc/config.m4 | 1 + source4/lib/talloc/configure.in | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.m4 b/source4/lib/talloc/config.m4 index 60e89f4392..70fedade4a 100644 --- a/source4/lib/talloc/config.m4 +++ b/source4/lib/talloc/config.m4 @@ -7,3 +7,4 @@ if test x"$samba_cv_HAVE_VA_COPY" = x"yes"; then fi AC_CHECK_TYPES(intptr_t) +AC_CHECK_HEADERS(stdint.h stdarg.h unistd.h sys/types.h) diff --git a/source4/lib/talloc/configure.in b/source4/lib/talloc/configure.in index d4afacc7a7..24a2e4ead6 100644 --- a/source4/lib/talloc/configure.in +++ b/source4/lib/talloc/configure.in @@ -6,7 +6,6 @@ if test "x$GCC" = "xyes"; then fi AC_PROG_INSTALL AC_PATH_PROG(XSLTPROC,xsltproc) -AC_CHECK_HEADERS(stdint.h stdarg.h unistd.h sys/types.h) AC_CONFIG_HEADER(config.h) sinclude(config.m4) AC_OUTPUT(Makefile talloc.pc) -- cgit From 2cb07b0f1bab01a406d8d75d19d1039ce5ed3105 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 16 May 2005 21:42:11 +0000 Subject: r6831: talloc now requires config.h (this fixes ldb build) (This used to be commit aac86583a9bff7d882ed56633126a1d9f27eea6a) --- source4/lib/talloc/talloc.c | 2 -- 1 file changed, 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 8a29c8c014..e0f4cf9aff 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -27,9 +27,7 @@ */ -#ifdef HAVE_CONFIG_H #include "config.h" -#endif #include #include -- cgit From 57bbd16b4172ce53cc631cb4d66918f9a9e8f6ba Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 17 May 2005 05:48:30 +0000 Subject: r6845: make the talloc header align to 40 bytes, which costs us an extra 4 bytes per allocation, but makes it much more portable (This used to be commit 257027a571da254c16b0b456cb1cbec284d7fda0) --- source4/lib/talloc/talloc.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index e0f4cf9aff..6b6eb87f21 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -97,17 +97,20 @@ struct talloc_chunk { struct talloc_chunk *parent, *child; struct talloc_reference_handle *refs; size_t size; - unsigned magic; talloc_destructor_t destructor; const char *name; + union { + unsigned magic; + double align_dummy; + } u; }; /* panic if we get a bad magic value */ static struct talloc_chunk *talloc_chunk_from_ptr(const void *ptr) { struct talloc_chunk *tc = discard_const_p(struct talloc_chunk, ptr)-1; - if (tc->magic != TALLOC_MAGIC) { - if (tc->magic == TALLOC_MAGIC_FREE) { + if (tc->u.magic != TALLOC_MAGIC) { + if (tc->u.magic == TALLOC_MAGIC_FREE) { TALLOC_ABORT("Bad talloc magic value - double free"); } else { TALLOC_ABORT("Bad talloc magic value - unknown value"); @@ -180,7 +183,7 @@ void *_talloc(const void *context, size_t size) if (tc == NULL) return NULL; tc->size = size; - tc->magic = TALLOC_MAGIC; + tc->u.magic = TALLOC_MAGIC; tc->destructor = NULL; tc->child = NULL; tc->name = NULL; @@ -559,7 +562,7 @@ int talloc_free(void *ptr) if (tc->next) tc->next->prev = tc->prev; } - tc->magic = TALLOC_MAGIC_FREE; + tc->u.magic = TALLOC_MAGIC_FREE; free(tc); return 0; @@ -599,7 +602,7 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n } /* by resetting magic we catch users of the old memory */ - tc->magic = TALLOC_MAGIC_FREE; + tc->u.magic = TALLOC_MAGIC_FREE; #if ALWAYS_REALLOC new_ptr = malloc(size + sizeof(*tc)); @@ -611,12 +614,12 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n new_ptr = realloc(tc, size + sizeof(*tc)); #endif if (!new_ptr) { - tc->magic = TALLOC_MAGIC; + tc->u.magic = TALLOC_MAGIC; return NULL; } tc = new_ptr; - tc->magic = TALLOC_MAGIC; + tc->u.magic = TALLOC_MAGIC; if (tc->parent) { tc->parent->child = new_ptr; } -- cgit From 4a139f81719a0105c93258b985de31a71a4766dc Mon Sep 17 00:00:00 2001 From: Derrell Lipman Date: Tue, 14 Jun 2005 01:04:20 +0000 Subject: r7556: fixed typo in documentation (This used to be commit 77fc2036a0db7bde9e90f090dbcd75ea70b3e0a0) --- source4/lib/talloc/talloc_guide.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index c23ac77cad..d30538bf9f 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -284,8 +284,8 @@ talloc_realloc() has the following equivalences: talloc_realloc(context, NULL, type, N) ==> talloc_array(context, type, N); talloc_realloc(context, ptr, type, 0) ==> talloc_free(ptr); -The "context" argument is only used if "ptr" is not NULL, otherwise it -is ignored. +The "context" argument is only used if "ptr" is NULL, otherwise it is +ignored. talloc_realloc() returns the new pointer, or NULL on failure. The call will fail either due to a lack of memory, or because the pointer has -- cgit From 545203d9154a9ce0f5cc3800796581f62380074b Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 20 Jun 2005 05:03:54 +0000 Subject: r7778: added talloc_find_parent_bytype() and talloc_find_parent_byname() These provide a way to find a parent of a ptr that is of a given type. I will be using this to find the event context in smbd, relying on the fact that everything is a child of the top level event context. I did look at the alternatives, and found that passing the event context to just about every call in smbd was getting way too complex (we need to get it to anything that can do a ldb operation, as that can invoke ldap). So this method avoids a global, and seems to work nicely (This used to be commit bdb55c7a10a516b75652065e14f5acd09d24ab35) --- source4/lib/talloc/talloc.c | 24 ++++++++++++++++++++++++ source4/lib/talloc/talloc.h | 3 +++ source4/lib/talloc/talloc_guide.txt | 13 +++++++++++++ 3 files changed, 40 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 6b6eb87f21..c6f748ea3b 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1108,3 +1108,27 @@ size_t talloc_get_size(const void *context) return tc->size; } + +/* + find a parent of this context that has the given name, if any +*/ +void *talloc_find_parent_byname(const void *context, const char *name) +{ + struct talloc_chunk *tc; + + if (context == NULL) { + return NULL; + } + + tc = talloc_chunk_from_ptr(context); + while (tc->prev) { + tc = tc->prev; + } + while (tc->parent && (!tc->name || strcmp(tc->name, name))) { + tc = tc->parent; + } + if (tc == NULL) { + return NULL; + } + return (void *)(tc+1); +} diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index ab549cf624..5160a3874a 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -65,6 +65,8 @@ typedef void TALLOC_CTX; #define talloc_set_type(ptr, type) talloc_set_name_const(ptr, #type) #define talloc_get_type(ptr, type) (type *)talloc_check_name(ptr, #type) +#define talloc_find_parent_bytype(ptr, type) (type *)talloc_find_parent_byname(ptr, #type) + #if TALLOC_DEPRECATED #define talloc_zero_p(ctx, type) talloc_zero(ctx, type) @@ -127,6 +129,7 @@ void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned void *talloc_realloc_fn(const void *context, void *ptr, size_t size); void *talloc_autofree_context(void); size_t talloc_get_size(const void *ctx); +void *talloc_find_parent_byname(const void *ctx, const char *name); #endif diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index d30538bf9f..7477dad266 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -567,3 +567,16 @@ This function lets you know the amount of memory alloced so far by this context. It does NOT account for subcontext memory. This can be used to calculate the size of an array. +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void *talloc_find_parent_byname(const void *ctx, const char *name); + +Find a parent memory context of the current context that has the given +name. This can be very useful in complex programs where it may be +difficult to pass all information down to the level you need, but you +know the structure you want is a parent of another context. + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +(type *)talloc_find_parent_bytype(ctx, type); + +Like talloc_find_parent_byname() but takes a type, making it typesafe. + -- cgit From bb8d0c76b4f2ad61421f33aae6b268f3de98870f Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 20 Jun 2005 05:21:11 +0000 Subject: r7780: fixed a bug in talloc_find_parent_byname() (This used to be commit ee3fe42fb16821eedd564201d953042190f7826f) --- source4/lib/talloc/talloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index c6f748ea3b..9dd7ef36c7 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1127,7 +1127,7 @@ void *talloc_find_parent_byname(const void *context, const char *name) while (tc->parent && (!tc->name || strcmp(tc->name, name))) { tc = tc->parent; } - if (tc == NULL) { + if (tc == NULL || tc->name == NULL || strcmp(tc->name, name)) { return NULL; } return (void *)(tc+1); -- cgit From a124028b660ba5de566442302a8ee3b925595850 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 20 Jun 2005 06:15:35 +0000 Subject: r7781: finding the parent of a talloc ptr is trickier than it looks due to the two-way tree nature of the data structure. I think I've finally got it right also added talloc_show_parents() for debugging (This used to be commit 5760ed20eed509b0b6e09e78c942dd0f70350fa9) --- source4/lib/talloc/talloc.c | 33 ++++++++++++++++++++++++++------- source4/lib/talloc/talloc.h | 1 + 2 files changed, 27 insertions(+), 7 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 9dd7ef36c7..08d4cb93a6 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1121,14 +1121,33 @@ void *talloc_find_parent_byname(const void *context, const char *name) } tc = talloc_chunk_from_ptr(context); - while (tc->prev) { - tc = tc->prev; - } - while (tc->parent && (!tc->name || strcmp(tc->name, name))) { + while (tc) { + if (tc->name && strcmp(tc->name, name) == 0) { + return (void*)(tc+1); + } + while (tc && tc->prev) tc = tc->prev; tc = tc->parent; } - if (tc == NULL || tc->name == NULL || strcmp(tc->name, name)) { - return NULL; + return NULL; +} + +/* + show the parentage of a context +*/ +void talloc_show_parents(const void *context, FILE *file) +{ + struct talloc_chunk *tc; + + if (context == NULL) { + fprintf(file, "talloc no parents for NULL\n"); + return; + } + + tc = talloc_chunk_from_ptr(context); + fprintf(file, "talloc parents of '%s'\n", talloc_get_name(context)); + while (tc) { + fprintf(file, "\t'%s'\n", talloc_get_name(tc+1)); + while (tc && tc->prev) tc = tc->prev; + tc = tc->parent; } - return (void *)(tc+1); } diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 5160a3874a..04d5cbb9af 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -130,6 +130,7 @@ void *talloc_realloc_fn(const void *context, void *ptr, size_t size); void *talloc_autofree_context(void); size_t talloc_get_size(const void *ctx); void *talloc_find_parent_byname(const void *ctx, const char *name); +void talloc_show_parents(const void *context, FILE *file); #endif -- cgit From 1702f52498168c0437416dec1014cedead634774 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Sun, 26 Jun 2005 23:59:22 +0000 Subject: r7936: new ldb_dn_explode and ldb_dn_casefold functions and co (This used to be commit 7ccf21ab4eeb9821e457308a239f2103a106fb12) --- source4/lib/talloc/talloc.c | 22 ++++++++++++++++++++++ source4/lib/talloc/talloc.h | 1 + 2 files changed, 23 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 08d4cb93a6..3adf741870 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -917,6 +917,28 @@ char *talloc_strdup(const void *t, const char *p) return ret; } +/* + append to a talloced string +*/ +char *talloc_append_string(const void *t, char *orig, const char *append) +{ + char *ret; + size_t olen = strlen(orig); + size_t alenz = strlen(append) + 1; + + if (!append) + return orig; + + ret = talloc_realloc(t, orig, char, olen + alenz); + if (!ret) + return NULL; + + /* append the string with the trailing \0 */ + memcpy(&ret[olen], append, alenz); + + return ret; +} + /* strndup with a talloc */ diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 04d5cbb9af..d68510abef 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -119,6 +119,7 @@ void *_talloc_zero(const void *ctx, size_t size, const char *name); void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name); char *talloc_strdup(const void *t, const char *p); char *talloc_strndup(const void *t, const char *p, size_t n); +char *talloc_append_string(const void *t, char *orig, const char *append); char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); char *talloc_asprintf_append(char *s, -- cgit From fa8d539e0fbce952266a246364e5e9cd537b29fd Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 27 Jun 2005 12:09:52 +0000 Subject: r7943: Add 'make manpages', fix 'make installman' and 'make uninstallman'. Not part of the "all" make target yet, as it requires xsltproc (This used to be commit fd3f4636438cf1d9c0dd802064033271b9e4d935) --- source4/lib/talloc/config.mk | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index fe8f0e929f..a1032a6e41 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -6,6 +6,7 @@ INIT_OBJ_FILES = \ REQUIRED_SUBSYSTEMS = \ LIBREPLACE NOPROTO = YES +MANPAGE = lib/talloc/talloc.3 # # End SUBSYSTEM LIBTALLOC ################################################ -- cgit From 9cfe2d83f1103f83ace2ead46e31d7368a29f3c0 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 1 Jul 2005 01:25:55 +0000 Subject: r8032: added loop detection into talloc. Robert Collins found a way to make a memory loop with talloc_unlink(), so now we detect it and handle it (This used to be commit 563058e78b8c74e821fabf6a43fa861c1ad09944) --- source4/lib/talloc/talloc.c | 62 +++++++++++++++++++++++++++++++----------- source4/lib/talloc/testsuite.c | 21 ++++++++++++++ 2 files changed, 67 insertions(+), 16 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 3adf741870..3a068f4eaa 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -59,8 +59,9 @@ #define MAX_TALLOC_SIZE 0x10000000 -#define TALLOC_MAGIC 0xe814ec4f -#define TALLOC_MAGIC_FREE 0x7faebef3 +#define TALLOC_MAGIC 0xe814ec70 +#define TALLOC_FLAG_FREE 0x01 +#define TALLOC_FLAG_LOOP 0x02 #define TALLOC_MAGIC_REFERENCE ((const char *)1) /* by default we abort when given a bad pointer (such as when talloc_free() is called @@ -100,7 +101,7 @@ struct talloc_chunk { talloc_destructor_t destructor; const char *name; union { - unsigned magic; + unsigned flags; double align_dummy; } u; }; @@ -109,14 +110,12 @@ struct talloc_chunk { static struct talloc_chunk *talloc_chunk_from_ptr(const void *ptr) { struct talloc_chunk *tc = discard_const_p(struct talloc_chunk, ptr)-1; - if (tc->u.magic != TALLOC_MAGIC) { - if (tc->u.magic == TALLOC_MAGIC_FREE) { - TALLOC_ABORT("Bad talloc magic value - double free"); - } else { - TALLOC_ABORT("Bad talloc magic value - unknown value"); - } + if ((tc->u.flags & ~0xF) != TALLOC_MAGIC) { + TALLOC_ABORT("Bad talloc magic value - unknown value"); + } + if (tc->u.flags & TALLOC_FLAG_FREE) { + TALLOC_ABORT("Bad talloc magic value - double free"); } - return tc; } @@ -183,7 +182,7 @@ void *_talloc(const void *context, size_t size) if (tc == NULL) return NULL; tc->size = size; - tc->u.magic = TALLOC_MAGIC; + tc->u.flags = TALLOC_MAGIC; tc->destructor = NULL; tc->child = NULL; tc->name = NULL; @@ -537,6 +536,11 @@ int talloc_free(void *ptr) return -1; } + if (tc->u.flags & TALLOC_FLAG_LOOP) { + /* we have a free loop - stop looping */ + return 0; + } + if (tc->destructor) { talloc_destructor_t d = tc->destructor; if (d == (talloc_destructor_t)-1) { @@ -550,6 +554,8 @@ int talloc_free(void *ptr) tc->destructor = NULL; } + tc->u.flags |= TALLOC_FLAG_LOOP; + talloc_free_children(ptr); if (tc->parent) { @@ -562,7 +568,7 @@ int talloc_free(void *ptr) if (tc->next) tc->next->prev = tc->prev; } - tc->u.magic = TALLOC_MAGIC_FREE; + tc->u.flags |= TALLOC_FLAG_FREE; free(tc); return 0; @@ -602,7 +608,7 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n } /* by resetting magic we catch users of the old memory */ - tc->u.magic = TALLOC_MAGIC_FREE; + tc->u.flags |= TALLOC_FLAG_FREE; #if ALWAYS_REALLOC new_ptr = malloc(size + sizeof(*tc)); @@ -614,12 +620,12 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n new_ptr = realloc(tc, size + sizeof(*tc)); #endif if (!new_ptr) { - tc->u.magic = TALLOC_MAGIC; + tc->u.flags &= ~TALLOC_FLAG_FREE; return NULL; } tc = new_ptr; - tc->u.magic = TALLOC_MAGIC; + tc->u.flags &= ~TALLOC_FLAG_FREE; if (tc->parent) { tc->parent->child = new_ptr; } @@ -714,10 +720,19 @@ off_t talloc_total_size(const void *ptr) tc = talloc_chunk_from_ptr(ptr); + if (tc->u.flags & TALLOC_FLAG_LOOP) { + return 0; + } + + tc->u.flags |= TALLOC_FLAG_LOOP; + total = tc->size; for (c=tc->child;c;c=c->next) { total += talloc_total_size(c+1); } + + tc->u.flags &= ~TALLOC_FLAG_LOOP; + return total; } @@ -729,10 +744,19 @@ off_t talloc_total_blocks(const void *ptr) off_t total = 0; struct talloc_chunk *c, *tc = talloc_chunk_from_ptr(ptr); + if (tc->u.flags & TALLOC_FLAG_LOOP) { + return 0; + } + + tc->u.flags |= TALLOC_FLAG_LOOP; + total++; for (c=tc->child;c;c=c->next) { total += talloc_total_blocks(c+1); } + + tc->u.flags &= ~TALLOC_FLAG_LOOP; + return total; } @@ -758,6 +782,12 @@ void talloc_report_depth(const void *ptr, FILE *f, int depth) { struct talloc_chunk *c, *tc = talloc_chunk_from_ptr(ptr); + if (tc->u.flags & TALLOC_FLAG_LOOP) { + return; + } + + tc->u.flags |= TALLOC_FLAG_LOOP; + for (c=tc->child;c;c=c->next) { if (c->name == TALLOC_MAGIC_REFERENCE) { struct talloc_reference_handle *handle = (void *)(c+1); @@ -774,7 +804,7 @@ void talloc_report_depth(const void *ptr, FILE *f, int depth) talloc_report_depth(c+1, f, depth+1); } } - + tc->u.flags &= ~TALLOC_FLAG_LOOP; } /* diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 60da1c3f87..422cb8fee5 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -818,6 +818,26 @@ static BOOL test_speed(void) } +BOOL test_lifeless(void) +{ + char *top = talloc_new(NULL); + char *parent, *child; + char *child_owner = talloc_new(NULL); + + printf("TESTING TALLOC_UNLINK LOOP\n"); + + parent = talloc_strdup(top, "parent"); + child = talloc_strdup(parent, "child"); + talloc_reference(child, parent); + talloc_reference(child_owner, child); + talloc_unlink(top, parent); + talloc_free(child); + talloc_report_full(top, stdout); + talloc_free(top); + return True; +} + + BOOL torture_local_talloc(void) { BOOL ret = True; @@ -834,6 +854,7 @@ BOOL torture_local_talloc(void) ret &= test_unref_reparent(); ret &= test_realloc_fn(); ret &= test_type(); + ret &= test_lifeless(); if (ret) { ret &= test_speed(); } -- cgit From b9e8935188c75a007683979b208757e6c5c7aa67 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 4 Jul 2005 07:10:21 +0000 Subject: r8126: - moved to 16 byte alignment for talloc. This is in response to a bug report from robert collins. - updated talloc guide to reflect the fact that over the last few months talloc overhead compared to malloc has dropped, probably due to a bunch of small changes. It now costs about 4% more than malloc on my box (This used to be commit 689a9ccf91f9de560a500787d85321abe096b948) --- source4/lib/talloc/talloc.c | 103 +++++++++++++++++++----------------- source4/lib/talloc/talloc_guide.txt | 2 +- 2 files changed, 54 insertions(+), 51 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 3a068f4eaa..1081302d09 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -97,23 +97,26 @@ struct talloc_chunk { struct talloc_chunk *next, *prev; struct talloc_chunk *parent, *child; struct talloc_reference_handle *refs; - size_t size; talloc_destructor_t destructor; const char *name; - union { - unsigned flags; - double align_dummy; - } u; + size_t size; + unsigned flags; }; +/* 16 byte alignment seems to keep everyone happy */ +#define TC_HDR_SIZE ((sizeof(struct talloc_chunk)+15)&~15) +#define TC_PTR_FROM_CHUNK(tc) ((void *)(TC_HDR_SIZE + (char*)tc)) + /* panic if we get a bad magic value */ static struct talloc_chunk *talloc_chunk_from_ptr(const void *ptr) { - struct talloc_chunk *tc = discard_const_p(struct talloc_chunk, ptr)-1; - if ((tc->u.flags & ~0xF) != TALLOC_MAGIC) { + const char *pp = ptr; + pp -= TC_HDR_SIZE; + struct talloc_chunk *tc = discard_const_p(struct talloc_chunk, pp); + if ((tc->flags & ~0xF) != TALLOC_MAGIC) { TALLOC_ABORT("Bad talloc magic value - unknown value"); } - if (tc->u.flags & TALLOC_FLAG_FREE) { + if (tc->flags & TALLOC_FLAG_FREE) { TALLOC_ABORT("Bad talloc magic value - double free"); } return tc; @@ -160,7 +163,7 @@ static struct talloc_chunk *talloc_parent_chunk(const void *ptr) void *talloc_parent(const void *ptr) { struct talloc_chunk *tc = talloc_parent_chunk(ptr); - return (void *)(tc+1); + return TC_PTR_FROM_CHUNK(tc); } /* @@ -178,11 +181,11 @@ void *_talloc(const void *context, size_t size) return NULL; } - tc = malloc(sizeof(*tc)+size); + tc = malloc(TC_HDR_SIZE+size); if (tc == NULL) return NULL; tc->size = size; - tc->u.flags = TALLOC_MAGIC; + tc->flags = TALLOC_MAGIC; tc->destructor = NULL; tc->child = NULL; tc->name = NULL; @@ -202,7 +205,7 @@ void *_talloc(const void *context, size_t size) tc->next = tc->prev = tc->parent = NULL; } - return (void *)(tc+1); + return TC_PTR_FROM_CHUNK(tc); } @@ -287,7 +290,7 @@ static int talloc_unreference(const void *context, const void *ptr) for (h=tc->refs;h;h=h->next) { struct talloc_chunk *p = talloc_parent_chunk(h); - if ((p==NULL && context==NULL) || p+1 == context) break; + if ((p==NULL && context==NULL) || TC_PTR_FROM_CHUNK(p) == context) break; } if (h == NULL) { return -1; @@ -338,7 +341,7 @@ int talloc_unlink(const void *context, void *ptr) new_p = talloc_parent_chunk(tc_p->refs); if (new_p) { - new_parent = new_p+1; + new_parent = TC_PTR_FROM_CHUNK(new_p); } else { new_parent = NULL; } @@ -497,16 +500,16 @@ void talloc_free_children(void *ptr) choice is owner of any remaining reference to this pointer, the second choice is our parent, and the final choice is the null context. */ - void *child = tc->child+1; + void *child = TC_PTR_FROM_CHUNK(tc->child); const void *new_parent = null_context; if (tc->child->refs) { struct talloc_chunk *p = talloc_parent_chunk(tc->child->refs); - if (p) new_parent = p+1; + if (p) new_parent = TC_PTR_FROM_CHUNK(p); } if (talloc_free(child) == -1) { if (new_parent == null_context) { struct talloc_chunk *p = talloc_parent_chunk(ptr); - if (p) new_parent = p+1; + if (p) new_parent = TC_PTR_FROM_CHUNK(p); } talloc_steal(new_parent, child); } @@ -536,7 +539,7 @@ int talloc_free(void *ptr) return -1; } - if (tc->u.flags & TALLOC_FLAG_LOOP) { + if (tc->flags & TALLOC_FLAG_LOOP) { /* we have a free loop - stop looping */ return 0; } @@ -554,7 +557,7 @@ int talloc_free(void *ptr) tc->destructor = NULL; } - tc->u.flags |= TALLOC_FLAG_LOOP; + tc->flags |= TALLOC_FLAG_LOOP; talloc_free_children(ptr); @@ -568,7 +571,7 @@ int talloc_free(void *ptr) if (tc->next) tc->next->prev = tc->prev; } - tc->u.flags |= TALLOC_FLAG_FREE; + tc->flags |= TALLOC_FLAG_FREE; free(tc); return 0; @@ -608,24 +611,24 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n } /* by resetting magic we catch users of the old memory */ - tc->u.flags |= TALLOC_FLAG_FREE; + tc->flags |= TALLOC_FLAG_FREE; #if ALWAYS_REALLOC - new_ptr = malloc(size + sizeof(*tc)); + new_ptr = malloc(size + TC_HDR_SIZE); if (new_ptr) { - memcpy(new_ptr, tc, tc->size + sizeof(*tc)); + memcpy(new_ptr, tc, tc->size + TC_HDR_SIZE); free(tc); } #else - new_ptr = realloc(tc, size + sizeof(*tc)); + new_ptr = realloc(tc, size + TC_HDR_SIZE); #endif if (!new_ptr) { - tc->u.flags &= ~TALLOC_FLAG_FREE; + tc->flags &= ~TALLOC_FLAG_FREE; return NULL; } tc = new_ptr; - tc->u.flags &= ~TALLOC_FLAG_FREE; + tc->flags &= ~TALLOC_FLAG_FREE; if (tc->parent) { tc->parent->child = new_ptr; } @@ -641,9 +644,9 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n } tc->size = size; - talloc_set_name_const(tc+1, name); + talloc_set_name_const(TC_PTR_FROM_CHUNK(tc), name); - return (void *)(tc+1); + return TC_PTR_FROM_CHUNK(tc); } /* @@ -720,18 +723,18 @@ off_t talloc_total_size(const void *ptr) tc = talloc_chunk_from_ptr(ptr); - if (tc->u.flags & TALLOC_FLAG_LOOP) { + if (tc->flags & TALLOC_FLAG_LOOP) { return 0; } - tc->u.flags |= TALLOC_FLAG_LOOP; + tc->flags |= TALLOC_FLAG_LOOP; total = tc->size; for (c=tc->child;c;c=c->next) { - total += talloc_total_size(c+1); + total += talloc_total_size(TC_PTR_FROM_CHUNK(c)); } - tc->u.flags &= ~TALLOC_FLAG_LOOP; + tc->flags &= ~TALLOC_FLAG_LOOP; return total; } @@ -744,18 +747,18 @@ off_t talloc_total_blocks(const void *ptr) off_t total = 0; struct talloc_chunk *c, *tc = talloc_chunk_from_ptr(ptr); - if (tc->u.flags & TALLOC_FLAG_LOOP) { + if (tc->flags & TALLOC_FLAG_LOOP) { return 0; } - tc->u.flags |= TALLOC_FLAG_LOOP; + tc->flags |= TALLOC_FLAG_LOOP; total++; for (c=tc->child;c;c=c->next) { - total += talloc_total_blocks(c+1); + total += talloc_total_blocks(TC_PTR_FROM_CHUNK(c)); } - tc->u.flags &= ~TALLOC_FLAG_LOOP; + tc->flags &= ~TALLOC_FLAG_LOOP; return total; } @@ -782,29 +785,29 @@ void talloc_report_depth(const void *ptr, FILE *f, int depth) { struct talloc_chunk *c, *tc = talloc_chunk_from_ptr(ptr); - if (tc->u.flags & TALLOC_FLAG_LOOP) { + if (tc->flags & TALLOC_FLAG_LOOP) { return; } - tc->u.flags |= TALLOC_FLAG_LOOP; + tc->flags |= TALLOC_FLAG_LOOP; for (c=tc->child;c;c=c->next) { if (c->name == TALLOC_MAGIC_REFERENCE) { - struct talloc_reference_handle *handle = (void *)(c+1); + struct talloc_reference_handle *handle = TC_PTR_FROM_CHUNK(c); const char *name2 = talloc_get_name(handle->ptr); fprintf(f, "%*sreference to: %s\n", depth*4, "", name2); } else { - const char *name = talloc_get_name(c+1); + const char *name = talloc_get_name(TC_PTR_FROM_CHUNK(c)); fprintf(f, "%*s%-30s contains %6lu bytes in %3lu blocks (ref %d)\n", depth*4, "", name, - (unsigned long)talloc_total_size(c+1), - (unsigned long)talloc_total_blocks(c+1), - talloc_reference_count(c+1)); - talloc_report_depth(c+1, f, depth+1); + (unsigned long)talloc_total_size(TC_PTR_FROM_CHUNK(c)), + (unsigned long)talloc_total_blocks(TC_PTR_FROM_CHUNK(c)), + talloc_reference_count(TC_PTR_FROM_CHUNK(c))); + talloc_report_depth(TC_PTR_FROM_CHUNK(c), f, depth+1); } } - tc->u.flags &= ~TALLOC_FLAG_LOOP; + tc->flags &= ~TALLOC_FLAG_LOOP; } /* @@ -847,9 +850,9 @@ void talloc_report(const void *ptr, FILE *f) for (c=tc->child;c;c=c->next) { fprintf(f, "\t%-30s contains %6lu bytes in %3lu blocks\n", - talloc_get_name(c+1), - (unsigned long)talloc_total_size(c+1), - (unsigned long)talloc_total_blocks(c+1)); + talloc_get_name(TC_PTR_FROM_CHUNK(c)), + (unsigned long)talloc_total_size(TC_PTR_FROM_CHUNK(c)), + (unsigned long)talloc_total_blocks(TC_PTR_FROM_CHUNK(c))); } fflush(f); } @@ -1175,7 +1178,7 @@ void *talloc_find_parent_byname(const void *context, const char *name) tc = talloc_chunk_from_ptr(context); while (tc) { if (tc->name && strcmp(tc->name, name) == 0) { - return (void*)(tc+1); + return TC_PTR_FROM_CHUNK(tc); } while (tc && tc->prev) tc = tc->prev; tc = tc->parent; @@ -1198,7 +1201,7 @@ void talloc_show_parents(const void *context, FILE *file) tc = talloc_chunk_from_ptr(context); fprintf(file, "talloc parents of '%s'\n", talloc_get_name(context)); while (tc) { - fprintf(file, "\t'%s'\n", talloc_get_name(tc+1)); + fprintf(file, "\t'%s'\n", talloc_get_name(TC_PTR_FROM_CHUNK(tc))); while (tc && tc->prev) tc = tc->prev; tc = tc->parent; } diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index 7477dad266..13ceae9d82 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -43,7 +43,7 @@ Performance All the additional features of talloc() over malloc() do come at a price. We have a simple performance test in Samba4 that measures talloc() versus malloc() performance, and it seems that talloc() is -about 10% slower than malloc() on my x86 Debian Linux box. For Samba, +about 4% slower than malloc() on my x86 Debian Linux box. For Samba, the great reduction in code complexity that we get by using talloc makes this worthwhile, especially as the total overhead of talloc/malloc in Samba is already quite small. -- cgit From ab65303fe8e7123b1567e9159adbfd6bd4697e78 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 4 Jul 2005 07:26:27 +0000 Subject: r8127: fixed code in function error (This used to be commit 46632e2048f0b87de351cd3f26229cfc4b3384ca) --- source4/lib/talloc/talloc.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 1081302d09..6af08a2ac9 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -111,8 +111,7 @@ struct talloc_chunk { static struct talloc_chunk *talloc_chunk_from_ptr(const void *ptr) { const char *pp = ptr; - pp -= TC_HDR_SIZE; - struct talloc_chunk *tc = discard_const_p(struct talloc_chunk, pp); + struct talloc_chunk *tc = discard_const_p(struct talloc_chunk, pp - TC_HDR_SIZE); if ((tc->flags & ~0xF) != TALLOC_MAGIC) { TALLOC_ABORT("Bad talloc magic value - unknown value"); } -- cgit From ef300e66861fd4bab000c1dd3ef9ecc0484a4a77 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 14 Jul 2005 02:44:30 +0000 Subject: r8443: added talloc.3 to the tree to try to allow talloc to build on systems without xsltproc (This used to be commit 0e5b89b1e8871a76c2f9c94d7d7552498d16f350) --- source4/lib/talloc/talloc.3 | 489 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 489 insertions(+) create mode 100644 source4/lib/talloc/talloc.3 (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.3 b/source4/lib/talloc/talloc.3 new file mode 100644 index 0000000000..bf10943227 --- /dev/null +++ b/source4/lib/talloc/talloc.3 @@ -0,0 +1,489 @@ +.\"Generated by db2man.xsl. Don't modify this, modify the source. +.de Sh \" Subsection +.br +.if t .Sp +.ne 5 +.PP +\fB\\$1\fR +.PP +.. +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Ip \" List item +.br +.ie \\n(.$>=3 .ne \\$3 +.el .ne 3 +.IP "\\$1" \\$2 +.. +.TH "TALLOC" 3 "" "" "" +.SH NAME +talloc \- hierarchical reference counted memory pool system with destructors +.SH "SYNOPSIS" + +.nf +#include +.fi + +.SH "DESCRIPTION" + +.PP +If you are used to talloc from Samba3 then please read this carefully, as talloc has changed a lot\&. + +.PP +The new talloc is a hierarchical, reference counted memory pool system with destructors\&. Quite a mouthful really, but not too bad once you get used to it\&. + +.PP +Perhaps the biggest change from Samba3 is that there is no distinction between a "talloc context" and a "talloc pointer"\&. Any pointer returned from talloc() is itself a valid talloc context\&. This means you can do this: + +.nf + + struct foo *X = talloc(mem_ctx, struct foo); + X\->name = talloc_strdup(X, "foo"); + +.fi + +.PP +and the pointer X\->name would be a "child" of the talloc context X which is itself a child of mem_ctx\&. So if you do talloc_free(mem_ctx) then it is all destroyed, whereas if you do talloc_free(X) then just X and X\->name are destroyed, and if you do talloc_free(X\->name) then just the name element of X is destroyed\&. + +.PP +If you think about this, then what this effectively gives you is an n\-ary tree, where you can free any part of the tree with talloc_free()\&. + +.PP +If you find this confusing, then I suggest you run the testsuite program to watch talloc in action\&. You may also like to add your own tests to testsuite\&.c to clarify how some particular situation is handled\&. + +.SH "TALLOC API" + +.PP +The following is a complete guide to the talloc API\&. Read it all at least twice\&. + +.SS "(type *)talloc(const void *ctx, type);" + +.PP +The talloc() macro is the core of the talloc library\&. It takes a memory \fIctx\fR and a \fItype\fR, and returns a pointer to a new area of memory of the given \fItype\fR\&. + +.PP +The returned pointer is itself a talloc context, so you can use it as the \fIctx\fR argument to more calls to talloc() if you wish\&. + +.PP +The returned pointer is a "child" of the supplied context\&. This means that if you talloc_free() the \fIctx\fR then the new child disappears as well\&. Alternatively you can free just the child\&. + +.PP +The \fIctx\fR argument to talloc() can be NULL, in which case a new top level context is created\&. + +.SS "void *talloc_size(const void *ctx, size_t size);" + +.PP +The function talloc_size() should be used when you don't have a convenient type to pass to talloc()\&. Unlike talloc(), it is not type safe (as it returns a void *), so you are on your own for type checking\&. + +.SS "int talloc_free(void *ptr);" + +.PP +The talloc_free() function frees a piece of talloc memory, and all its children\&. You can call talloc_free() on any pointer returned by talloc()\&. + +.PP +The return value of talloc_free() indicates success or failure, with 0 returned for success and \-1 for failure\&. The only possible failure condition is if \fIptr\fR had a destructor attached to it and the destructor returned \-1\&. See ``talloc_set_destructor()'' for details on destructors\&. + +.PP +If this pointer has an additional parent when talloc_free() is called then the memory is not actually released, but instead the most recently established parent is destroyed\&. See ``talloc_reference()'' for details on establishing additional parents\&. + +.PP +For more control on which parent is removed, see ``talloc_unlink()''\&. + +.PP +talloc_free() operates recursively on its children\&. + +.SS "void *talloc_reference(const void *ctx, const void *ptr);" + +.PP +The talloc_reference() function makes \fIctx\fR an additional parent of \fIptr\fR\&. + +.PP +The return value of talloc_reference() is always the original pointer \fIptr\fR, unless talloc ran out of memory in creating the reference in which case it will return NULL (each additional reference consumes around 48 bytes of memory on intel x86 platforms)\&. + +.PP +If \fIptr\fR is NULL, then the function is a no\-op, and simply returns NULL\&. + +.PP +After creating a reference you can free it in one of the following ways: + +.PP + + +.TP 3 +\(bu +you can talloc_free() any parent of the original pointer\&. That will reduce the number of parents of this pointer by 1, and will cause this pointer to be freed if it runs out of parents\&. +.TP +\(bu +you can talloc_free() the pointer itself\&. That will destroy the most recently established parent to the pointer and leave the pointer as a child of its current parent\&. +.LP + + +.PP +For more control on which parent to remove, see ``talloc_unlink()''\&. + +.SS "int talloc_unlink(const void *ctx, const void *ptr);" + +.PP +The talloc_unlink() function removes a specific parent from \fIptr\fR\&. The \fIctx\fR passed must either be a context used in talloc_reference() with this pointer, or must be a direct parent of ptr\&. + +.PP +Note that if the parent has already been removed using talloc_free() then this function will fail and will return \-1\&. Likewise, if \fIptr\fR is NULL, then the function will make no modifications and return \-1\&. + +.PP +Usually you can just use talloc_free() instead of talloc_unlink(), but sometimes it is useful to have the additional control on which parent is removed\&. + +.SS "void talloc_set_destructor(const void *ptr, int (*destructor)(void *));" + +.PP +The function talloc_set_destructor() sets the \fIdestructor\fR for the pointer \fIptr\fR\&. A \fIdestructor\fR is a function that is called when the memory used by a pointer is about to be released\&. The destructor receives \fIptr\fR as an argument, and should return 0 for success and \-1 for failure\&. + +.PP +The \fIdestructor\fR can do anything it wants to, including freeing other pieces of memory\&. A common use for destructors is to clean up operating system resources (such as open file descriptors) contained in the structure the destructor is placed on\&. + +.PP +You can only place one destructor on a pointer\&. If you need more than one destructor then you can create a zero\-length child of the pointer and place an additional destructor on that\&. + +.PP +To remove a destructor call talloc_set_destructor() with NULL for the destructor\&. + +.PP +If your destructor attempts to talloc_free() the pointer that it is the destructor for then talloc_free() will return \-1 and the free will be ignored\&. This would be a pointless operation anyway, as the destructor is only called when the memory is just about to go away\&. + +.SS "void talloc_increase_ref_count(const void *ptr);" + +.PP +The talloc_increase_ref_count(\fIptr\fR) function is exactly equivalent to: + +.nf +talloc_reference(NULL, ptr); +.fi + +.PP +You can use either syntax, depending on which you think is clearer in your code\&. + +.SS "void talloc_set_name(const void *ptr, const char *fmt, ...);" + +.PP +Each talloc pointer has a "name"\&. The name is used principally for debugging purposes, although it is also possible to set and get the name on a pointer in as a way of "marking" pointers in your code\&. + +.PP +The main use for names on pointer is for "talloc reports"\&. See ``talloc_report()'' and ``talloc_report_full()'' for details\&. Also see ``talloc_enable_leak_report()'' and ``talloc_enable_leak_report_full()''\&. + +.PP +The talloc_set_name() function allocates memory as a child of the pointer\&. It is logically equivalent to: + +.nf +talloc_set_name_const(ptr, talloc_asprintf(ptr, fmt, \&.\&.\&.)); +.fi + +.PP +Note that multiple calls to talloc_set_name() will allocate more memory without releasing the name\&. All of the memory is released when the ptr is freed using talloc_free()\&. + +.SS "void talloc_set_name_const(const void *ptr, const char *name);" + +.PP +The function talloc_set_name_const() is just like talloc_set_name(), but it takes a string constant, and is much faster\&. It is extensively used by the "auto naming" macros, such as talloc_p()\&. + +.PP +This function does not allocate any memory\&. It just copies the supplied pointer into the internal representation of the talloc ptr\&. This means you must not pass a \fIname\fR pointer to memory that will disappear before \fIptr\fR is freed with talloc_free()\&. + +.SS "void *talloc_named(const void *ctx, size_t size, const char *fmt, ...);" + +.PP +The talloc_named() function creates a named talloc pointer\&. It is equivalent to: + +.nf +ptr = talloc_size(ctx, size); +talloc_set_name(ptr, fmt, \&.\&.\&.\&.); +.fi + +.SS "void *talloc_named_const(const void *ctx, size_t size, const char *name);" + +.PP +This is equivalent to: + +.nf +ptr = talloc_size(ctx, size); +talloc_set_name_const(ptr, name); +.fi + +.SS "const char *talloc_get_name(const void *ptr);" + +.PP +This returns the current name for the given talloc pointer, \fIptr\fR\&. See ``talloc_set_name()'' for details\&. + +.SS "void *talloc_init(const char *fmt, ...);" + +.PP +This function creates a zero length named talloc context as a top level context\&. It is equivalent to: + +.nf +talloc_named(NULL, 0, fmt, \&.\&.\&.); +.fi + +.SS "void *talloc_new(void *ctx);" + +.PP +This is a utility macro that creates a new memory context hanging off an exiting context, automatically naming it "talloc_new: __location__" where __location__ is the source line it is called from\&. It is particularly useful for creating a new temporary working context\&. + +.SS "(type *)talloc_realloc(const void *ctx, void *ptr, type, count);" + +.PP +The talloc_realloc() macro changes the size of a talloc pointer\&. It has the following equivalences: + +.nf +talloc_realloc(ctx, NULL, type, 1) ==> talloc(ctx, type); +talloc_realloc(ctx, ptr, type, 0) ==> talloc_free(ptr); +.fi + +.PP +The \fIctx\fR argument is only used if \fIptr\fR is not NULL, otherwise it is ignored\&. + +.PP +talloc_realloc() returns the new pointer, or NULL on failure\&. The call will fail either due to a lack of memory, or because the pointer has more than one parent (see ``talloc_reference()'')\&. + +.SS "void *talloc_realloc_size(const void *ctx, void *ptr, size_t size);" + +.PP +the talloc_realloc_size() function is useful when the type is not known so the type\-safe talloc_realloc() cannot be used\&. + +.SS "void *talloc_steal(const void *new_ctx, const void *ptr);" + +.PP +The talloc_steal() function changes the parent context of a talloc pointer\&. It is typically used when the context that the pointer is currently a child of is going to be freed and you wish to keep the memory for a longer time\&. + +.PP +The talloc_steal() function returns the pointer that you pass it\&. It does not have any failure modes\&. + +.PP +NOTE: It is possible to produce loops in the parent/child relationship if you are not careful with talloc_steal()\&. No guarantees are provided as to your sanity or the safety of your data if you do this\&. + +.SS "off_t talloc_total_size(const void *ptr);" + +.PP +The talloc_total_size() function returns the total size in bytes used by this pointer and all child pointers\&. Mostly useful for debugging\&. + +.PP +Passing NULL is allowed, but it will only give a meaningful result if talloc_enable_leak_report() or talloc_enable_leak_report_full() has been called\&. + +.SS "off_t talloc_total_blocks(const void *ptr);" + +.PP +The talloc_total_blocks() function returns the total memory block count used by this pointer and all child pointers\&. Mostly useful for debugging\&. + +.PP +Passing NULL is allowed, but it will only give a meaningful result if talloc_enable_leak_report() or talloc_enable_leak_report_full() has been called\&. + +.SS "void talloc_report(const void *ptr, FILE *f);" + +.PP +The talloc_report() function prints a summary report of all memory used by \fIptr\fR\&. One line of report is printed for each immediate child of ptr, showing the total memory and number of blocks used by that child\&. + +.PP +You can pass NULL for the pointer, in which case a report is printed for the top level memory context, but only if talloc_enable_leak_report() or talloc_enable_leak_report_full() has been called\&. + +.SS "void talloc_report_full(const void *ptr, FILE *f);" + +.PP +This provides a more detailed report than talloc_report()\&. It will recursively print the entire tree of memory referenced by the pointer\&. References in the tree are shown by giving the name of the pointer that is referenced\&. + +.PP +You can pass NULL for the pointer, in which case a report is printed for the top level memory context, but only if talloc_enable_leak_report() or talloc_enable_leak_report_full() has been called\&. + +.SS "void talloc_enable_leak_report(void);" + +.PP +This enables calling of talloc_report(NULL, stderr) when the program exits\&. In Samba4 this is enabled by using the \-\-leak\-report command line option\&. + +.PP +For it to be useful, this function must be called before any other talloc function as it establishes a "null context" that acts as the top of the tree\&. If you don't call this function first then passing NULL to talloc_report() or talloc_report_full() won't give you the full tree printout\&. + +.PP +Here is a typical talloc report: + +.IP +talloc report on 'null_context' (total 267 bytes in 15 blocks) +libcli/auth/spnego_parse\&.c:55 contains 31 bytes in 2 blocks +libcli/auth/spnego_parse\&.c:55 contains 31 bytes in 2 blocks +iconv(UTF8,CP850) contains 42 bytes in 2 blocks +libcli/auth/spnego_parse\&.c:55 contains 31 bytes in 2 blocks +iconv(CP850,UTF8) contains 42 bytes in 2 blocks +iconv(UTF8,UTF\-16LE) contains 45 bytes in 2 blocks +iconv(UTF\-16LE,UTF8) contains 45 bytes in 2 blocks + +.SS "void talloc_enable_leak_report_full(void);" + +.PP +This enables calling of talloc_report_full(NULL, stderr) when the program exits\&. In Samba4 this is enabled by using the \-\-leak\-report\-full command line option\&. + +.PP +For it to be useful, this function must be called before any other talloc function as it establishes a "null context" that acts as the top of the tree\&. If you don't call this function first then passing NULL to talloc_report() or talloc_report_full() won't give you the full tree printout\&. + +.PP +Here is a typical full report: + +.IP +full talloc report on 'root' (total 18 bytes in 8 blocks) +p1 contains 18 bytes in 7 blocks (ref 0) + r1 contains 13 bytes in 2 blocks (ref 0) + reference to: p2 + p2 contains 1 bytes in 1 blocks (ref 1) + x3 contains 1 bytes in 1 blocks (ref 0) + x2 contains 1 bytes in 1 blocks (ref 0) + x1 contains 1 bytes in 1 blocks (ref 0) + +.SS "(type *)talloc_zero(const void *ctx, type);" + +.PP +The talloc_zero() macro is equivalent to: + +.nf +ptr = talloc(ctx, type); +if (ptr) memset(ptr, 0, sizeof(type)); +.fi + +.SS "void *talloc_zero_size(const void *ctx, size_t size)" + +.PP +The talloc_zero_size() function is useful when you don't have a known type\&. + +.SS "void *talloc_memdup(const void *ctx, const void *p, size_t size);" + +.PP +The talloc_memdup() function is equivalent to: + +.nf +ptr = talloc_size(ctx, size); +if (ptr) memcpy(ptr, p, size); +.fi + +.SS "char *talloc_strdup(const void *ctx, const char *p);" + +.PP +The talloc_strdup() function is equivalent to: + +.nf +ptr = talloc_size(ctx, strlen(p)+1); +if (ptr) memcpy(ptr, p, strlen(p)+1); +.fi + +.PP +This function sets the name of the new pointer to the passed string\&. This is equivalent to: + +.nf +talloc_set_name_const(ptr, ptr) +.fi + +.SS "char *talloc_strndup(const void *t, const char *p, size_t n);" + +.PP +The talloc_strndup() function is the talloc equivalent of the C library function strndup(3)\&. + +.PP +This function sets the name of the new pointer to the passed string\&. This is equivalent to: + +.nf +talloc_set_name_const(ptr, ptr) +.fi + +.SS "char *talloc_vasprintf(const void *t, const char *fmt, va_list ap);" + +.PP +The talloc_vasprintf() function is the talloc equivalent of the C library function vasprintf(3)\&. + +.SS "char *talloc_asprintf(const void *t, const char *fmt, ...);" + +.PP +The talloc_asprintf() function is the talloc equivalent of the C library function asprintf(3)\&. + +.PP +This function sets the name of the new pointer to the passed string\&. This is equivalent to: + +.nf +talloc_set_name_const(ptr, ptr) +.fi + +.SS "char *talloc_asprintf_append(char *s, const char *fmt, ...);" + +.PP +The talloc_asprintf_append() function appends the given formatted string to the given string\&. + +.SS "(type *)talloc_array(const void *ctx, type, uint_t count);" + +.PP +The talloc_array() macro is equivalent to: + +.nf +(type *)talloc_size(ctx, sizeof(type) * count); +.fi + +.PP +except that it provides integer overflow protection for the multiply, returning NULL if the multiply overflows\&. + +.SS "void *talloc_array_size(const void *ctx, size_t size, uint_t count);" + +.PP +The talloc_array_size() function is useful when the type is not known\&. It operates in the same way as talloc_array(), but takes a size instead of a type\&. + +.SS "void *talloc_realloc_fn(const void *ctx, void *ptr, size_t size)" + +.PP +This is a non\-macro version of talloc_realloc(), which is useful as libraries sometimes want a realloc function pointer\&. A realloc(3) implementation encapsulates the functionality of malloc(3), free(3) and realloc(3) in one call, which is why it is useful to be able to pass around a single function pointer\&. + +.SS "void *talloc_autofree_context(void);" + +.PP +This is a handy utility function that returns a talloc context which will be automatically freed on program exit\&. This can be used to reduce the noise in memory leak reports\&. + +.SS "void *talloc_check_name(const void *ptr, const char *name);" + +.PP +This function checks if a pointer has the specified \fIname\fR\&. If it does then the pointer is returned\&. It it doesn't then NULL is returned\&. + +.SS "(type *)talloc_get_type(const void *ptr, type);" + +.PP +This macro allows you to do type checking on talloc pointers\&. It is particularly useful for void* private pointers\&. It is equivalent to this: + +.nf +(type *)talloc_check_name(ptr, #type) +.fi + +.SS "talloc_set_type(const void *ptr, type);" + +.PP +This macro allows you to force the name of a pointer to be a particular \fItype\fR\&. This can be used in conjunction with talloc_get_type() to do type checking on void* pointers\&. + +.PP +It is equivalent to this: + +.nf +talloc_set_name_const(ptr, #type) +.fi + +.SH "PERFORMANCE" + +.PP +All the additional features of talloc(3) over malloc(3) do come at a price\&. We have a simple performance test in Samba4 that measures talloc() versus malloc() performance, and it seems that talloc() is about 10% slower than malloc() on my x86 Debian Linux box\&. For Samba, the great reduction in code complexity that we get by using talloc makes this worthwhile, especially as the total overhead of talloc/malloc in Samba is already quite small\&. + +.SH "SEE ALSO" + +.PP +malloc(3), strndup(3), vasprintf(3), asprintf(3), \fIhttp://talloc.samba.org/\fR + +.SH "COPYRIGHT/LICENSE" + +.PP +Copyright (C) Andrew Tridgell 2004 + +.PP +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\&. + +.PP +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\&. + +.PP +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\&. + -- cgit From 7facdcc161b75c7a3a85a0f6380f5b83394183c4 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 3 Aug 2005 05:28:08 +0000 Subject: r8985: Automatically generate make dependency rules for the asn1 and error table files. This removes the need for HEIMDAL_EXTERNAL (This used to be commit 2f481ac93c0151b82dab737d49ae8d0d3cbbbbbe) --- source4/lib/talloc/config.mk | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index a1032a6e41..7b47eacaf6 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -1,13 +1,10 @@ ################################################ # Start SUBSYSTEM LIBTALLOC [SUBSYSTEM::LIBTALLOC] -INIT_OBJ_FILES = \ - lib/talloc/talloc.o -REQUIRED_SUBSYSTEMS = \ - LIBREPLACE +INIT_OBJ_FILES = lib/talloc/talloc.o +REQUIRED_SUBSYSTEMS = LIBREPLACE NOPROTO = YES MANPAGE = lib/talloc/talloc.3 -# # End SUBSYSTEM LIBTALLOC ################################################ @@ -17,8 +14,7 @@ MANPAGE = lib/talloc/talloc.3 MAJOR_VERSION = 0 MINOR_VERSION = 0 RELEASE_VERSION = 1 -REQUIRED_SUBSYSTEMS = \ - LIBTALLOC +REQUIRED_SUBSYSTEMS = LIBTALLOC # # End LIBRARY LIBTALLOC ################################################ -- cgit From 523034b9fbc1841ed63137e3d8965d52997af4e6 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 19 Sep 2005 19:19:10 +0000 Subject: r10323: Add first bits required for getting compile with scons working. This does not work yet and can exist parallel with the existing build system. (This used to be commit 829568d75985e875e3363d76fb44270a0298c7f8) --- source4/lib/talloc/SConscript | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 source4/lib/talloc/SConscript (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/SConscript b/source4/lib/talloc/SConscript new file mode 100644 index 0000000000..e3851afa4e --- /dev/null +++ b/source4/lib/talloc/SConscript @@ -0,0 +1,3 @@ +Import('hostenv') +talloc = hostenv.StaticLibrary('talloc',['talloc.c']) +Export('talloc') -- cgit From 96745cbfc0e3386fa32631daa45b4096a1f80e61 Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Mon, 19 Sep 2005 21:44:36 +0000 Subject: r10328: Add more emacs python-mode markers. (This used to be commit 540a3649e88690e829c17d79ecdccdc9ed464845) --- source4/lib/talloc/SConscript | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/SConscript b/source4/lib/talloc/SConscript index e3851afa4e..37079c4156 100644 --- a/source4/lib/talloc/SConscript +++ b/source4/lib/talloc/SConscript @@ -1,3 +1,5 @@ +# tastes like -*- python -*- + Import('hostenv') talloc = hostenv.StaticLibrary('talloc',['talloc.c']) Export('talloc') -- cgit From 6812c73534001d2dd05a9a74358d2b6d0029f1a7 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 20 Sep 2005 11:59:03 +0000 Subject: r10348: Add scons scripts for remaining subsystems. Most subsystems build now, but final linking still fails (as does generating files asn1, et, idl and proto files) (This used to be commit 4f0d7f75b99c7f4388d8acb0838577d86baf68b5) --- source4/lib/talloc/SConscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/SConscript b/source4/lib/talloc/SConscript index 37079c4156..ad88262f1d 100644 --- a/source4/lib/talloc/SConscript +++ b/source4/lib/talloc/SConscript @@ -1,5 +1,5 @@ +Import('hostenv') # tastes like -*- python -*- -Import('hostenv') talloc = hostenv.StaticLibrary('talloc',['talloc.c']) Export('talloc') -- cgit From 675f81eed3086682faeca34e56d441c6e38bd800 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 27 Sep 2005 03:11:08 +0000 Subject: r10525: change from AC_CHECK_TYPES() to AC_CHECK_TYPE() for intptr_t, so the type is always available, which means we need less #ifdefs (This used to be commit d4af4b11ae69a63fa3b2048e6d576055d86d2bb4) --- source4/lib/talloc/config.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.m4 b/source4/lib/talloc/config.m4 index 70fedade4a..824eb6d1ff 100644 --- a/source4/lib/talloc/config.m4 +++ b/source4/lib/talloc/config.m4 @@ -6,5 +6,5 @@ if test x"$samba_cv_HAVE_VA_COPY" = x"yes"; then AC_DEFINE(HAVE_VA_COPY,1,[Whether va_copy() is available]) fi -AC_CHECK_TYPES(intptr_t) +AC_CHECK_TYPE(intptr_t, unsigned long long) AC_CHECK_HEADERS(stdint.h stdarg.h unistd.h sys/types.h) -- cgit From 5058f4b9e82ca8b9f2405930db3a46b8c37f06ed Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 28 Sep 2005 18:18:09 +0000 Subject: r10586: Add MergedObject() builder. Default to Library() rather then StaticLibrary() (This used to be commit b53313dc517986c69a4e4cb8fe3885b696f8faa1) --- source4/lib/talloc/SConscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/SConscript b/source4/lib/talloc/SConscript index ad88262f1d..222a00e001 100644 --- a/source4/lib/talloc/SConscript +++ b/source4/lib/talloc/SConscript @@ -1,5 +1,5 @@ Import('hostenv') # tastes like -*- python -*- -talloc = hostenv.StaticLibrary('talloc',['talloc.c']) +talloc = hostenv.Library('talloc',['talloc.c']) Export('talloc') -- cgit From 7838e13e917041fa3786eaa442765ab88b9f0039 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 5 Oct 2005 06:32:00 +0000 Subject: r10726: fix to talloc_parent() from Michael O'Brien (This used to be commit f31a2376f3fef1cc2b40b37fb4d94a4b67eec6d4) --- source4/lib/talloc/talloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 6af08a2ac9..d2de2ecde0 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -162,7 +162,7 @@ static struct talloc_chunk *talloc_parent_chunk(const void *ptr) void *talloc_parent(const void *ptr) { struct talloc_chunk *tc = talloc_parent_chunk(ptr); - return TC_PTR_FROM_CHUNK(tc); + return tc? TC_PTR_FROM_CHUNK(tc) : NULL; } /* -- cgit From f4d590662effeb80c2b55ae5ad869b4b7810cf08 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 20 Oct 2005 10:04:57 +0000 Subject: r11214: Remove scons files (see http://lists.samba.org/archive/samba-technical/2005-October/043443.html) (This used to be commit 7fffc5c9178158249be632ac0ca179c13bd1f98f) --- source4/lib/talloc/SConscript | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 source4/lib/talloc/SConscript (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/SConscript b/source4/lib/talloc/SConscript deleted file mode 100644 index 222a00e001..0000000000 --- a/source4/lib/talloc/SConscript +++ /dev/null @@ -1,5 +0,0 @@ -Import('hostenv') -# tastes like -*- python -*- - -talloc = hostenv.Library('talloc',['talloc.c']) -Export('talloc') -- cgit From 4c5a4a7e0288e9ac0b2f795befd5684059e4c429 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 21 Oct 2005 16:29:54 +0000 Subject: r11244: Relative path names in .mk files (This used to be commit 24e10300906c380919d2d631bfb3b8fd6b3f54ba) --- source4/lib/talloc/config.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 7b47eacaf6..1d5d957e91 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -1,10 +1,10 @@ ################################################ # Start SUBSYSTEM LIBTALLOC [SUBSYSTEM::LIBTALLOC] -INIT_OBJ_FILES = lib/talloc/talloc.o +INIT_OBJ_FILES = talloc.o REQUIRED_SUBSYSTEMS = LIBREPLACE NOPROTO = YES -MANPAGE = lib/talloc/talloc.3 +MANPAGE = talloc.3 # End SUBSYSTEM LIBTALLOC ################################################ -- cgit From bf300c868781fed3b0c0556b4e40608589ad1585 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 26 Oct 2005 13:19:15 +0000 Subject: r11300: Treat libraries as a special kind of subsystem (one that can also be built as a library and installed). (This used to be commit 98d1f9b1dc523ed88c5aa8d066030b33d74f62bf) --- source4/lib/talloc/config.mk | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 1d5d957e91..5d88616b15 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -1,20 +1,13 @@ -################################################ -# Start SUBSYSTEM LIBTALLOC -[SUBSYSTEM::LIBTALLOC] -INIT_OBJ_FILES = talloc.o -REQUIRED_SUBSYSTEMS = LIBREPLACE -NOPROTO = YES -MANPAGE = talloc.3 -# End SUBSYSTEM LIBTALLOC -################################################ - ################################################ # Start LIBRARY LIBTALLOC -[LIBRARY::libtalloc] +[LIBRARY::LIBTALLOC] MAJOR_VERSION = 0 MINOR_VERSION = 0 RELEASE_VERSION = 1 -REQUIRED_SUBSYSTEMS = LIBTALLOC +INIT_OBJ_FILES = talloc.o +REQUIRED_SUBSYSTEMS = LIBREPLACE +NOPROTO = YES +MANPAGE = talloc.3 # # End LIBRARY LIBTALLOC ################################################ -- cgit From 8ee1ee66edb1c98b63cbc26741080932995156a4 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 26 Oct 2005 14:18:27 +0000 Subject: r11303: Support defining and installing public headers for libraries. Support installing libraries. Get rid of pkg-config file (will be autogenerated later on). (This used to be commit b4745032a2c55752c527026feb221ccc3dce10c8) --- source4/lib/talloc/config.mk | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 5d88616b15..a4be0eb9ff 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -8,6 +8,7 @@ INIT_OBJ_FILES = talloc.o REQUIRED_SUBSYSTEMS = LIBREPLACE NOPROTO = YES MANPAGE = talloc.3 +PUBLIC_HEADERS = talloc.h # # End LIBRARY LIBTALLOC ################################################ -- cgit From 93fd08168fdc881fdef099991bd7a22448841dc4 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 28 Oct 2005 18:26:26 +0000 Subject: r11377: Add support for building LIBRARY elements as shared libraries: - Adds -rpath bin/ so you don't have to install Samba in order to use compiled binaries. - Writes out pkg-config files when building shared libs - Supports automatic fallback to MERGEDOBJ (which is the default) or OBJ_LIST (if ld -r is not supported) Building with shared libs reduces the size of the Samba binaries from 197 Mb to 60 Mb (including libraries) on my system (GCC4, with debugging). To build with shared libraries support enabled, run: LIBRARY_OUTPUT_TYPE=SHARED_LIBRARY ./config.status init functions don't get called correctly yet when using shared libs, so you won't be able to actually run anything with success :-) Once init functions are done, I'll look at support for loading shared modules once again. Based on a patch by Peter Novodvorsky (nidd on IRC). (This used to be commit 0b54405685674a2b19a28d77aae5b1136b5a4728) --- source4/lib/talloc/config.mk | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index a4be0eb9ff..81a8833a94 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -9,6 +9,7 @@ REQUIRED_SUBSYSTEMS = LIBREPLACE NOPROTO = YES MANPAGE = talloc.3 PUBLIC_HEADERS = talloc.h +DESCRIPTION = A hierarchical pool based memory system with destructors # # End LIBRARY LIBTALLOC ################################################ -- cgit From 2a311277e5df224dd07e21a96ec2e561ef4d764c Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 22 Nov 2005 21:45:05 +0000 Subject: r11869: talloc has been ported :-) (This used to be commit aad52d9a5fb66fe3b595190905e7237a279f7270) --- source4/lib/talloc/talloc_guide.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index 13ceae9d82..1068e5d1cd 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -7,8 +7,9 @@ September 2004 The most current version of this document is available at http://samba.org/ftp/unpacked/samba4/source/lib/talloc/talloc_guide.txt -If you are used to talloc from Samba3 then please read this carefully, -as talloc has changed a lot. +If you are used to the "old" talloc from Samba3 before 3.0.20 then please read +this carefully, as talloc has changed a lot. With 3.0.20 (or 3.0.14?) the +Samba4 talloc has been ported back to Samba3, so this guide applies to both. The new talloc is a hierarchical, reference counted memory pool system with destructors. Quite a mounthful really, but not too bad once you -- cgit From 51a8581dea6511eef6f3e3dbb438c003e1912276 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 1 Dec 2005 00:23:01 +0000 Subject: r11983: make talloc LGPL. This makes more sense given that ldb depends on talloc, and ldb is now LGPL (This used to be commit 5bdd50fa38b1be28cf7bcddc561c743437e70cae) --- source4/lib/talloc/talloc.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index d2de2ecde0..8393d9acb7 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -7,19 +7,23 @@ Copyright (C) Andrew Tridgell 2004 - 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. + ** NOTE! The following LGPL license applies to the talloc + ** library. This does NOT imply that all of Samba is released + ** under the LGPL - This program is distributed in the hope that it will be useful, + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* -- cgit From 4476dfd3bd34be68793a02ce0722b729528058fa Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 1 Dec 2005 00:25:06 +0000 Subject: r11984: LGPL on header and testsuite as well (This used to be commit ed90975bf50644f00da681eb7cc41123abc60f81) --- source4/lib/talloc/talloc.h | 26 +++++++++++++++----------- source4/lib/talloc/testsuite.c | 26 +++++++++++++++----------- 2 files changed, 30 insertions(+), 22 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index d68510abef..2c5d04d605 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -6,19 +6,23 @@ Copyright (C) Andrew Tridgell 2004-2005 - 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. + ** NOTE! The following LGPL license applies to the talloc + ** library. This does NOT imply that all of Samba is released + ** under the LGPL - This program is distributed in the hope that it will be useful, + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* this is only needed for compatibility with the old talloc */ diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 422cb8fee5..a37f8c197e 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -5,19 +5,23 @@ Copyright (C) Andrew Tridgell 2004 - 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. + ** NOTE! The following LGPL license applies to the talloc + ** library. This does NOT imply that all of Samba is released + ** under the LGPL - This program is distributed in the hope that it will be useful, + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "config.h" -- cgit From d8e35f882879e189f55b3bca818dd44cc5f0c6fa Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 26 Dec 2005 18:03:50 +0000 Subject: r12498: Eliminate INIT_OBJ_FILES and ADD_OBJ_FILES. We were not using the difference between these at all, and in the future the fact that INIT_OBJ_FILES include smb_build.h will be sufficient to have recompiles at the right time. (This used to be commit b24f2583edee38abafa58578d8b5c4b43e517def) --- source4/lib/talloc/config.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 81a8833a94..70be4d0f4f 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -4,7 +4,7 @@ MAJOR_VERSION = 0 MINOR_VERSION = 0 RELEASE_VERSION = 1 -INIT_OBJ_FILES = talloc.o +OBJ_FILES = talloc.o REQUIRED_SUBSYSTEMS = LIBREPLACE NOPROTO = YES MANPAGE = talloc.3 -- cgit From e4b7e8cdf1590d8ed9b1f190cad9ee6734ffe4de Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 31 Dec 2005 04:26:34 +0000 Subject: r12633: expose talloc_vasprintf_append() (This used to be commit 7a0e7074f6d3d38ce92f2b617549d5dbbaf968ef) --- source4/lib/talloc/talloc.c | 5 +---- source4/lib/talloc/talloc.h | 1 + 2 files changed, 2 insertions(+), 4 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 8393d9acb7..ac2fedebdc 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1045,10 +1045,7 @@ char *talloc_asprintf(const void *t, const char *fmt, ...) * and return @p s, which may have moved. Good for gradually * accumulating output into a string buffer. **/ - -static char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); - -static char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) +char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) { struct talloc_chunk *tc; int len, s_len; diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 2c5d04d605..68bf24e0b8 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -125,6 +125,7 @@ char *talloc_strdup(const void *t, const char *p); char *talloc_strndup(const void *t, const char *p, size_t n); char *talloc_append_string(const void *t, char *orig, const char *append); char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); +char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); char *talloc_asprintf_append(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); -- cgit From f9f55ad5fcda943f6747d6bef72f6d9d00a263c4 Mon Sep 17 00:00:00 2001 From: James Peach Date: Wed, 8 Feb 2006 23:44:17 +0000 Subject: r13397: Propagate the error return from vsnprintf to trap the case where we aren't linked against a C99 vsnprintf. (This used to be commit 23782f899aaa5fe488d86d5e67e91be99ff7a146) --- source4/lib/talloc/talloc.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index ac2fedebdc..6b3328420d 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1011,7 +1011,9 @@ char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) VA_COPY(ap2, ap); - len = vsnprintf(NULL, 0, fmt, ap2); + if ((len = vsnprintf(NULL, 0, fmt, ap2)) <= 0) { + return NULL; + } ret = _talloc(t, len+1); if (ret) { @@ -1060,7 +1062,15 @@ char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) VA_COPY(ap2, ap); s_len = tc->size - 1; - len = vsnprintf(NULL, 0, fmt, ap2); + if ((len = vsnprintf(NULL, 0, fmt, ap2)) <= 0) { + /* Either the vsnprintf failed or the format resulted in + * no characters being formatted. In the former case, we + * ought to return NULL, in the latter we ought to return + * the original string. Most current callers of this + * function expect it to never return NULL. + */ + return s; + } s = talloc_realloc(NULL, s, char, s_len + len+1); if (!s) return NULL; -- cgit From b56dab83a4537175b998b137e7ea2f2558042593 Mon Sep 17 00:00:00 2001 From: James Peach Date: Thu, 9 Feb 2006 00:49:03 +0000 Subject: r13400: Only return NULL from talloc_asprintf if vsnprintf returns an error (ie. zero is not an error). (This used to be commit 1ab4674196b9df0b2b7b6eb4991358cc2f86c0d9) --- source4/lib/talloc/talloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 6b3328420d..577fa4a182 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1011,7 +1011,7 @@ char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) VA_COPY(ap2, ap); - if ((len = vsnprintf(NULL, 0, fmt, ap2)) <= 0) { + if ((len = vsnprintf(NULL, 0, fmt, ap2)) < 0) { return NULL; } -- cgit From 640509e6a71556f95c2688a1d62df27da6ff8da1 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Fri, 10 Mar 2006 08:47:59 +0000 Subject: r14131: Fix Coverity bug # 127 (This used to be commit 4d0aa6f525c4756ca6942439468b484e3ca4b2fa) --- source4/lib/talloc/talloc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 577fa4a182..5bb21ee6e6 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -960,11 +960,13 @@ char *talloc_append_string(const void *t, char *orig, const char *append) { char *ret; size_t olen = strlen(orig); - size_t alenz = strlen(append) + 1; + size_t alenz; if (!append) return orig; + alenz = strlen(append) + 1; + ret = talloc_realloc(t, orig, char, olen + alenz); if (!ret) return NULL; -- cgit From 335d07d8114dbb654601ecb8d6d8ea45f94b5b67 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 13 Mar 2006 04:04:38 +0000 Subject: r14288: - make the snprintf call in talloc portable to older solaris boxes - fixed an error found sing the beam analyser (This used to be commit bc45451ddd6eceb9bf1ca02f84932759d99a1744) --- source4/lib/talloc/talloc.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 5bb21ee6e6..99ede462b8 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -293,7 +293,11 @@ static int talloc_unreference(const void *context, const void *ptr) for (h=tc->refs;h;h=h->next) { struct talloc_chunk *p = talloc_parent_chunk(h); - if ((p==NULL && context==NULL) || TC_PTR_FROM_CHUNK(p) == context) break; + if (p == NULL) { + if (context == NULL) break; + } else if (TC_PTR_FROM_CHUNK(p) == context) { + break; + } } if (h == NULL) { return -1; @@ -1010,10 +1014,12 @@ char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) int len; char *ret; va_list ap2; + char c; VA_COPY(ap2, ap); - if ((len = vsnprintf(NULL, 0, fmt, ap2)) < 0) { + /* this call looks strange, but it makes it work on older solaris boxes */ + if ((len = vsnprintf(&c, 1, fmt, ap2)) < 0) { return NULL; } -- cgit From e153a8099e9a187e6bcac6507ed4b1ddfe7cb764 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 13 Mar 2006 16:32:44 +0000 Subject: r14327: Replace MAJOR_VERSION/MINOR_VERSION/RELEASE_VERSION with two parameters: - VERSION: should contain the current version. Will be made part of the filename. - SO_VERSION: should contain the latest version that this on is compatible to. Will be used for setting the soname of the shared library. Fix sonames and use them on platforms that support them Remove symlinking code. ldconfig will take care of creating the symlinks now that we set the soname. (This used to be commit 7871b07e21c85c63d0ecac4c31b98dc112d18af5) --- source4/lib/talloc/config.mk | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 70be4d0f4f..e63edb0139 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -1,9 +1,8 @@ ################################################ # Start LIBRARY LIBTALLOC [LIBRARY::LIBTALLOC] -MAJOR_VERSION = 0 -MINOR_VERSION = 0 -RELEASE_VERSION = 1 +VERSION = 0.0.1 +SO_VERSION = 0.0.1 OBJ_FILES = talloc.o REQUIRED_SUBSYSTEMS = LIBREPLACE NOPROTO = YES -- cgit From 71b4fd97922933b24424924acee606389bfecb2d Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 16 Mar 2006 13:56:14 +0000 Subject: r14477: Remove the NOPROTO property - it's no longer used as proto.h is gone. (This used to be commit 9c37f847d32d2f327a88c53a90af0c73126b76be) --- source4/lib/talloc/config.mk | 1 - 1 file changed, 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index e63edb0139..86a6f4bd56 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -5,7 +5,6 @@ VERSION = 0.0.1 SO_VERSION = 0.0.1 OBJ_FILES = talloc.o REQUIRED_SUBSYSTEMS = LIBREPLACE -NOPROTO = YES MANPAGE = talloc.3 PUBLIC_HEADERS = talloc.h DESCRIPTION = A hierarchical pool based memory system with destructors -- cgit From b785a7c40c185512207ef8da837a766933073032 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 16 Mar 2006 21:36:36 +0000 Subject: r14492: Fix shared libs - set SO_VERSION to 0 everywhere for now. (This used to be commit 4682bc5ce047d81586447b9df82c91ed1fe677cf) --- source4/lib/talloc/config.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 86a6f4bd56..95d3ac359d 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -2,7 +2,7 @@ # Start LIBRARY LIBTALLOC [LIBRARY::LIBTALLOC] VERSION = 0.0.1 -SO_VERSION = 0.0.1 +SO_VERSION = 0 OBJ_FILES = talloc.o REQUIRED_SUBSYSTEMS = LIBREPLACE MANPAGE = talloc.3 -- cgit From c67c12585071d46a4f3b5f46e567de339077c239 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 20 Mar 2006 20:04:04 +0000 Subject: r14586: Some small fixes, update TODO. (This used to be commit 5673ee1182dbae1aac6891abdce0b5748a14989f) --- source4/lib/talloc/talloc.3 | 489 -------------------------------------------- 1 file changed, 489 deletions(-) delete mode 100644 source4/lib/talloc/talloc.3 (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.3 b/source4/lib/talloc/talloc.3 deleted file mode 100644 index bf10943227..0000000000 --- a/source4/lib/talloc/talloc.3 +++ /dev/null @@ -1,489 +0,0 @@ -.\"Generated by db2man.xsl. Don't modify this, modify the source. -.de Sh \" Subsection -.br -.if t .Sp -.ne 5 -.PP -\fB\\$1\fR -.PP -.. -.de Sp \" Vertical space (when we can't use .PP) -.if t .sp .5v -.if n .sp -.. -.de Ip \" List item -.br -.ie \\n(.$>=3 .ne \\$3 -.el .ne 3 -.IP "\\$1" \\$2 -.. -.TH "TALLOC" 3 "" "" "" -.SH NAME -talloc \- hierarchical reference counted memory pool system with destructors -.SH "SYNOPSIS" - -.nf -#include -.fi - -.SH "DESCRIPTION" - -.PP -If you are used to talloc from Samba3 then please read this carefully, as talloc has changed a lot\&. - -.PP -The new talloc is a hierarchical, reference counted memory pool system with destructors\&. Quite a mouthful really, but not too bad once you get used to it\&. - -.PP -Perhaps the biggest change from Samba3 is that there is no distinction between a "talloc context" and a "talloc pointer"\&. Any pointer returned from talloc() is itself a valid talloc context\&. This means you can do this: - -.nf - - struct foo *X = talloc(mem_ctx, struct foo); - X\->name = talloc_strdup(X, "foo"); - -.fi - -.PP -and the pointer X\->name would be a "child" of the talloc context X which is itself a child of mem_ctx\&. So if you do talloc_free(mem_ctx) then it is all destroyed, whereas if you do talloc_free(X) then just X and X\->name are destroyed, and if you do talloc_free(X\->name) then just the name element of X is destroyed\&. - -.PP -If you think about this, then what this effectively gives you is an n\-ary tree, where you can free any part of the tree with talloc_free()\&. - -.PP -If you find this confusing, then I suggest you run the testsuite program to watch talloc in action\&. You may also like to add your own tests to testsuite\&.c to clarify how some particular situation is handled\&. - -.SH "TALLOC API" - -.PP -The following is a complete guide to the talloc API\&. Read it all at least twice\&. - -.SS "(type *)talloc(const void *ctx, type);" - -.PP -The talloc() macro is the core of the talloc library\&. It takes a memory \fIctx\fR and a \fItype\fR, and returns a pointer to a new area of memory of the given \fItype\fR\&. - -.PP -The returned pointer is itself a talloc context, so you can use it as the \fIctx\fR argument to more calls to talloc() if you wish\&. - -.PP -The returned pointer is a "child" of the supplied context\&. This means that if you talloc_free() the \fIctx\fR then the new child disappears as well\&. Alternatively you can free just the child\&. - -.PP -The \fIctx\fR argument to talloc() can be NULL, in which case a new top level context is created\&. - -.SS "void *talloc_size(const void *ctx, size_t size);" - -.PP -The function talloc_size() should be used when you don't have a convenient type to pass to talloc()\&. Unlike talloc(), it is not type safe (as it returns a void *), so you are on your own for type checking\&. - -.SS "int talloc_free(void *ptr);" - -.PP -The talloc_free() function frees a piece of talloc memory, and all its children\&. You can call talloc_free() on any pointer returned by talloc()\&. - -.PP -The return value of talloc_free() indicates success or failure, with 0 returned for success and \-1 for failure\&. The only possible failure condition is if \fIptr\fR had a destructor attached to it and the destructor returned \-1\&. See ``talloc_set_destructor()'' for details on destructors\&. - -.PP -If this pointer has an additional parent when talloc_free() is called then the memory is not actually released, but instead the most recently established parent is destroyed\&. See ``talloc_reference()'' for details on establishing additional parents\&. - -.PP -For more control on which parent is removed, see ``talloc_unlink()''\&. - -.PP -talloc_free() operates recursively on its children\&. - -.SS "void *talloc_reference(const void *ctx, const void *ptr);" - -.PP -The talloc_reference() function makes \fIctx\fR an additional parent of \fIptr\fR\&. - -.PP -The return value of talloc_reference() is always the original pointer \fIptr\fR, unless talloc ran out of memory in creating the reference in which case it will return NULL (each additional reference consumes around 48 bytes of memory on intel x86 platforms)\&. - -.PP -If \fIptr\fR is NULL, then the function is a no\-op, and simply returns NULL\&. - -.PP -After creating a reference you can free it in one of the following ways: - -.PP - - -.TP 3 -\(bu -you can talloc_free() any parent of the original pointer\&. That will reduce the number of parents of this pointer by 1, and will cause this pointer to be freed if it runs out of parents\&. -.TP -\(bu -you can talloc_free() the pointer itself\&. That will destroy the most recently established parent to the pointer and leave the pointer as a child of its current parent\&. -.LP - - -.PP -For more control on which parent to remove, see ``talloc_unlink()''\&. - -.SS "int talloc_unlink(const void *ctx, const void *ptr);" - -.PP -The talloc_unlink() function removes a specific parent from \fIptr\fR\&. The \fIctx\fR passed must either be a context used in talloc_reference() with this pointer, or must be a direct parent of ptr\&. - -.PP -Note that if the parent has already been removed using talloc_free() then this function will fail and will return \-1\&. Likewise, if \fIptr\fR is NULL, then the function will make no modifications and return \-1\&. - -.PP -Usually you can just use talloc_free() instead of talloc_unlink(), but sometimes it is useful to have the additional control on which parent is removed\&. - -.SS "void talloc_set_destructor(const void *ptr, int (*destructor)(void *));" - -.PP -The function talloc_set_destructor() sets the \fIdestructor\fR for the pointer \fIptr\fR\&. A \fIdestructor\fR is a function that is called when the memory used by a pointer is about to be released\&. The destructor receives \fIptr\fR as an argument, and should return 0 for success and \-1 for failure\&. - -.PP -The \fIdestructor\fR can do anything it wants to, including freeing other pieces of memory\&. A common use for destructors is to clean up operating system resources (such as open file descriptors) contained in the structure the destructor is placed on\&. - -.PP -You can only place one destructor on a pointer\&. If you need more than one destructor then you can create a zero\-length child of the pointer and place an additional destructor on that\&. - -.PP -To remove a destructor call talloc_set_destructor() with NULL for the destructor\&. - -.PP -If your destructor attempts to talloc_free() the pointer that it is the destructor for then talloc_free() will return \-1 and the free will be ignored\&. This would be a pointless operation anyway, as the destructor is only called when the memory is just about to go away\&. - -.SS "void talloc_increase_ref_count(const void *ptr);" - -.PP -The talloc_increase_ref_count(\fIptr\fR) function is exactly equivalent to: - -.nf -talloc_reference(NULL, ptr); -.fi - -.PP -You can use either syntax, depending on which you think is clearer in your code\&. - -.SS "void talloc_set_name(const void *ptr, const char *fmt, ...);" - -.PP -Each talloc pointer has a "name"\&. The name is used principally for debugging purposes, although it is also possible to set and get the name on a pointer in as a way of "marking" pointers in your code\&. - -.PP -The main use for names on pointer is for "talloc reports"\&. See ``talloc_report()'' and ``talloc_report_full()'' for details\&. Also see ``talloc_enable_leak_report()'' and ``talloc_enable_leak_report_full()''\&. - -.PP -The talloc_set_name() function allocates memory as a child of the pointer\&. It is logically equivalent to: - -.nf -talloc_set_name_const(ptr, talloc_asprintf(ptr, fmt, \&.\&.\&.)); -.fi - -.PP -Note that multiple calls to talloc_set_name() will allocate more memory without releasing the name\&. All of the memory is released when the ptr is freed using talloc_free()\&. - -.SS "void talloc_set_name_const(const void *ptr, const char *name);" - -.PP -The function talloc_set_name_const() is just like talloc_set_name(), but it takes a string constant, and is much faster\&. It is extensively used by the "auto naming" macros, such as talloc_p()\&. - -.PP -This function does not allocate any memory\&. It just copies the supplied pointer into the internal representation of the talloc ptr\&. This means you must not pass a \fIname\fR pointer to memory that will disappear before \fIptr\fR is freed with talloc_free()\&. - -.SS "void *talloc_named(const void *ctx, size_t size, const char *fmt, ...);" - -.PP -The talloc_named() function creates a named talloc pointer\&. It is equivalent to: - -.nf -ptr = talloc_size(ctx, size); -talloc_set_name(ptr, fmt, \&.\&.\&.\&.); -.fi - -.SS "void *talloc_named_const(const void *ctx, size_t size, const char *name);" - -.PP -This is equivalent to: - -.nf -ptr = talloc_size(ctx, size); -talloc_set_name_const(ptr, name); -.fi - -.SS "const char *talloc_get_name(const void *ptr);" - -.PP -This returns the current name for the given talloc pointer, \fIptr\fR\&. See ``talloc_set_name()'' for details\&. - -.SS "void *talloc_init(const char *fmt, ...);" - -.PP -This function creates a zero length named talloc context as a top level context\&. It is equivalent to: - -.nf -talloc_named(NULL, 0, fmt, \&.\&.\&.); -.fi - -.SS "void *talloc_new(void *ctx);" - -.PP -This is a utility macro that creates a new memory context hanging off an exiting context, automatically naming it "talloc_new: __location__" where __location__ is the source line it is called from\&. It is particularly useful for creating a new temporary working context\&. - -.SS "(type *)talloc_realloc(const void *ctx, void *ptr, type, count);" - -.PP -The talloc_realloc() macro changes the size of a talloc pointer\&. It has the following equivalences: - -.nf -talloc_realloc(ctx, NULL, type, 1) ==> talloc(ctx, type); -talloc_realloc(ctx, ptr, type, 0) ==> talloc_free(ptr); -.fi - -.PP -The \fIctx\fR argument is only used if \fIptr\fR is not NULL, otherwise it is ignored\&. - -.PP -talloc_realloc() returns the new pointer, or NULL on failure\&. The call will fail either due to a lack of memory, or because the pointer has more than one parent (see ``talloc_reference()'')\&. - -.SS "void *talloc_realloc_size(const void *ctx, void *ptr, size_t size);" - -.PP -the talloc_realloc_size() function is useful when the type is not known so the type\-safe talloc_realloc() cannot be used\&. - -.SS "void *talloc_steal(const void *new_ctx, const void *ptr);" - -.PP -The talloc_steal() function changes the parent context of a talloc pointer\&. It is typically used when the context that the pointer is currently a child of is going to be freed and you wish to keep the memory for a longer time\&. - -.PP -The talloc_steal() function returns the pointer that you pass it\&. It does not have any failure modes\&. - -.PP -NOTE: It is possible to produce loops in the parent/child relationship if you are not careful with talloc_steal()\&. No guarantees are provided as to your sanity or the safety of your data if you do this\&. - -.SS "off_t talloc_total_size(const void *ptr);" - -.PP -The talloc_total_size() function returns the total size in bytes used by this pointer and all child pointers\&. Mostly useful for debugging\&. - -.PP -Passing NULL is allowed, but it will only give a meaningful result if talloc_enable_leak_report() or talloc_enable_leak_report_full() has been called\&. - -.SS "off_t talloc_total_blocks(const void *ptr);" - -.PP -The talloc_total_blocks() function returns the total memory block count used by this pointer and all child pointers\&. Mostly useful for debugging\&. - -.PP -Passing NULL is allowed, but it will only give a meaningful result if talloc_enable_leak_report() or talloc_enable_leak_report_full() has been called\&. - -.SS "void talloc_report(const void *ptr, FILE *f);" - -.PP -The talloc_report() function prints a summary report of all memory used by \fIptr\fR\&. One line of report is printed for each immediate child of ptr, showing the total memory and number of blocks used by that child\&. - -.PP -You can pass NULL for the pointer, in which case a report is printed for the top level memory context, but only if talloc_enable_leak_report() or talloc_enable_leak_report_full() has been called\&. - -.SS "void talloc_report_full(const void *ptr, FILE *f);" - -.PP -This provides a more detailed report than talloc_report()\&. It will recursively print the entire tree of memory referenced by the pointer\&. References in the tree are shown by giving the name of the pointer that is referenced\&. - -.PP -You can pass NULL for the pointer, in which case a report is printed for the top level memory context, but only if talloc_enable_leak_report() or talloc_enable_leak_report_full() has been called\&. - -.SS "void talloc_enable_leak_report(void);" - -.PP -This enables calling of talloc_report(NULL, stderr) when the program exits\&. In Samba4 this is enabled by using the \-\-leak\-report command line option\&. - -.PP -For it to be useful, this function must be called before any other talloc function as it establishes a "null context" that acts as the top of the tree\&. If you don't call this function first then passing NULL to talloc_report() or talloc_report_full() won't give you the full tree printout\&. - -.PP -Here is a typical talloc report: - -.IP -talloc report on 'null_context' (total 267 bytes in 15 blocks) -libcli/auth/spnego_parse\&.c:55 contains 31 bytes in 2 blocks -libcli/auth/spnego_parse\&.c:55 contains 31 bytes in 2 blocks -iconv(UTF8,CP850) contains 42 bytes in 2 blocks -libcli/auth/spnego_parse\&.c:55 contains 31 bytes in 2 blocks -iconv(CP850,UTF8) contains 42 bytes in 2 blocks -iconv(UTF8,UTF\-16LE) contains 45 bytes in 2 blocks -iconv(UTF\-16LE,UTF8) contains 45 bytes in 2 blocks - -.SS "void talloc_enable_leak_report_full(void);" - -.PP -This enables calling of talloc_report_full(NULL, stderr) when the program exits\&. In Samba4 this is enabled by using the \-\-leak\-report\-full command line option\&. - -.PP -For it to be useful, this function must be called before any other talloc function as it establishes a "null context" that acts as the top of the tree\&. If you don't call this function first then passing NULL to talloc_report() or talloc_report_full() won't give you the full tree printout\&. - -.PP -Here is a typical full report: - -.IP -full talloc report on 'root' (total 18 bytes in 8 blocks) -p1 contains 18 bytes in 7 blocks (ref 0) - r1 contains 13 bytes in 2 blocks (ref 0) - reference to: p2 - p2 contains 1 bytes in 1 blocks (ref 1) - x3 contains 1 bytes in 1 blocks (ref 0) - x2 contains 1 bytes in 1 blocks (ref 0) - x1 contains 1 bytes in 1 blocks (ref 0) - -.SS "(type *)talloc_zero(const void *ctx, type);" - -.PP -The talloc_zero() macro is equivalent to: - -.nf -ptr = talloc(ctx, type); -if (ptr) memset(ptr, 0, sizeof(type)); -.fi - -.SS "void *talloc_zero_size(const void *ctx, size_t size)" - -.PP -The talloc_zero_size() function is useful when you don't have a known type\&. - -.SS "void *talloc_memdup(const void *ctx, const void *p, size_t size);" - -.PP -The talloc_memdup() function is equivalent to: - -.nf -ptr = talloc_size(ctx, size); -if (ptr) memcpy(ptr, p, size); -.fi - -.SS "char *talloc_strdup(const void *ctx, const char *p);" - -.PP -The talloc_strdup() function is equivalent to: - -.nf -ptr = talloc_size(ctx, strlen(p)+1); -if (ptr) memcpy(ptr, p, strlen(p)+1); -.fi - -.PP -This function sets the name of the new pointer to the passed string\&. This is equivalent to: - -.nf -talloc_set_name_const(ptr, ptr) -.fi - -.SS "char *talloc_strndup(const void *t, const char *p, size_t n);" - -.PP -The talloc_strndup() function is the talloc equivalent of the C library function strndup(3)\&. - -.PP -This function sets the name of the new pointer to the passed string\&. This is equivalent to: - -.nf -talloc_set_name_const(ptr, ptr) -.fi - -.SS "char *talloc_vasprintf(const void *t, const char *fmt, va_list ap);" - -.PP -The talloc_vasprintf() function is the talloc equivalent of the C library function vasprintf(3)\&. - -.SS "char *talloc_asprintf(const void *t, const char *fmt, ...);" - -.PP -The talloc_asprintf() function is the talloc equivalent of the C library function asprintf(3)\&. - -.PP -This function sets the name of the new pointer to the passed string\&. This is equivalent to: - -.nf -talloc_set_name_const(ptr, ptr) -.fi - -.SS "char *talloc_asprintf_append(char *s, const char *fmt, ...);" - -.PP -The talloc_asprintf_append() function appends the given formatted string to the given string\&. - -.SS "(type *)talloc_array(const void *ctx, type, uint_t count);" - -.PP -The talloc_array() macro is equivalent to: - -.nf -(type *)talloc_size(ctx, sizeof(type) * count); -.fi - -.PP -except that it provides integer overflow protection for the multiply, returning NULL if the multiply overflows\&. - -.SS "void *talloc_array_size(const void *ctx, size_t size, uint_t count);" - -.PP -The talloc_array_size() function is useful when the type is not known\&. It operates in the same way as talloc_array(), but takes a size instead of a type\&. - -.SS "void *talloc_realloc_fn(const void *ctx, void *ptr, size_t size)" - -.PP -This is a non\-macro version of talloc_realloc(), which is useful as libraries sometimes want a realloc function pointer\&. A realloc(3) implementation encapsulates the functionality of malloc(3), free(3) and realloc(3) in one call, which is why it is useful to be able to pass around a single function pointer\&. - -.SS "void *talloc_autofree_context(void);" - -.PP -This is a handy utility function that returns a talloc context which will be automatically freed on program exit\&. This can be used to reduce the noise in memory leak reports\&. - -.SS "void *talloc_check_name(const void *ptr, const char *name);" - -.PP -This function checks if a pointer has the specified \fIname\fR\&. If it does then the pointer is returned\&. It it doesn't then NULL is returned\&. - -.SS "(type *)talloc_get_type(const void *ptr, type);" - -.PP -This macro allows you to do type checking on talloc pointers\&. It is particularly useful for void* private pointers\&. It is equivalent to this: - -.nf -(type *)talloc_check_name(ptr, #type) -.fi - -.SS "talloc_set_type(const void *ptr, type);" - -.PP -This macro allows you to force the name of a pointer to be a particular \fItype\fR\&. This can be used in conjunction with talloc_get_type() to do type checking on void* pointers\&. - -.PP -It is equivalent to this: - -.nf -talloc_set_name_const(ptr, #type) -.fi - -.SH "PERFORMANCE" - -.PP -All the additional features of talloc(3) over malloc(3) do come at a price\&. We have a simple performance test in Samba4 that measures talloc() versus malloc() performance, and it seems that talloc() is about 10% slower than malloc() on my x86 Debian Linux box\&. For Samba, the great reduction in code complexity that we get by using talloc makes this worthwhile, especially as the total overhead of talloc/malloc in Samba is already quite small\&. - -.SH "SEE ALSO" - -.PP -malloc(3), strndup(3), vasprintf(3), asprintf(3), \fIhttp://talloc.samba.org/\fR - -.SH "COPYRIGHT/LICENSE" - -.PP -Copyright (C) Andrew Tridgell 2004 - -.PP -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\&. - -.PP -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\&. - -.PP -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\&. - -- cgit From dbbf90d8a27b40f2be948f2ea8355a15252cf384 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 20 Mar 2006 20:53:00 +0000 Subject: r14587: Allow building without GNU make and/or without xsltproc (This used to be commit 33709dc5b3652f4d4c7281bec4ba7160a6d87598) --- source4/lib/talloc/Makefile.in | 11 +++++++---- source4/lib/talloc/configure.in | 5 +++++ 2 files changed, 12 insertions(+), 4 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index f11124e707..083ab449bf 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -7,17 +7,20 @@ XSLTPROC = @XSLTPROC@ INSTALLCMD = @INSTALL@ CC = @CC@ CFLAGS = @CFLAGS@ -DHAVE_CONFIG_H= +EXTRA_TARGETS = @DOC_TARGET@ + +.SUFFIXES: .c .o .3 .3.xml .xml .html LIBOBJ = talloc.o -all: libtalloc.a testsuite +all: libtalloc.a testsuite $(EXTRA_TARGETS) testsuite: $(LIBOBJ) testsuite.o $(CC) $(CFLAGS) -o testsuite testsuite.o $(LIBOBJ) $(LIBS) libtalloc.a: libtalloc.a($(LIBOBJ)) -install: all doc +install: all ${INSTALLCMD} -d ${libdir} ${INSTALLCMD} -m 755 libtalloc.a $(libdir) ${INSTALLCMD} -d ${includedir} @@ -28,10 +31,10 @@ install: all doc doc: talloc.3 -%.3: %.3.xml +.3.xml.3: test -z "$(XSLTPROC)" || $(XSLTPROC) -o $@ http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< -%.html: %.xml +.xml.html: test -z "$(XSLTPROC)" || $(XSLTPROC) -o $@ http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl $< clean: diff --git a/source4/lib/talloc/configure.in b/source4/lib/talloc/configure.in index 24a2e4ead6..76d7c74366 100644 --- a/source4/lib/talloc/configure.in +++ b/source4/lib/talloc/configure.in @@ -6,6 +6,11 @@ if test "x$GCC" = "xyes"; then fi AC_PROG_INSTALL AC_PATH_PROG(XSLTPROC,xsltproc) +DOC_TARGET="" +if test -n "$XSLTPROC"; then + DOC_TARGET=doc +fi +AC_SUBST(DOC_TARGET) AC_CONFIG_HEADER(config.h) sinclude(config.m4) AC_OUTPUT(Makefile talloc.pc) -- cgit From 909b111f587705a45f63540b39968f1af58a9b5d Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 25 Mar 2006 16:01:28 +0000 Subject: r14720: Add torture_context argument to all torture tests (This used to be commit 3c7a5ce29108dd82210dc3e1f00414f545949e1d) --- source4/lib/talloc/testsuite.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index a37f8c197e..b03be98587 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -48,6 +48,8 @@ #define BOOL int #endif +struct torture_context; + static struct timeval timeval_current(void) { struct timeval tv; @@ -842,7 +844,7 @@ BOOL test_lifeless(void) } -BOOL torture_local_talloc(void) +BOOL torture_local_talloc(struct torture_context *torture) { BOOL ret = True; @@ -871,8 +873,8 @@ BOOL torture_local_talloc(void) #if !defined(_SAMBA_BUILD_) || ((SAMBA_VERSION_MAJOR==3)&&(SAMBA_VERSION_MINOR<9)) int main(void) { - if (!torture_local_talloc()) { - printf("ERROR: TESTSUIE FAILED\n"); + if (!torture_local_talloc(NULL)) { + printf("ERROR: TESTSUITE FAILED\n"); return -1; } return 0; -- cgit From 4a61e4901ebc751fea57880424f9045e3bdf238e Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 8 Apr 2006 16:05:21 +0000 Subject: r14999: Remove more unused autoconf code Simplify va_copy() replacement code a bit (This used to be commit a5c87360a7f14a90b831ea372277f4f89ee4c5f1) --- source4/lib/talloc/talloc.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 99ede462b8..8f046a02b8 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -999,13 +999,11 @@ char *talloc_strndup(const void *t, const char *p, size_t n) return ret; } -#ifndef VA_COPY -#ifdef HAVE_VA_COPY -#define VA_COPY(dest, src) va_copy(dest, src) -#elif defined(HAVE___VA_COPY) -#define VA_COPY(dest, src) __va_copy(dest, src) +#ifndef HAVE_VA_COPY +#ifdef HAVE___VA_COPY +#define va_copy(dest, src) __va_copy(dest, src) #else -#define VA_COPY(dest, src) (dest) = (src) +#define va_copy(dest, src) (dest) = (src) #endif #endif @@ -1016,7 +1014,7 @@ char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) va_list ap2; char c; - VA_COPY(ap2, ap); + va_copy(ap2, ap); /* this call looks strange, but it makes it work on older solaris boxes */ if ((len = vsnprintf(&c, 1, fmt, ap2)) < 0) { @@ -1025,7 +1023,7 @@ char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) ret = _talloc(t, len+1); if (ret) { - VA_COPY(ap2, ap); + va_copy(ap2, ap); vsnprintf(ret, len+1, fmt, ap2); talloc_set_name_const(ret, ret); } @@ -1067,7 +1065,7 @@ char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) tc = talloc_chunk_from_ptr(s); - VA_COPY(ap2, ap); + va_copy(ap2, ap); s_len = tc->size - 1; if ((len = vsnprintf(NULL, 0, fmt, ap2)) <= 0) { @@ -1083,7 +1081,7 @@ char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) s = talloc_realloc(NULL, s, char, s_len + len+1); if (!s) return NULL; - VA_COPY(ap2, ap); + va_copy(ap2, ap); vsnprintf(s+s_len, len+1, fmt, ap2); talloc_set_name_const(s, s); -- cgit From 69b51f702af1ded825d5c17bdb97014cac12e752 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 24 Apr 2006 15:47:59 +0000 Subject: r15207: Introduce PRIVATE_DEPENDENCIES and PUBLIC_DEPENDENCIES as replacement for REQUIRED_SUBSYSTEMS. (This used to be commit adc8a019b6da256f104abed1b82bfde6998a2ac9) --- source4/lib/talloc/config.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 95d3ac359d..8c704520f5 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -4,7 +4,7 @@ VERSION = 0.0.1 SO_VERSION = 0 OBJ_FILES = talloc.o -REQUIRED_SUBSYSTEMS = LIBREPLACE +PUBLIC_DEPENDENCIES = LIBREPLACE MANPAGE = talloc.3 PUBLIC_HEADERS = talloc.h DESCRIPTION = A hierarchical pool based memory system with destructors -- cgit From 5da75f5c3631247615efdf73fae2481df6908cb8 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 23 May 2006 03:51:44 +0000 Subject: r15824: fixed a subtle talloc bug to do with memory context loops. When you have a structure that references one of its parents, and a parent of that parent is freed, then the whole structure should be freed, not just the reference. this was found by the change notify code, as a side effect of fixing the memory leak yesterday (This used to be commit 70531dcaeeb9314d410baa0d285df6a265311541) --- source4/lib/talloc/talloc.c | 36 +++++++++++++++++++++++++++++++-- source4/lib/talloc/talloc.h | 1 + source4/lib/talloc/testsuite.c | 46 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 80 insertions(+), 3 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 8f046a02b8..823ae4ffb3 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -542,7 +542,13 @@ int talloc_free(void *ptr) tc = talloc_chunk_from_ptr(ptr); if (tc->refs) { + int is_child; + struct talloc_reference_handle *handle = tc->refs; + is_child = talloc_is_parent(handle, handle->ptr); talloc_reference_destructor(tc->refs); + if (is_child) { + return talloc_free(ptr); + } return -1; } @@ -1197,7 +1203,9 @@ void *talloc_find_parent_byname(const void *context, const char *name) return TC_PTR_FROM_CHUNK(tc); } while (tc && tc->prev) tc = tc->prev; - tc = tc->parent; + if (tc) { + tc = tc->parent; + } } return NULL; } @@ -1219,6 +1227,30 @@ void talloc_show_parents(const void *context, FILE *file) while (tc) { fprintf(file, "\t'%s'\n", talloc_get_name(TC_PTR_FROM_CHUNK(tc))); while (tc && tc->prev) tc = tc->prev; - tc = tc->parent; + if (tc) { + tc = tc->parent; + } + } +} + +/* + return 1 if ptr is a parent of context +*/ +int talloc_is_parent(const void *context, const char *ptr) +{ + struct talloc_chunk *tc; + + if (context == NULL) { + return 0; + } + + tc = talloc_chunk_from_ptr(context); + while (tc) { + if (TC_PTR_FROM_CHUNK(tc) == ptr) return 1; + while (tc && tc->prev) tc = tc->prev; + if (tc) { + tc = tc->parent; + } } + return 0; } diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 68bf24e0b8..99410241a6 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -137,6 +137,7 @@ void *talloc_autofree_context(void); size_t talloc_get_size(const void *ctx); void *talloc_find_parent_byname(const void *ctx, const char *name); void talloc_show_parents(const void *context, FILE *file); +int talloc_is_parent(const void *context, const char *ptr); #endif diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index b03be98587..018d734cc3 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -824,7 +824,7 @@ static BOOL test_speed(void) } -BOOL test_lifeless(void) +static BOOL test_lifeless(void) { char *top = talloc_new(NULL); char *parent, *child; @@ -836,10 +836,53 @@ BOOL test_lifeless(void) child = talloc_strdup(parent, "child"); talloc_reference(child, parent); talloc_reference(child_owner, child); + talloc_report_full(top, stdout); talloc_unlink(top, parent); talloc_free(child); talloc_report_full(top, stdout); talloc_free(top); + talloc_free(child_owner); +#if 0 + talloc_free(child); +#endif + return True; +} + +static int loop_destructor_count; + +static int test_loop_destructor(void *ptr) +{ + printf("loop destructor\n"); + loop_destructor_count++; + return 0; +} + +static BOOL test_loop(void) +{ + char *top = talloc_new(NULL); + char *parent; + struct req1 { + char *req2, *req3; + } *req1; + + printf("TESTING TALLOC LOOP DESTRUCTION\n"); + parent = talloc_strdup(top, "parent"); + req1 = talloc(parent, struct req1); + req1->req2 = talloc_strdup(req1, "req2"); + talloc_set_destructor(req1->req2, test_loop_destructor); + req1->req3 = talloc_strdup(req1, "req3"); + talloc_reference(req1->req3, req1); + talloc_report_full(top, stdout); + talloc_free(parent); + talloc_report_full(top, stdout); + talloc_report_full(NULL, stdout); + talloc_free(top); + + if (loop_destructor_count != 1) { + printf("FAILED TO FIRE LOOP DESTRUCTOR\n"); + return False; + } + return True; } @@ -861,6 +904,7 @@ BOOL torture_local_talloc(struct torture_context *torture) ret &= test_realloc_fn(); ret &= test_type(); ret &= test_lifeless(); + ret &= test_loop(); if (ret) { ret &= test_speed(); } -- cgit From 0db0de619070c171dacdf40022011abad8a73cbc Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 23 May 2006 04:36:28 +0000 Subject: r15828: a talloc steal optimisation spotted by metze (This used to be commit e00ff9f35eed28aeecdc779cee06b87c34d82124) --- source4/lib/talloc/talloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 823ae4ffb3..67478fc9d4 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -698,7 +698,7 @@ void *talloc_steal(const void *new_ctx, const void *ptr) new_tc = talloc_chunk_from_ptr(new_ctx); - if (tc == new_tc) { + if (tc == new_tc || tc->parent == new_tc) { return discard_const_p(void, ptr); } -- cgit From a665cccd2ef81e704e90bb228bbd14c0afb031af Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 24 May 2006 07:31:02 +0000 Subject: r15852: patch from Rusty to make talloc_set_destructor() and talloc_steal() type safe. This only works on recent gcc versions. With other compilers it reverts to a non-typesafe cast The patch also ensures that talloc_free() does not change error on systems where free() can change errno (This used to be commit babbff5f777642f559747f6d0697bc7c3a5e798d) --- source4/lib/talloc/talloc.c | 14 +++++++------ source4/lib/talloc/talloc.h | 47 ++++++++++++++++++++++++++++-------------- source4/lib/talloc/testsuite.c | 2 +- 3 files changed, 40 insertions(+), 23 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 67478fc9d4..b34369cb16 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -30,12 +30,12 @@ inspired by http://swapped.cc/halloc/ */ - #include "config.h" #include #include #include +#include #ifdef HAVE_SYS_TYPES_H #include @@ -218,7 +218,7 @@ void *_talloc(const void *context, size_t size) if the destructor fails then the free is failed, and the memory can be continued to be used */ -void talloc_set_destructor(const void *ptr, int (*destructor)(void *)) +void _talloc_set_destructor(const void *ptr, int (*destructor)(void *)) { struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); tc->destructor = destructor; @@ -235,10 +235,9 @@ void talloc_increase_ref_count(const void *ptr) /* helper for talloc_reference() */ -static int talloc_reference_destructor(void *ptr) +static int talloc_reference_destructor(struct talloc_reference_handle *handle) { - struct talloc_reference_handle *handle = ptr; - struct talloc_chunk *tc1 = talloc_chunk_from_ptr(ptr); + struct talloc_chunk *tc1 = talloc_chunk_from_ptr(handle); struct talloc_chunk *tc2 = talloc_chunk_from_ptr(handle->ptr); if (tc1->destructor != (talloc_destructor_t)-1) { tc1->destructor = NULL; @@ -534,6 +533,7 @@ void talloc_free_children(void *ptr) int talloc_free(void *ptr) { struct talloc_chunk *tc; + int old_errno; if (ptr == NULL) { return -1; @@ -586,7 +586,9 @@ int talloc_free(void *ptr) tc->flags |= TALLOC_FLAG_FREE; + old_errno = errno; free(tc); + errno = old_errno; return 0; } @@ -667,7 +669,7 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n ptr on success, or NULL if it could not be transferred. passing NULL as ptr will always return NULL with no side effects. */ -void *talloc_steal(const void *new_ctx, const void *ptr) +void *_talloc_steal(const void *new_ctx, const void *ptr) { struct talloc_chunk *tc, *new_tc; diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 99410241a6..be2b305753 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -40,6 +40,34 @@ typedef void TALLOC_CTX; #define TALLOC_DEPRECATED 0 #endif +#ifndef PRINTF_ATTRIBUTE +#if (__GNUC__ >= 3) +/** Use gcc attribute to check printf fns. a1 is the 1-based index of + * the parameter containing the format, and a2 the index of the first + * argument. Note that some gcc 2.x versions don't handle this + * properly **/ +#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2))) +#else +#define PRINTF_ATTRIBUTE(a1, a2) +#endif +#endif + +/* try to make talloc_set_destructor() and talloc_steal() type safe, + if we have a recent gcc */ +#if (__GNUC__ >= 3) +#define _TALLOC_TYPEOF(ptr) __typeof__(ptr) +#define talloc_set_destructor(ptr, function) \ + do { \ + int (*_talloc_destructor_fn)(typeof(ptr)) = (function); \ + _talloc_set_destructor((ptr), (void *)_talloc_destructor_fn); \ + } while(0) +#define _TALLOC_CHECK_TYPE(type,val) +#else +#define talloc_set_destructor(ptr, function) \ + _talloc_set_destructor((ptr), (int (*)(void *))(function)) +#define _TALLOC_TYPEOF(ptr) void * +#endif + /* useful macros for creating type checked pointers */ #define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) #define talloc_size(ctx, size) talloc_named_const(ctx, size, __location__) @@ -70,7 +98,7 @@ typedef void TALLOC_CTX; #define talloc_get_type(ptr, type) (type *)talloc_check_name(ptr, #type) #define talloc_find_parent_bytype(ptr, type) (type *)talloc_find_parent_byname(ptr, #type) - +#define talloc_steal(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_steal((ctx),(ptr)) #if TALLOC_DEPRECATED #define talloc_zero_p(ctx, type) talloc_zero(ctx, type) @@ -80,22 +108,9 @@ typedef void TALLOC_CTX; #define talloc_destroy(ctx) talloc_free(ctx) #endif -#ifndef PRINTF_ATTRIBUTE -#if (__GNUC__ >= 3) -/** Use gcc attribute to check printf fns. a1 is the 1-based index of - * the parameter containing the format, and a2 the index of the first - * argument. Note that some gcc 2.x versions don't handle this - * properly **/ -#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2))) -#else -#define PRINTF_ATTRIBUTE(a1, a2) -#endif -#endif - - /* The following definitions come from talloc.c */ void *_talloc(const void *context, size_t size); -void talloc_set_destructor(const void *ptr, int (*destructor)(void *)); +void _talloc_set_destructor(const void *ptr, int (*destructor)(void *)); void talloc_increase_ref_count(const void *ptr); void *talloc_reference(const void *context, const void *ptr); int talloc_unlink(const void *context, void *ptr); @@ -111,7 +126,7 @@ void *talloc_parent(const void *ptr); void *talloc_init(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2); int talloc_free(void *ptr); void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *name); -void *talloc_steal(const void *new_ctx, const void *ptr); +void *_talloc_steal(const void *new_ctx, const void *ptr); off_t talloc_total_size(const void *ptr); off_t talloc_total_blocks(const void *ptr); void talloc_report_full(const void *ptr, FILE *f); diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 018d734cc3..f1b19041fa 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -850,7 +850,7 @@ static BOOL test_lifeless(void) static int loop_destructor_count; -static int test_loop_destructor(void *ptr) +static int test_loop_destructor(char *ptr) { printf("loop destructor\n"); loop_destructor_count++; -- cgit From d5e3f86ecef324415a056737b94d80510a22118f Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 24 May 2006 07:45:19 +0000 Subject: r15856: fixed talloc_asprintf_append() on solaris (This used to be commit bba33a976b1954b5e9e557c9323afc92616439a3) --- source4/lib/talloc/talloc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index b34369cb16..d480cc2689 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1066,6 +1066,7 @@ char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) struct talloc_chunk *tc; int len, s_len; va_list ap2; + char c; if (s == NULL) { return talloc_vasprintf(NULL, fmt, ap); @@ -1076,7 +1077,7 @@ char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) va_copy(ap2, ap); s_len = tc->size - 1; - if ((len = vsnprintf(NULL, 0, fmt, ap2)) <= 0) { + if ((len = vsnprintf(&c, 1, fmt, ap2)) <= 0) { /* Either the vsnprintf failed or the format resulted in * no characters being formatted. In the former case, we * ought to return NULL, in the latter we ought to return -- cgit From ca17b875b3b442704625f85afdd154c9b756ca5d Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 21 Jun 2006 17:49:34 +0000 Subject: r16442: if we want to use CHECK_SIZE(NULL, 3) we need null tracking, so enable it explicit before running any tests metze (This used to be commit f3cd971ab70c3edee4da87b8ca38ec215c8bff49) --- source4/lib/talloc/testsuite.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index f1b19041fa..334aa3c2e1 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -891,6 +891,8 @@ BOOL torture_local_talloc(struct torture_context *torture) { BOOL ret = True; + talloc_enable_null_tracking(); + ret &= test_ref1(); ret &= test_ref2(); ret &= test_ref3(); -- cgit From 3a0a00f1b99757976218924b14082ce765ca1d7c Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 21 Jun 2006 19:26:48 +0000 Subject: r16445: print out values metze (This used to be commit 972634b2021e60b27d68b0fd6d49ef95398d92e2) --- source4/lib/talloc/testsuite.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 334aa3c2e1..10810f30e9 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -389,7 +389,8 @@ static BOOL test_misc(void) talloc_set_name(p1, "my name is %s", "foo"); if (strcmp(talloc_get_name(p1), "my name is foo") != 0) { - printf("failed: wrong name after talloc_set_name\n"); + printf("failed: wrong name after talloc_set_name(my name is foo) - '%s'\n", + talloc_get_name(p1)); return False; } CHECK_BLOCKS(p1, 2); @@ -397,7 +398,8 @@ static BOOL test_misc(void) talloc_set_name_const(p1, NULL); if (strcmp(talloc_get_name(p1), "UNNAMED") != 0) { - printf("failed: wrong name after talloc_set_name(NULL)\n"); + printf("failed: wrong name after talloc_set_name(NULL) - '%s'\n", + talloc_get_name(p1)); return False; } CHECK_BLOCKS(p1, 2); -- cgit From 816c055123ab2706ec09811e6375e6e8d8c8dd13 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 21 Jun 2006 19:28:24 +0000 Subject: r16446: talloc_set_name() allocates and can fail... pass the error to the callers metze (This used to be commit 7aa07a1e0b2abd1a6ecd490410685d20c0201094) --- source4/lib/talloc/talloc.c | 27 +++++++++++++++++++++------ source4/lib/talloc/talloc.h | 2 +- 2 files changed, 22 insertions(+), 7 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index d480cc2689..ab199678c1 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -364,26 +364,29 @@ int talloc_unlink(const void *context, void *ptr) /* add a name to an existing pointer - va_list version */ -static void talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); +static const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); -static void talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) +static const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) { struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); tc->name = talloc_vasprintf(ptr, fmt, ap); if (tc->name) { talloc_set_name_const(tc->name, ".name"); } + return tc->name; } /* add a name to an existing pointer */ -void talloc_set_name(const void *ptr, const char *fmt, ...) +const char *talloc_set_name(const void *ptr, const char *fmt, ...) { + const char *name; va_list ap; va_start(ap, fmt); - talloc_set_name_v(ptr, fmt, ap); + name = talloc_set_name_v(ptr, fmt, ap); va_end(ap); + return name; } /* @@ -405,14 +408,20 @@ void *talloc_named(const void *context, size_t size, const char *fmt, ...) { va_list ap; void *ptr; + const char *name; ptr = _talloc(context, size); if (ptr == NULL) return NULL; va_start(ap, fmt); - talloc_set_name_v(ptr, fmt, ap); + name = talloc_set_name_v(ptr, fmt, ap); va_end(ap); + if (name == NULL) { + talloc_free(ptr); + return NULL; + } + return ptr; } @@ -474,14 +483,20 @@ void *talloc_init(const char *fmt, ...) { va_list ap; void *ptr; + const char *name; ptr = _talloc(NULL, 0); if (ptr == NULL) return NULL; va_start(ap, fmt); - talloc_set_name_v(ptr, fmt, ap); + name = talloc_set_name_v(ptr, fmt, ap); va_end(ap); + if (name == NULL) { + talloc_free(ptr); + return NULL; + } + return ptr; } diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index be2b305753..d71e60cb45 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -114,7 +114,7 @@ void _talloc_set_destructor(const void *ptr, int (*destructor)(void *)); void talloc_increase_ref_count(const void *ptr); void *talloc_reference(const void *context, const void *ptr); int talloc_unlink(const void *context, void *ptr); -void talloc_set_name(const void *ptr, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); +const char *talloc_set_name(const void *ptr, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); void talloc_set_name_const(const void *ptr, const char *name); void *talloc_named(const void *context, size_t size, const char *fmt, ...) PRINTF_ATTRIBUTE(3,4); -- cgit From 3cd96fd4f9d19ebd12c849ba6997ee8ea35a9646 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 21 Jun 2006 20:28:51 +0000 Subject: r16447: print the result of talloc_set_parent() trying to find the bug on HPUX metze (This used to be commit 3db6bd87158cd615a3e35009598863758099595b) --- source4/lib/talloc/testsuite.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 10810f30e9..477d9a5848 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -351,6 +351,7 @@ static BOOL test_misc(void) void *root, *p1; char *p2; double *d; + const char *name; printf("TESTING MISCELLANEOUS\n"); @@ -387,10 +388,10 @@ static BOOL test_misc(void) CHECK_BLOCKS(p1, 1); CHECK_BLOCKS(root, 2); - talloc_set_name(p1, "my name is %s", "foo"); + name = talloc_set_name(p1, "my name is %s", "foo"); if (strcmp(talloc_get_name(p1), "my name is foo") != 0) { - printf("failed: wrong name after talloc_set_name(my name is foo) - '%s'\n", - talloc_get_name(p1)); + printf("failed: wrong name after talloc_set_name(my name is foo) - '%s'=>'%s'\n", + (name?name:"NULL"), talloc_get_name(p1)); return False; } CHECK_BLOCKS(p1, 2); -- cgit From ec2b3baf09ebff97bc958e73591e128f14c7a378 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 10 Jul 2006 16:47:47 +0000 Subject: r16922: move some macros out of talloc.h as the don't belong to talloc metze (This used to be commit 4c68e315e2288eef97527911daf18622a994ac31) --- source4/lib/talloc/talloc.h | 8 -------- 1 file changed, 8 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index d71e60cb45..a4eef14bd0 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -86,14 +86,6 @@ typedef void TALLOC_CTX; #define talloc_memdup(t, p, size) _talloc_memdup(t, p, size, __location__) -#define malloc_p(type) (type *)malloc(sizeof(type)) -#define malloc_array_p(type, count) (type *)realloc_array(NULL, sizeof(type), count) -#define realloc_p(p, type, count) (type *)realloc_array(p, sizeof(type), count) - -#define data_blob(ptr, size) data_blob_named(ptr, size, "DATA_BLOB: "__location__) -#define data_blob_talloc(ctx, ptr, size) data_blob_talloc_named(ctx, ptr, size, "DATA_BLOB: "__location__) -#define data_blob_dup_talloc(ctx, blob) data_blob_talloc_named(ctx, (blob)->data, (blob)->length, "DATA_BLOB: "__location__) - #define talloc_set_type(ptr, type) talloc_set_name_const(ptr, #type) #define talloc_get_type(ptr, type) (type *)talloc_check_name(ptr, #type) -- cgit From cab68a413b55818c3ed5003832d65f976abce28f Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sat, 15 Jul 2006 13:28:52 +0000 Subject: r17061: - remove the currect talloc chunk from it's parent before freeing the children this fixes an endless loop bug! - reenable the test for this should I merge this to samba3? metze (This used to be commit 0559222b62930765519aaab5d33609ece29014d6) --- source4/lib/talloc/talloc.c | 8 +++----- source4/lib/talloc/testsuite.c | 3 +-- 2 files changed, 4 insertions(+), 7 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index ab199678c1..05bc09a21e 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -585,10 +585,6 @@ int talloc_free(void *ptr) tc->destructor = NULL; } - tc->flags |= TALLOC_FLAG_LOOP; - - talloc_free_children(ptr); - if (tc->parent) { _TLIST_REMOVE(tc->parent->child, tc); if (tc->parent->child) { @@ -599,8 +595,10 @@ int talloc_free(void *ptr) if (tc->next) tc->next->prev = tc->prev; } - tc->flags |= TALLOC_FLAG_FREE; + tc->flags |= TALLOC_FLAG_LOOP; + talloc_free_children(ptr); + tc->flags |= TALLOC_FLAG_FREE; old_errno = errno; free(tc); errno = old_errno; diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 477d9a5848..2b04f66fc4 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -845,9 +845,8 @@ static BOOL test_lifeless(void) talloc_report_full(top, stdout); talloc_free(top); talloc_free(child_owner); -#if 0 talloc_free(child); -#endif + return True; } -- cgit From 4e4e698f2b59716464d2514bea3e6049170e7272 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sat, 15 Jul 2006 14:09:21 +0000 Subject: r17062: make correct use of talloc destructors, and make the code much simpler should I merge that aslo to samba3? metze (This used to be commit c5672a54a02e3f457effd7cc693a6f6ac2dcc621) --- source4/lib/talloc/talloc.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 05bc09a21e..2ebaafbb83 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -237,13 +237,8 @@ void talloc_increase_ref_count(const void *ptr) */ static int talloc_reference_destructor(struct talloc_reference_handle *handle) { - struct talloc_chunk *tc1 = talloc_chunk_from_ptr(handle); - struct talloc_chunk *tc2 = talloc_chunk_from_ptr(handle->ptr); - if (tc1->destructor != (talloc_destructor_t)-1) { - tc1->destructor = NULL; - } - _TLIST_REMOVE(tc2->refs, handle); - talloc_free(handle); + struct talloc_chunk *ptr_tc = talloc_chunk_from_ptr(handle->ptr); + _TLIST_REMOVE(ptr_tc->refs, handle); return 0; } @@ -302,10 +297,7 @@ static int talloc_unreference(const void *context, const void *ptr) return -1; } - talloc_set_destructor(h, NULL); - _TLIST_REMOVE(tc->refs, h); - talloc_free(h); - return 0; + return talloc_free(h); } /* @@ -558,9 +550,15 @@ int talloc_free(void *ptr) if (tc->refs) { int is_child; - struct talloc_reference_handle *handle = tc->refs; - is_child = talloc_is_parent(handle, handle->ptr); - talloc_reference_destructor(tc->refs); + /* check this is a reference from a child or grantchild + * back to it's parent or grantparent + * + * in that case we need to remove the reference and + * call another instance of talloc_free() on the current + * pointer. + */ + is_child = talloc_is_parent(tc->refs, ptr); + talloc_free(tc->refs); if (is_child) { return talloc_free(ptr); } -- cgit From e3fd9ccd4e8d8dfcef1ef2f475de271e28b79a57 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 18 Jul 2006 11:49:43 +0000 Subject: r17109: - use AC_SYS_LARGEFILE so that type sizes are the same when talloc is build standalone and inside samba - add configure checks for the some type sizes for debugging metze (This used to be commit 2977e7097ae9d6b96bb6f01c5c20bc2f3a518050) --- source4/lib/talloc/config.m4 | 3 +++ source4/lib/talloc/configure.in | 1 + 2 files changed, 4 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.m4 b/source4/lib/talloc/config.m4 index 824eb6d1ff..ad38988e14 100644 --- a/source4/lib/talloc/config.m4 +++ b/source4/lib/talloc/config.m4 @@ -8,3 +8,6 @@ fi AC_CHECK_TYPE(intptr_t, unsigned long long) AC_CHECK_HEADERS(stdint.h stdarg.h unistd.h sys/types.h) +AC_CHECK_SIZEOF(off_t,cross) +AC_CHECK_SIZEOF(size_t,cross) +AC_CHECK_SIZEOF(ssize_t,cross) diff --git a/source4/lib/talloc/configure.in b/source4/lib/talloc/configure.in index 76d7c74366..6cd620d906 100644 --- a/source4/lib/talloc/configure.in +++ b/source4/lib/talloc/configure.in @@ -12,5 +12,6 @@ if test -n "$XSLTPROC"; then fi AC_SUBST(DOC_TARGET) AC_CONFIG_HEADER(config.h) +AC_SYS_LARGEFILE sinclude(config.m4) AC_OUTPUT(Makefile talloc.pc) -- cgit From 02ac968a2651a2093fe8bb4edb049d80231cdadb Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 20 Jul 2006 12:51:42 +0000 Subject: r17156: check for the size of a pointer metze (This used to be commit 58e124ade31efbd72297ecc41d8ddfc48546ac53) --- source4/lib/talloc/config.m4 | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.m4 b/source4/lib/talloc/config.m4 index ad38988e14..bcac5770ce 100644 --- a/source4/lib/talloc/config.m4 +++ b/source4/lib/talloc/config.m4 @@ -11,3 +11,4 @@ AC_CHECK_HEADERS(stdint.h stdarg.h unistd.h sys/types.h) AC_CHECK_SIZEOF(off_t,cross) AC_CHECK_SIZEOF(size_t,cross) AC_CHECK_SIZEOF(ssize_t,cross) +AC_CHECK_SIZEOF(void *,cross) -- cgit From 48fac823d2cfd4c82c6a4ac232dfd15b51ac0616 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 20 Jul 2006 14:35:41 +0000 Subject: r17157: bail out if sizeof(size_t) < sizeof(void *) metze (This used to be commit f94198c2a8afd79b4c156773d14de691fd8bf0d5) --- source4/lib/talloc/config.m4 | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.m4 b/source4/lib/talloc/config.m4 index bcac5770ce..bbb2b35af8 100644 --- a/source4/lib/talloc/config.m4 +++ b/source4/lib/talloc/config.m4 @@ -12,3 +12,7 @@ AC_CHECK_SIZEOF(off_t,cross) AC_CHECK_SIZEOF(size_t,cross) AC_CHECK_SIZEOF(ssize_t,cross) AC_CHECK_SIZEOF(void *,cross) + +if test $ac_cv_sizeof_size_t -lt $ac_cv_sizeof_void_p; then + AC_ERROR([sizeof(size_t) < sizeof(void *)]) +fi -- cgit From 550f5fb26e67f46eead182476f7a9bcfd1ac5dc0 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 21 Jul 2006 10:34:10 +0000 Subject: r17176: remove off_t from talloc. size_t is large enough to hold the max amount of memory of one process metze (This used to be commit f47b7bb656c8854c16c5a28ba24d18eeb22b6e22) --- source4/lib/talloc/config.m4 | 2 -- source4/lib/talloc/talloc.3.xml | 4 ++-- source4/lib/talloc/talloc.c | 10 +++++----- source4/lib/talloc/talloc.h | 4 ++-- source4/lib/talloc/talloc_guide.txt | 4 ++-- 5 files changed, 11 insertions(+), 13 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.m4 b/source4/lib/talloc/config.m4 index bbb2b35af8..53066333d2 100644 --- a/source4/lib/talloc/config.m4 +++ b/source4/lib/talloc/config.m4 @@ -8,9 +8,7 @@ fi AC_CHECK_TYPE(intptr_t, unsigned long long) AC_CHECK_HEADERS(stdint.h stdarg.h unistd.h sys/types.h) -AC_CHECK_SIZEOF(off_t,cross) AC_CHECK_SIZEOF(size_t,cross) -AC_CHECK_SIZEOF(ssize_t,cross) AC_CHECK_SIZEOF(void *,cross) if test $ac_cv_sizeof_size_t -lt $ac_cv_sizeof_void_p; then diff --git a/source4/lib/talloc/talloc.3.xml b/source4/lib/talloc/talloc.3.xml index 7b254ae7c7..ef032f8426 100644 --- a/source4/lib/talloc/talloc.3.xml +++ b/source4/lib/talloc/talloc.3.xml @@ -364,7 +364,7 @@ talloc_realloc(ctx, ptr, type, 0) ==> talloc_free(ptr); data if you do this. - off_t talloc_total_size(const void *<emphasis role="italic">ptr</emphasis>); + size_t talloc_total_size(const void *<emphasis role="italic">ptr</emphasis>); The talloc_total_size() function returns the total size in bytes used by this pointer and all child pointers. Mostly useful for @@ -376,7 +376,7 @@ talloc_realloc(ctx, ptr, type, 0) ==> talloc_free(ptr); talloc_enable_leak_report_full() has been called. - off_t talloc_total_blocks(const void *<emphasis role="italic">ptr</emphasis>); + size_t talloc_total_blocks(const void *<emphasis role="italic">ptr</emphasis>); The talloc_total_blocks() function returns the total memory block count used by this pointer and all child pointers. Mostly useful diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 2ebaafbb83..ca76b05332 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -735,11 +735,11 @@ void *_talloc_steal(const void *new_ctx, const void *ptr) /* return the total size of a talloc pool (subtree) */ -off_t talloc_total_size(const void *ptr) +size_t talloc_total_size(const void *ptr) { - off_t total = 0; + size_t total = 0; struct talloc_chunk *c, *tc; - + if (ptr == NULL) { ptr = null_context; } @@ -768,9 +768,9 @@ off_t talloc_total_size(const void *ptr) /* return the total number of blocks in a talloc pool (subtree) */ -off_t talloc_total_blocks(const void *ptr) +size_t talloc_total_blocks(const void *ptr) { - off_t total = 0; + size_t total = 0; struct talloc_chunk *c, *tc = talloc_chunk_from_ptr(ptr); if (tc->flags & TALLOC_FLAG_LOOP) { diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index a4eef14bd0..7591b6f318 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -119,8 +119,8 @@ void *talloc_init(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2); int talloc_free(void *ptr); void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *name); void *_talloc_steal(const void *new_ctx, const void *ptr); -off_t talloc_total_size(const void *ptr); -off_t talloc_total_blocks(const void *ptr); +size_t talloc_total_size(const void *ptr); +size_t talloc_total_blocks(const void *ptr); void talloc_report_full(const void *ptr, FILE *f); void talloc_report(const void *ptr, FILE *f); void talloc_enable_null_tracking(void); diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index 1068e5d1cd..5aa8dfa24f 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -318,7 +318,7 @@ as to your sanity or the safety of your data if you do this. talloc_steal (new_ctx, NULL) will return NULL with no sideeffects. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -off_t talloc_total_size(const void *ptr); +size_t talloc_total_size(const void *ptr); The talloc_total_size() function returns the total size in bytes used by this pointer and all child pointers. Mostly useful for debugging. @@ -329,7 +329,7 @@ been called. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -off_t talloc_total_blocks(const void *ptr); +size_t talloc_total_blocks(const void *ptr); The talloc_total_blocks() function returns the total memory block count used by this pointer and all child pointers. Mostly useful for -- cgit From 7cdd639cc28760e80880889a22eb177ad5fe8dc3 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 25 Jul 2006 19:43:49 +0000 Subject: r17238: Add datarootdir (required for newer autoconf versions) (This used to be commit c575dee5c76ca33a07ab62dc59f80ece1bd84abc) --- source4/lib/talloc/Makefile.in | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index 083ab449bf..c1477cea69 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -1,4 +1,5 @@ prefix = @prefix@ +datarootdir = @datarootdir@ exec_prefix = @exec_prefix@ includedir = @includedir@ libdir = @libdir@ -- cgit From d86e04ca1e363bb1285e6d39d5e224ff407d00fe Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 25 Jul 2006 20:09:45 +0000 Subject: r17241: substitude @datarootdir@ with old autoconf versions:-) metze (This used to be commit ed5ffc7bfc57c72bb95562c88bd2ec290daed10c) --- source4/lib/talloc/configure.in | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/configure.in b/source4/lib/talloc/configure.in index 6cd620d906..fc52679737 100644 --- a/source4/lib/talloc/configure.in +++ b/source4/lib/talloc/configure.in @@ -1,5 +1,6 @@ AC_PREREQ(2.50) AC_INIT(talloc.h) +AC_SUBST(datarootdir) AC_PROG_CC if test "x$GCC" = "xyes"; then CFLAGS="$CFLAGS -Wall -W" -- cgit From 8194dfd289e213d7afacffca67b361c741855a00 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 26 Jul 2006 13:06:01 +0000 Subject: r17257: make the size_t is to small error more verbose (hopefully nobody will ever see this:-) metze (This used to be commit 196803a6c6a2588f0d3315bc38a56112ecb81349) --- source4/lib/talloc/config.m4 | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.m4 b/source4/lib/talloc/config.m4 index 53066333d2..d4c68ca52b 100644 --- a/source4/lib/talloc/config.m4 +++ b/source4/lib/talloc/config.m4 @@ -12,5 +12,9 @@ AC_CHECK_SIZEOF(size_t,cross) AC_CHECK_SIZEOF(void *,cross) if test $ac_cv_sizeof_size_t -lt $ac_cv_sizeof_void_p; then + AC_WARN([size_t cannot represent the amount of used memory of a process]) + AC_WARN([please report this to ]) + AC_WARN([sizeof(size_t) = $ac_cv_sizeof_size_t]) + AC_WARN([sizeof(void *) = $ac_cv_sizeof_void_p]) AC_ERROR([sizeof(size_t) < sizeof(void *)]) fi -- cgit From 02ea24bcd1db8b11a9759ae8c7c99b7558bbe29c Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 26 Jul 2006 17:32:47 +0000 Subject: r17263: export talloc_free_children() metze (This used to be commit 195754b169f68399008dda074181a2a16e4ecce5) --- source4/lib/talloc/talloc.h | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 7591b6f318..c6d20c820f 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -117,6 +117,7 @@ void talloc_report_depth(const void *ptr, FILE *f, int depth); void *talloc_parent(const void *ptr); void *talloc_init(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2); int talloc_free(void *ptr); +void talloc_free_children(void *ptr); void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *name); void *_talloc_steal(const void *new_ctx, const void *ptr); size_t talloc_total_size(const void *ptr); -- cgit From da9723c22428254fddaf2a83cf96777c82416950 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 26 Jul 2006 17:34:50 +0000 Subject: r17264: - remove unused includes from talloc - check explicit check for varargs.h as fallback from stdarg.h and fail the build if both are not present metze (This used to be commit b091d182fe8f36dfb67b7ede933a963b74034d91) --- source4/lib/talloc/config.m4 | 14 +++++++++++++- source4/lib/talloc/talloc.c | 18 ++++-------------- 2 files changed, 17 insertions(+), 15 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.m4 b/source4/lib/talloc/config.m4 index d4c68ca52b..0286bde6c2 100644 --- a/source4/lib/talloc/config.m4 +++ b/source4/lib/talloc/config.m4 @@ -1,3 +1,6 @@ +AC_CHECK_HEADERS(stdarg.h vararg.h) + +dnl VA_COPY AC_CACHE_CHECK([for va_copy],samba_cv_HAVE_VA_COPY,[ AC_TRY_LINK([#include va_list ap1,ap2;], [va_copy(ap1,ap2);], @@ -6,8 +9,17 @@ if test x"$samba_cv_HAVE_VA_COPY" = x"yes"; then AC_DEFINE(HAVE_VA_COPY,1,[Whether va_copy() is available]) fi +if test x"$samba_cv_HAVE_VA_COPY" != x"yes"; then +AC_CACHE_CHECK([for __va_copy],samba_cv_HAVE___VA_COPY,[ +AC_TRY_LINK([#include +va_list ap1,ap2;], [__va_copy(ap1,ap2);], +samba_cv_HAVE___VA_COPY=yes,samba_cv_HAVE___VA_COPY=no)]) +if test x"$samba_cv_HAVE___VA_COPY" = x"yes"; then + AC_DEFINE(HAVE___VA_COPY,1,[Whether __va_copy() is available]) +fi +fi + AC_CHECK_TYPE(intptr_t, unsigned long long) -AC_CHECK_HEADERS(stdint.h stdarg.h unistd.h sys/types.h) AC_CHECK_SIZEOF(size_t,cross) AC_CHECK_SIZEOF(void *,cross) diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index ca76b05332..5a14109190 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -37,22 +37,12 @@ #include #include -#ifdef HAVE_SYS_TYPES_H -#include -#endif - -#ifdef HAVE_UNISTD_H -#include -#endif - -#ifdef HAVE_STDARG_H +#if defined(HAVE_STDARG_H) #include -#else +#elif defined (HAVE_VARARGS_H) #include -#endif - -#ifdef HAVE_STDINT_H -#include +#else +#error "no var arg header" #endif #include "talloc.h" -- cgit From 14d322332185b311d7843508cc73684700cbae33 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sat, 5 Aug 2006 05:43:47 +0000 Subject: r17413: add a new case for the this: top->level1->level2->level3 level3 has a deny destructor talloc_free(level1) result: top->level3 metze (This used to be commit 3be930b81d2caf5e13105efa02280c4fc45181cb) --- source4/lib/talloc/testsuite.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 2b04f66fc4..947540d940 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -95,6 +95,19 @@ static double timeval_elapsed(struct timeval *tv) } \ } while (0) +#define CHECK_PARENT(ptr, parent) do { \ + if (talloc_parent(ptr) != (parent)) { \ + printf(__location__ " failed: '%s' has wrong parent: got %p expected %p\n", \ + #ptr, \ + talloc_parent(ptr), \ + (parent)); \ + talloc_report_full(ptr, stdout); \ + talloc_report_full(parent, stdout); \ + talloc_report_full(NULL, stdout); \ + return False; \ + } \ +} while (0) + /* test references @@ -771,7 +784,12 @@ static BOOL test_unref_reparent(void) c1 = talloc_named_const(p1, 1, "child"); talloc_reference(p2, c1); + CHECK_PARENT(c1, p1); + talloc_free(p1); + + CHECK_PARENT(c1, p2); + talloc_unlink(p2, c1); CHECK_SIZE(root, 1); @@ -888,6 +906,28 @@ static BOOL test_loop(void) return True; } +static BOOL test_free_parent_deny_child(void) +{ + char *top = talloc_new(NULL); + char *level1; + char *level2; + char *level3; + + printf("TESTING TALLOC FREE PARENT DENY CHILD\n"); + level1 = talloc_strdup(top, "level1"); + level2 = talloc_strdup(level1, "level2"); + level3 = talloc_strdup(level2, "level3"); + + talloc_set_destructor(level3, fail_destructor); + talloc_free(level1); + talloc_set_destructor(level3, NULL); + + CHECK_PARENT(level3, top); + + talloc_free(top); + + return True; +} BOOL torture_local_talloc(struct torture_context *torture) { @@ -909,6 +949,7 @@ BOOL torture_local_talloc(struct torture_context *torture) ret &= test_type(); ret &= test_lifeless(); ret &= test_loop(); + ret &= test_free_parent_deny_child(); if (ret) { ret &= test_speed(); } -- cgit From c0e60d053598a1d8cd1e3367a38a001ef7c1992a Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 17 Aug 2006 01:49:42 +0000 Subject: r17578: in standalone talloc build ensure we get intptr_t if available (which makes the discard_const stuff nicer) (This used to be commit 662f01f8ba861a5ef1d5ee724ed2b3ab9812597a) --- source4/lib/talloc/talloc.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 5a14109190..fc0462929c 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -36,6 +36,9 @@ #include #include #include +#ifdef HAVE_STDINT_H +#include +#endif #if defined(HAVE_STDARG_H) #include -- cgit From f23be49188cec903446bea97261c3ea3774dea28 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 21 Aug 2006 01:27:22 +0000 Subject: r17645: gcc 4.1.x has started producing "value computed is not used" warnings in very annoying ways for talloc_steal. This rather strange looking cpp approach avoids these warnings. It's really a problem in gcc, but better to do this than put up with the huge flood of warnings. (This used to be commit 8236a0ac5e80c30e52fccc0ef41a6c808ea43420) --- source4/lib/talloc/talloc.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index c6d20c820f..b873bdb8aa 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -62,10 +62,14 @@ typedef void TALLOC_CTX; _talloc_set_destructor((ptr), (void *)_talloc_destructor_fn); \ } while(0) #define _TALLOC_CHECK_TYPE(type,val) +/* this extremely strange macro is to avoid some braindamaged warning + stupidity in gcc 4.1.x */ +#define talloc_steal(ctx, ptr) ({ __typeof__(ptr) __talloc_steal_ret = (__typeof__(ptr))_talloc_steal((ctx),(ptr)); __talloc_steal_ret; }) #else #define talloc_set_destructor(ptr, function) \ _talloc_set_destructor((ptr), (int (*)(void *))(function)) #define _TALLOC_TYPEOF(ptr) void * +#define talloc_steal(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_steal((ctx),(ptr)) #endif /* useful macros for creating type checked pointers */ @@ -90,7 +94,6 @@ typedef void TALLOC_CTX; #define talloc_get_type(ptr, type) (type *)talloc_check_name(ptr, #type) #define talloc_find_parent_bytype(ptr, type) (type *)talloc_find_parent_byname(ptr, #type) -#define talloc_steal(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_steal((ctx),(ptr)) #if TALLOC_DEPRECATED #define talloc_zero_p(ctx, type) talloc_zero(ctx, type) -- cgit From d132f724bd0e8c8e84e1b61d4d5211131028bc42 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 22 Aug 2006 01:50:44 +0000 Subject: r17681: fixed standalone talloc build to support building in a separate directory (This used to be commit c137a7049ed6a74c035ef7fad86ac1e77e31028c) --- source4/lib/talloc/Makefile.in | 9 ++++++--- source4/lib/talloc/configure.in | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index c1477cea69..e5c4e5274a 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -4,10 +4,13 @@ exec_prefix = @exec_prefix@ includedir = @includedir@ libdir = @libdir@ mandir = @mandir@ +VPATH = @srcdir@ +srcdir = @srcdir@ +builddir = @builddir@ XSLTPROC = @XSLTPROC@ INSTALLCMD = @INSTALL@ CC = @CC@ -CFLAGS = @CFLAGS@ -DHAVE_CONFIG_H= +CFLAGS = @CFLAGS@ -DHAVE_CONFIG_H= -I$(srcdir) EXTRA_TARGETS = @DOC_TARGET@ .SUFFIXES: .c .o .3 .3.xml .xml .html @@ -25,8 +28,8 @@ install: all ${INSTALLCMD} -d ${libdir} ${INSTALLCMD} -m 755 libtalloc.a $(libdir) ${INSTALLCMD} -d ${includedir} - ${INSTALLCMD} -m 644 talloc.h $(includedir) - ${INSTALLCMD} -m 644 talloc.pc $(libdir)/pkgconfig + ${INSTALLCMD} -m 644 $(srcdir)/talloc.h $(includedir) + ${INSTALLCMD} -m 644 $(srcdir)/talloc.pc $(libdir)/pkgconfig ${INSTALLCMD} -d ${mandir}/man3 test -z "$(XSLTPROC)" || ${INSTALLCMD} -m 644 talloc.3 $(mandir)/man3 diff --git a/source4/lib/talloc/configure.in b/source4/lib/talloc/configure.in index fc52679737..253992cb1a 100644 --- a/source4/lib/talloc/configure.in +++ b/source4/lib/talloc/configure.in @@ -1,5 +1,6 @@ AC_PREREQ(2.50) AC_INIT(talloc.h) +AC_CONFIG_SRCDIR([talloc.c]) AC_SUBST(datarootdir) AC_PROG_CC if test "x$GCC" = "xyes"; then -- cgit From a11045d9134ff0af6a2e8bef1cdd9425687d5610 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 22 Aug 2006 03:24:23 +0000 Subject: r17683: to pick up config.h we need -I. as well for talloc (This used to be commit 07401300ffccd832371d1f6288052aa293a2eeb4) --- source4/lib/talloc/Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index e5c4e5274a..dc225a1771 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -10,7 +10,7 @@ builddir = @builddir@ XSLTPROC = @XSLTPROC@ INSTALLCMD = @INSTALL@ CC = @CC@ -CFLAGS = @CFLAGS@ -DHAVE_CONFIG_H= -I$(srcdir) +CFLAGS = @CFLAGS@ -DHAVE_CONFIG_H= -I$(srcdir) -I. EXTRA_TARGETS = @DOC_TARGET@ .SUFFIXES: .c .o .3 .3.xml .xml .html -- cgit From f35b2151479a379af8fb7308d97baded19d152cf Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 22 Aug 2006 03:28:02 +0000 Subject: r17685: talloc.pc is in the build directory (This used to be commit 14a8faa1640db4c083e7b9b06c21d466d0ef0ce3) --- source4/lib/talloc/Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index dc225a1771..71953aa371 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -29,7 +29,7 @@ install: all ${INSTALLCMD} -m 755 libtalloc.a $(libdir) ${INSTALLCMD} -d ${includedir} ${INSTALLCMD} -m 644 $(srcdir)/talloc.h $(includedir) - ${INSTALLCMD} -m 644 $(srcdir)/talloc.pc $(libdir)/pkgconfig + ${INSTALLCMD} -m 644 talloc.pc $(libdir)/pkgconfig ${INSTALLCMD} -d ${mandir}/man3 test -z "$(XSLTPROC)" || ${INSTALLCMD} -m 644 talloc.3 $(mandir)/man3 -- cgit From 31356c02838a678013f0ad9416f0b101b755bd90 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 22 Aug 2006 18:49:11 +0000 Subject: r17712: fix compiler warning metze (This used to be commit 669d1e5f923a5414b8ad2537da1723d50a240387) --- source4/lib/talloc/testsuite.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 947540d940..7cd6429085 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -906,6 +906,11 @@ static BOOL test_loop(void) return True; } +static int fail_destructor_str(char *ptr) +{ + return -1; +} + static BOOL test_free_parent_deny_child(void) { char *top = talloc_new(NULL); @@ -918,7 +923,7 @@ static BOOL test_free_parent_deny_child(void) level2 = talloc_strdup(level1, "level2"); level3 = talloc_strdup(level2, "level3"); - talloc_set_destructor(level3, fail_destructor); + talloc_set_destructor(level3, fail_destructor_str); talloc_free(level1); talloc_set_destructor(level3, NULL); -- cgit From 200619b3687e1eb07e87f7d32104effab1920d77 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 28 Aug 2006 14:06:23 +0000 Subject: r17883: check if talloc_asprintf() works correct metze (This used to be commit bb79542edbb290c7dbea7c921b0e911dd1b3366b) --- source4/lib/talloc/testsuite.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 7cd6429085..f3b20fe657 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -491,6 +491,10 @@ static BOOL test_misc(void) p1 = talloc_init("%d bytes", 200); p2 = talloc_asprintf(p1, "my test '%s'", "string"); + if (strcmp(p2, "my test 'string'") != 0) { + printf("failed: talloc_asprintf(\"my test '%%s'\", \"string\") gave: \"%s\"\n", p2); + return False; + } CHECK_BLOCKS(p1, 3); CHECK_SIZE(p2, 17); CHECK_BLOCKS(root, 1); -- cgit From 82d4c5095dab0b5c1011fd9f5b865a7c07715a7a Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 28 Aug 2006 15:36:12 +0000 Subject: r17885: use _TALLOC_TYPEPF() consitently metze (This used to be commit 155cd6b88283b85c53c7ec65efcf431da7b649ac) --- source4/lib/talloc/talloc.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index b873bdb8aa..fec2e8d8d7 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -58,13 +58,12 @@ typedef void TALLOC_CTX; #define _TALLOC_TYPEOF(ptr) __typeof__(ptr) #define talloc_set_destructor(ptr, function) \ do { \ - int (*_talloc_destructor_fn)(typeof(ptr)) = (function); \ + int (*_talloc_destructor_fn)(_TALLOC_TYPEOF(ptr)) = (function); \ _talloc_set_destructor((ptr), (void *)_talloc_destructor_fn); \ } while(0) -#define _TALLOC_CHECK_TYPE(type,val) /* this extremely strange macro is to avoid some braindamaged warning stupidity in gcc 4.1.x */ -#define talloc_steal(ctx, ptr) ({ __typeof__(ptr) __talloc_steal_ret = (__typeof__(ptr))_talloc_steal((ctx),(ptr)); __talloc_steal_ret; }) +#define talloc_steal(ctx, ptr) ({ _TALLOC_TYPEOF(ptr) __talloc_steal_ret = (_TALLOC_TYPEOF(ptr))_talloc_steal((ctx),(ptr)); __talloc_steal_ret; }) #else #define talloc_set_destructor(ptr, function) \ _talloc_set_destructor((ptr), (int (*)(void *))(function)) -- cgit From 5ed074715a7d63b803d5eaff3144a48304201df3 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 28 Aug 2006 16:55:51 +0000 Subject: r17886: add talloc_ptrtype() and talloc_array_ptrtype(), see the manpage what they do:-) metze (This used to be commit bfca83c91e47e9017474809cd7bc8b2e6e20416a) --- source4/lib/talloc/talloc.3.xml | 18 +++++++++ source4/lib/talloc/talloc.h | 2 + source4/lib/talloc/talloc_guide.txt | 16 ++++++++ source4/lib/talloc/testsuite.c | 76 +++++++++++++++++++++++++++++++++++++ 4 files changed, 112 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.3.xml b/source4/lib/talloc/talloc.3.xml index ef032f8426..952083a805 100644 --- a/source4/lib/talloc/talloc.3.xml +++ b/source4/lib/talloc/talloc.3.xml @@ -97,6 +97,15 @@ type checking. + (typeof(ptr)) talloc_ptrtype(const void *ctx, ptr); + + The talloc_ptrtype() macro should be used when you have a pointer and + want to allocate memory to point at with this pointer. When compiling + with gcc >= 3 it is typesafe. Note this is a wrapper of talloc_size() + and talloc_get_name() will return the current location in the source file. + and not the type. + + int talloc_free(void *ptr); The talloc_free() function frees a piece of talloc memory, and @@ -551,6 +560,15 @@ if (ptr) memcpy(ptr, p, strlen(p)+1); size instead of a type. + (typeof(ptr)) talloc_array_ptrtype(const void *ctx, ptr, uint_t count); + + The talloc_ptrtype() macro should be used when you have a pointer to an array + and want to allocate memory of an array to point at with this pointer. When compiling + with gcc >= 3 it is typesafe. Note this is a wrapper of talloc_array_size() + and talloc_get_name() will return the current location in the source file. + and not the type. + + void *talloc_realloc_fn(const void *ctx, void *ptr, size_t size) This is a non-macro version of talloc_realloc(), which is useful diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index fec2e8d8d7..40351693fa 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -74,6 +74,7 @@ typedef void TALLOC_CTX; /* useful macros for creating type checked pointers */ #define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) #define talloc_size(ctx, size) talloc_named_const(ctx, size, __location__) +#define talloc_ptrtype(ctx, ptr) (_TALLOC_TYPEOF(ptr))talloc_size(ctx, sizeof(*(ptr))) #define talloc_new(ctx) talloc_named_const(ctx, 0, "talloc_new: " __location__) @@ -83,6 +84,7 @@ typedef void TALLOC_CTX; #define talloc_zero_array(ctx, type, count) (type *)_talloc_zero_array(ctx, sizeof(type), count, #type) #define talloc_array(ctx, type, count) (type *)_talloc_array(ctx, sizeof(type), count, #type) #define talloc_array_size(ctx, size, count) _talloc_array(ctx, size, count, __location__) +#define talloc_array_ptrtype(ctx, ptr, count) (_TALLOC_TYPEOF(ptr))talloc_array_size(ctx, sizeof(*(ptr)), count) #define talloc_realloc(ctx, p, type, count) (type *)_talloc_realloc_array(ctx, p, sizeof(type), count, #type) #define talloc_realloc_size(ctx, ptr, size) _talloc_realloc(ctx, ptr, size, __location__) diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index 5aa8dfa24f..65fb2017a4 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -82,6 +82,14 @@ The function talloc_size() should be used when you don't have a convenient type to pass to talloc(). Unlike talloc(), it is not type safe (as it returns a void *), so you are on your own for type checking. +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +(typeof(ptr)) talloc_ptrtype(const void *ctx, ptr); + +The talloc_ptrtype() macro should be used when you have a pointer and +want to allocate memory to point at with this pointer. When compiling +with gcc >= 3 it is typesafe. Note this is a wrapper of talloc_size() +and talloc_get_name() will return the current location in the source file. +and not the type. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- int talloc_free(void *ptr); @@ -515,6 +523,14 @@ The talloc_array_size() function is useful when the type is not known. It operates in the same way as talloc_array(), but takes a size instead of a type. +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +(typeof(ptr)) talloc_array_ptrtype(const void *ctx, ptr, uint_t count); + +The talloc_ptrtype() macro should be used when you have a pointer to an array +and want to allocate memory of an array to point at with this pointer. When compiling +with gcc >= 3 it is typesafe. Note this is a wrapper of talloc_array_size() +and talloc_get_name() will return the current location in the source file. +and not the type. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- void *talloc_realloc_fn(const void *ctx, void *ptr, size_t size); diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index f3b20fe657..45d73bd1c0 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -938,6 +938,81 @@ static BOOL test_free_parent_deny_child(void) return True; } +static BOOL test_talloc_ptrtype(void) +{ + BOOL ret = True; + char *top = talloc_new(NULL); + struct struct1 { + int foo; + int bar; + } *s1, *s2, **s3, ***s4; + const char *location1; + const char *location2; + const char *location3; + const char *location4; + + printf("TESTING TALLOC PTRTYPE\n"); + s1 = talloc_ptrtype(top, s1);location1 = __location__; + + if (talloc_get_size(s1) != sizeof(struct struct1)) { + printf("%s: talloc_ptrtype() allocated the wrong size %u (should be %u)\n", + __location__, talloc_get_size(s1), sizeof(struct struct1)); + ret = False; + } + + if (strcmp(location1, talloc_get_name(s1)) != 0) { + printf("%s: talloc_ptrtype() sets the wrong name '%s' (should be '%s')\n", + __location__, talloc_get_name(s1), location1); + ret = False; + } + + s2 = talloc_array_ptrtype(top, s2, 10);location2 = __location__; + + if (talloc_get_size(s2) != (sizeof(struct struct1) * 10)) { + printf("%s: talloc_array_ptrtype() allocated the wrong size %u (should be %u)\n", + __location__, talloc_get_size(s2), (sizeof(struct struct1)*10)); + ret = False; + } + + if (strcmp(location2, talloc_get_name(s2)) != 0) { + printf("%s: talloc_array_ptrtype() sets the wrong name '%s' (should be '%s')\n", + __location__, talloc_get_name(s2), location2); + ret = False; + } + + s3 = talloc_array_ptrtype(top, s3, 10);location3 = __location__; + + if (talloc_get_size(s3) != (sizeof(struct struct1 *) * 10)) { + printf("%s: talloc_array_ptrtype() allocated the wrong size %u (should be %u)\n", + __location__, talloc_get_size(s3), (sizeof(struct struct1 *)*10)); + ret = False; + } + + if (strcmp(location3, talloc_get_name(s3)) != 0) { + printf("%s: talloc_array_ptrtype() sets the wrong name '%s' (should be '%s')\n", + __location__, talloc_get_name(s3), location3); + ret = False; + } + + s4 = talloc_array_ptrtype(top, s4, 10);location4 = __location__; + + if (talloc_get_size(s4) != (sizeof(struct struct1 **) * 10)) { + printf("%s: talloc_array_ptrtype() allocated the wrong size %u (should be %u)\n", + __location__, talloc_get_size(s4), (sizeof(struct struct1 **)*10)); + ret = False; + } + + if (strcmp(location4, talloc_get_name(s4)) != 0) { + printf("%s: talloc_array_ptrtype() sets the wrong name '%s' (should be '%s')\n", + __location__, talloc_get_name(s4), location4); + ret = False; + } + + talloc_free(top); + + return ret; +} + BOOL torture_local_talloc(struct torture_context *torture) { BOOL ret = True; @@ -959,6 +1034,7 @@ BOOL torture_local_talloc(struct torture_context *torture) ret &= test_lifeless(); ret &= test_loop(); ret &= test_free_parent_deny_child(); + ret &= test_talloc_ptrtype(); if (ret) { ret &= test_speed(); } -- cgit From 45b8c41038c587b5993c6219bf6698323cf93494 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 28 Aug 2006 17:38:49 +0000 Subject: r17891: remove c++ warnings from talloc metze (This used to be commit fb73ce8d4364a1da3c320034d90c0556529c61c4) --- source4/lib/talloc/talloc.c | 23 ++++++++++++----------- source4/lib/talloc/talloc.h | 4 ++-- 2 files changed, 14 insertions(+), 13 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index fc0462929c..293775b1ca 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -107,7 +107,7 @@ struct talloc_chunk { /* panic if we get a bad magic value */ static struct talloc_chunk *talloc_chunk_from_ptr(const void *ptr) { - const char *pp = ptr; + const char *pp = (const char *)ptr; struct talloc_chunk *tc = discard_const_p(struct talloc_chunk, pp - TC_HDR_SIZE); if ((tc->flags & ~0xF) != TALLOC_MAGIC) { TALLOC_ABORT("Bad talloc magic value - unknown value"); @@ -177,7 +177,7 @@ void *_talloc(const void *context, size_t size) return NULL; } - tc = malloc(TC_HDR_SIZE+size); + tc = (struct talloc_chunk *)malloc(TC_HDR_SIZE+size); if (tc == NULL) return NULL; tc->size = size; @@ -251,8 +251,9 @@ void *talloc_reference(const void *context, const void *ptr) if (ptr == NULL) return NULL; tc = talloc_chunk_from_ptr(ptr); - handle = talloc_named_const(context, sizeof(*handle), TALLOC_MAGIC_REFERENCE); - + handle = (struct talloc_reference_handle *)talloc_named_const(context, + sizeof(struct talloc_reference_handle), + TALLOC_MAGIC_REFERENCE); if (handle == NULL) return NULL; /* note that we hang the destructor off the handle, not the @@ -646,13 +647,13 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n return NULL; } - tc = new_ptr; + tc = (struct talloc_chunk *)new_ptr; tc->flags &= ~TALLOC_FLAG_FREE; if (tc->parent) { - tc->parent->child = new_ptr; + tc->parent->child = tc; } if (tc->child) { - tc->child->parent = new_ptr; + tc->child->parent = tc; } if (tc->prev) { @@ -962,7 +963,7 @@ char *talloc_strdup(const void *t, const char *p) if (!p) { return NULL; } - ret = talloc_memdup(t, p, strlen(p) + 1); + ret = (char *)talloc_memdup(t, p, strlen(p) + 1); if (ret) { talloc_set_name_const(ret, ret); } @@ -1003,7 +1004,7 @@ char *talloc_strndup(const void *t, const char *p, size_t n) for (len=0; len Date: Mon, 28 Aug 2006 17:40:31 +0000 Subject: r17892: fix the last talloc c++ warning metze (This used to be commit 6955ffe4544eddd9e34461f57858480b1acf49c9) --- source4/lib/talloc/talloc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 293775b1ca..7ba3e5f3ab 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -813,7 +813,8 @@ void talloc_report_depth(const void *ptr, FILE *f, int depth) for (c=tc->child;c;c=c->next) { if (c->name == TALLOC_MAGIC_REFERENCE) { - struct talloc_reference_handle *handle = TC_PTR_FROM_CHUNK(c); + struct talloc_reference_handle *handle = + (struct talloc_reference_handle *)TC_PTR_FROM_CHUNK(c); const char *name2 = talloc_get_name(handle->ptr); fprintf(f, "%*sreference to: %s\n", depth*4, "", name2); } else { -- cgit From 3400d91197aef446d6d113363f12edd7f14525a4 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 28 Aug 2006 17:50:26 +0000 Subject: r17893: add a function to disable the null_context metze (This used to be commit 7cab4285b1b61ad5cb425e42d89bcf7d645b0710) --- source4/lib/talloc/talloc.c | 12 ++++++++++-- source4/lib/talloc/talloc.h | 1 + source4/lib/talloc/talloc_guide.txt | 4 ++++ 3 files changed, 15 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 7ba3e5f3ab..cc04a2425a 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -79,10 +79,9 @@ talloc_enable_leak_report_full() is called, otherwise it remains NULL */ -static const void *null_context; +static void *null_context; static void *cleanup_context; - struct talloc_reference_handle { struct talloc_reference_handle *next, *prev; void *ptr; @@ -908,6 +907,15 @@ void talloc_enable_null_tracking(void) } } +/* + disable tracking of the NULL context +*/ +void talloc_disable_null_tracking(void) +{ + talloc_free(null_context); + null_context = NULL; +} + /* enable leak reporting on exit */ diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index b904029bda..f080f0498d 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -129,6 +129,7 @@ size_t talloc_total_blocks(const void *ptr); void talloc_report_full(const void *ptr, FILE *f); void talloc_report(const void *ptr, FILE *f); void talloc_enable_null_tracking(void); +void talloc_disable_null_tracking(void); void talloc_enable_leak_report(void); void talloc_enable_leak_report_full(void); void *_talloc_zero(const void *ctx, size_t size, const char *name); diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index 65fb2017a4..7f1a3ea6cd 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -432,6 +432,10 @@ This enables tracking of the NULL memory context without enabling leak reporting on exit. Useful for when you want to do your own leak reporting call via talloc_report_null_full(); +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void talloc_disable_null_tracking(void); + +This disables tracking of the NULL memory context. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- (type *)talloc_zero(const void *ctx, type); -- cgit From 59057c8d56629a941ab412fa195dea7c8c486b21 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 28 Aug 2006 18:21:21 +0000 Subject: r17895: - talloc_increase_ref_count() can fail - make talloc_reference() typesafe when gcc >= 3 is used metze (This used to be commit 933d1b47ad614d02cc02b602e704948b342febdb) --- source4/lib/talloc/talloc.3.xml | 5 ++++- source4/lib/talloc/talloc.c | 9 ++++++--- source4/lib/talloc/talloc.h | 6 ++++-- source4/lib/talloc/talloc_guide.txt | 3 ++- 4 files changed, 16 insertions(+), 7 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.3.xml b/source4/lib/talloc/talloc.3.xml index 952083a805..247bb28ed9 100644 --- a/source4/lib/talloc/talloc.3.xml +++ b/source4/lib/talloc/talloc.3.xml @@ -235,7 +235,7 @@ about to go away. - void talloc_increase_ref_count(const void *<emphasis role="italic">ptr</emphasis>); + int talloc_increase_ref_count(const void *<emphasis role="italic">ptr</emphasis>); The talloc_increase_ref_count(ptr) function is exactly equivalent to: @@ -245,6 +245,9 @@ You can use either syntax, depending on which you think is clearer in your code. + + It returns 0 on success and -1 on failure. + void talloc_set_name(const void *ptr, const char *fmt, ...); diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index cc04a2425a..ba457afd6b 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -219,9 +219,12 @@ void _talloc_set_destructor(const void *ptr, int (*destructor)(void *)) /* increase the reference count on a piece of memory. */ -void talloc_increase_ref_count(const void *ptr) +int talloc_increase_ref_count(const void *ptr) { - talloc_reference(null_context, ptr); + if (!talloc_reference(null_context, ptr)) { + return -1; + } + return 0; } /* @@ -243,7 +246,7 @@ static int talloc_reference_destructor(struct talloc_reference_handle *handle) same underlying data, and you want to be able to free the two instances separately, and in either order */ -void *talloc_reference(const void *context, const void *ptr) +void *_talloc_reference(const void *context, const void *ptr) { struct talloc_chunk *tc; struct talloc_reference_handle *handle; diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index f080f0498d..9d6edd88ba 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -64,11 +64,13 @@ typedef void TALLOC_CTX; /* this extremely strange macro is to avoid some braindamaged warning stupidity in gcc 4.1.x */ #define talloc_steal(ctx, ptr) ({ _TALLOC_TYPEOF(ptr) __talloc_steal_ret = (_TALLOC_TYPEOF(ptr))_talloc_steal((ctx),(ptr)); __talloc_steal_ret; }) +#define talloc_reference(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_reference((ctx),(ptr)) #else #define talloc_set_destructor(ptr, function) \ _talloc_set_destructor((ptr), (int (*)(void *))(function)) #define _TALLOC_TYPEOF(ptr) void * #define talloc_steal(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_steal((ctx),(ptr)) +#define talloc_reference(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_reference((ctx),(ptr)) #endif /* useful macros for creating type checked pointers */ @@ -107,8 +109,8 @@ typedef void TALLOC_CTX; /* The following definitions come from talloc.c */ void *_talloc(const void *context, size_t size); void _talloc_set_destructor(const void *ptr, int (*destructor)(void *)); -void talloc_increase_ref_count(const void *ptr); -void *talloc_reference(const void *context, const void *ptr); +int talloc_increase_ref_count(const void *ptr); +void *_talloc_reference(const void *context, const void *ptr); int talloc_unlink(const void *context, void *ptr); const char *talloc_set_name(const void *ptr, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); void talloc_set_name_const(const void *ptr, const char *name); diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index 7f1a3ea6cd..2c32fb1a87 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -193,7 +193,7 @@ destructor is only called when the memory is just about to go away. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -void talloc_increase_ref_count(const void *ptr); +int talloc_increase_ref_count(const void *ptr); The talloc_increase_ref_count(ptr) function is exactly equivalent to: @@ -202,6 +202,7 @@ The talloc_increase_ref_count(ptr) function is exactly equivalent to: You can use either syntax, depending on which you think is clearer in your code. +It returns 0 on success and -1 on failure. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- void talloc_set_name(const void *ptr, const char *fmt, ...); -- cgit From 3caba856238d985c31c5e3509336060b3d8fcc86 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 29 Aug 2006 09:46:59 +0000 Subject: r17905: fix c++ warnings metze (This used to be commit 972a84f220f0dabc4e1cc3ffd40a4bf4dedc74d9) --- source4/lib/talloc/testsuite.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 45d73bd1c0..5f7b68776b 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -435,7 +435,7 @@ static BOOL test_misc(void) talloc_report(root, stdout); - p2 = talloc_zero_size(p1, 20); + p2 = (char *)talloc_zero_size(p1, 20); if (p2[19] != 0) { printf("Failed to give zero memory\n"); return False; @@ -501,8 +501,8 @@ static BOOL test_misc(void) talloc_unlink(NULL, p1); p1 = talloc_named_const(root, 10, "p1"); - p2 = talloc_named_const(root, 20, "p2"); - talloc_reference(p1, p2); + p2 = (char *)talloc_named_const(root, 20, "p2"); + (void)talloc_reference(p1, p2); talloc_report_full(root, stdout); talloc_unlink(root, p2); talloc_report_full(root, stdout); @@ -513,8 +513,8 @@ static BOOL test_misc(void) talloc_unlink(root, p1); p1 = talloc_named_const(root, 10, "p1"); - p2 = talloc_named_const(root, 20, "p2"); - talloc_reference(NULL, p2); + p2 = (char *)talloc_named_const(root, 20, "p2"); + (void)talloc_reference(NULL, p2); talloc_report_full(root, stdout); talloc_unlink(root, p2); talloc_report_full(root, stdout); @@ -851,16 +851,16 @@ static BOOL test_speed(void) static BOOL test_lifeless(void) { - char *top = talloc_new(NULL); + void *top = talloc_new(NULL); char *parent, *child; - char *child_owner = talloc_new(NULL); + void *child_owner = talloc_new(NULL); printf("TESTING TALLOC_UNLINK LOOP\n"); parent = talloc_strdup(top, "parent"); child = talloc_strdup(parent, "child"); - talloc_reference(child, parent); - talloc_reference(child_owner, child); + (void)talloc_reference(child, parent); + (void)talloc_reference(child_owner, child); talloc_report_full(top, stdout); talloc_unlink(top, parent); talloc_free(child); @@ -883,7 +883,7 @@ static int test_loop_destructor(char *ptr) static BOOL test_loop(void) { - char *top = talloc_new(NULL); + void *top = talloc_new(NULL); char *parent; struct req1 { char *req2, *req3; @@ -895,7 +895,7 @@ static BOOL test_loop(void) req1->req2 = talloc_strdup(req1, "req2"); talloc_set_destructor(req1->req2, test_loop_destructor); req1->req3 = talloc_strdup(req1, "req3"); - talloc_reference(req1->req3, req1); + (void)talloc_reference(req1->req3, req1); talloc_report_full(top, stdout); talloc_free(parent); talloc_report_full(top, stdout); @@ -917,7 +917,7 @@ static int fail_destructor_str(char *ptr) static BOOL test_free_parent_deny_child(void) { - char *top = talloc_new(NULL); + void *top = talloc_new(NULL); char *level1; char *level2; char *level3; @@ -941,7 +941,7 @@ static BOOL test_free_parent_deny_child(void) static BOOL test_talloc_ptrtype(void) { BOOL ret = True; - char *top = talloc_new(NULL); + void *top = talloc_new(NULL); struct struct1 { int foo; int bar; -- cgit From 832ac85ba3e58d42f4342d79062bedf01e64c687 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 29 Aug 2006 09:51:49 +0000 Subject: r17907: - add a generic talloc_report_depth_cb() function which takes a callback to do the actual report. - make the talloc_report_depth_file() a wrapper of it - and talloc_report() and talloc_report_full() are wrapper of talloc_report_depth_file() metze (This used to be commit b199557b358e6216d89d233513079fcd56b307aa) --- source4/lib/talloc/talloc.3.xml | 50 ++++++++++++++ source4/lib/talloc/talloc.c | 129 ++++++++++++++++++++++-------------- source4/lib/talloc/talloc.h | 13 +++- source4/lib/talloc/talloc_guide.txt | 33 +++++++++ 4 files changed, 173 insertions(+), 52 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.3.xml b/source4/lib/talloc/talloc.3.xml index 247bb28ed9..a448e8d978 100644 --- a/source4/lib/talloc/talloc.3.xml +++ b/source4/lib/talloc/talloc.3.xml @@ -249,6 +249,11 @@ It returns 0 on success and -1 on failure. + size_t talloc_reference_count(const void *<emphasis role="italic">ptr</emphasis>); + + Return the number of references to the pointer. + + void talloc_set_name(const void *ptr, const char *fmt, ...); Each talloc pointer has a "name". The name is used principally @@ -259,6 +264,12 @@ The main use for names on pointer is for "talloc reports". See talloc_report_depth_cb(), + talloc_report_depth_file(), + talloc_report() + talloc_report() and talloc_report_full() @@ -428,6 +439,45 @@ talloc_realloc(ctx, ptr, type, 0) ==> talloc_free(ptr); has been called. + + + void talloc_report_depth_cb + const void *ptr + int depth + int max_depth + void (*callback)(const void *ptr, int depth, int max_depth, int is_ref, void *priv) + void *priv + + + This provides a more flexible reports than talloc_report(). It + will recursively call the callback for the entire tree of memory + referenced by the pointer. References in the tree are passed with + is_ref = 1 and the pointer that is referenced. + + + You can pass NULL for the pointer, in which case a report is + printed for the top level memory context, but only if + talloc_enable_leak_report() or talloc_enable_leak_report_full() + has been called. + + + The recursion is stopped when depth >= max_depth. + max_depth = -1 means only stop at leaf nodes. + + + + + void talloc_report_depth_file + const void *ptr + int depth + int max_depth + FILE *f + + + This provides a more flexible reports than talloc_report(). It + will let you specify the depth and max_depth. + + void talloc_enable_leak_report(void); This enables calling of talloc_report(NULL, stderr) when the diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index ba457afd6b..2fb8fb2530 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -6,6 +6,7 @@ NOTE: Please read talloc_guide.txt for full documentation Copyright (C) Andrew Tridgell 2004 + Copyright (C) Stefan Metzmacher 2006 ** NOTE! The following LGPL license applies to the talloc ** library. This does NOT imply that all of Samba is released @@ -30,6 +31,23 @@ inspired by http://swapped.cc/halloc/ */ +#ifdef _SAMBA_BUILD_ +#include "version.h" +#if (SAMBA_VERSION_MAJOR<4) +#include "includes.h" +/* This is to circumvent SAMBA3's paranoid malloc checker. Here in this file + * we trust ourselves... */ +#ifdef malloc +#undef malloc +#endif +#ifdef realloc +#undef realloc +#endif +#define _TALLOC_SAMBA3 +#endif /* (SAMBA_VERSION_MAJOR<4) */ +#endif /* _SAMBA_BUILD_ */ + +#ifndef _TALLOC_SAMBA3 #include "config.h" #include @@ -49,6 +67,7 @@ #endif #include "talloc.h" +#endif /* not _TALLOC_SAMBA3 */ /* use this to force every realloc to change the pointer, to stress test code that might not cope */ @@ -788,11 +807,11 @@ size_t talloc_total_blocks(const void *ptr) /* return the number of external references to a pointer */ -static int talloc_reference_count(const void *ptr) +size_t talloc_reference_count(const void *ptr) { struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); struct talloc_reference_handle *h; - int ret = 0; + size_t ret = 0; for (h=tc->refs;h;h=h->next) { ret++; @@ -803,81 +822,93 @@ static int talloc_reference_count(const void *ptr) /* report on memory usage by all children of a pointer, giving a full tree view */ -void talloc_report_depth(const void *ptr, FILE *f, int depth) +void talloc_report_depth_cb(const void *ptr, int depth, int max_depth, + void (*callback)(const void *ptr, + int depth, int max_depth, + int is_ref, + void *private_data), + void *private_data) { - struct talloc_chunk *c, *tc = talloc_chunk_from_ptr(ptr); + struct talloc_chunk *c, *tc; + + if (ptr == NULL) { + ptr = null_context; + } + if (ptr == NULL) return; + + tc = talloc_chunk_from_ptr(ptr); if (tc->flags & TALLOC_FLAG_LOOP) { return; } - tc->flags |= TALLOC_FLAG_LOOP; + callback(ptr, depth, max_depth, 0, private_data); + if (max_depth >= 0 && depth >= max_depth) { + return; + } + + tc->flags |= TALLOC_FLAG_LOOP; for (c=tc->child;c;c=c->next) { if (c->name == TALLOC_MAGIC_REFERENCE) { - struct talloc_reference_handle *handle = - (struct talloc_reference_handle *)TC_PTR_FROM_CHUNK(c); - const char *name2 = talloc_get_name(handle->ptr); - fprintf(f, "%*sreference to: %s\n", depth*4, "", name2); + struct talloc_reference_handle *h = (struct talloc_reference_handle *)TC_PTR_FROM_CHUNK(c); + callback(h->ptr, depth + 1, max_depth, 1, private_data); } else { - const char *name = talloc_get_name(TC_PTR_FROM_CHUNK(c)); - fprintf(f, "%*s%-30s contains %6lu bytes in %3lu blocks (ref %d)\n", - depth*4, "", - name, - (unsigned long)talloc_total_size(TC_PTR_FROM_CHUNK(c)), - (unsigned long)talloc_total_blocks(TC_PTR_FROM_CHUNK(c)), - talloc_reference_count(TC_PTR_FROM_CHUNK(c))); - talloc_report_depth(TC_PTR_FROM_CHUNK(c), f, depth+1); + talloc_report_depth_cb(TC_PTR_FROM_CHUNK(c), depth + 1, max_depth, callback, private_data); } } tc->flags &= ~TALLOC_FLAG_LOOP; } -/* - report on memory usage by all children of a pointer, giving a full tree view -*/ -void talloc_report_full(const void *ptr, FILE *f) +static void talloc_report_depth_FILE_helper(const void *ptr, int depth, int max_depth, int is_ref, void *_f) { - if (ptr == NULL) { - ptr = null_context; + const char *name = talloc_get_name(ptr); + FILE *f = (FILE *)_f; + + if (is_ref) { + fprintf(f, "%*sreference to: %s\n", depth*4, "", name); + return; + } + + if (depth == 0) { + fprintf(f,"%stalloc report on '%s' (total %6lu bytes in %3lu blocks)\n", + (max_depth < 0 ? "full " :""), name, + (unsigned long)talloc_total_size(ptr), + (unsigned long)talloc_total_blocks(ptr)); + return; } - if (ptr == NULL) return; - fprintf(f,"full talloc report on '%s' (total %lu bytes in %lu blocks)\n", - talloc_get_name(ptr), + fprintf(f, "%*s%-30s contains %6lu bytes in %3lu blocks (ref %d)\n", + depth*4, "", + name, (unsigned long)talloc_total_size(ptr), - (unsigned long)talloc_total_blocks(ptr)); + (unsigned long)talloc_total_blocks(ptr), + talloc_reference_count(ptr)); +} - talloc_report_depth(ptr, f, 1); +/* + report on memory usage by all children of a pointer, giving a full tree view +*/ +void talloc_report_depth_file(const void *ptr, int depth, int max_depth, FILE *f) +{ + talloc_report_depth_cb(ptr, depth, max_depth, talloc_report_depth_FILE_helper, f); fflush(f); } +/* + report on memory usage by all children of a pointer, giving a full tree view +*/ +void talloc_report_full(const void *ptr, FILE *f) +{ + talloc_report_depth_file(ptr, 0, -1, f); +} + /* report on memory usage by all children of a pointer */ void talloc_report(const void *ptr, FILE *f) { - struct talloc_chunk *c, *tc; - - if (ptr == NULL) { - ptr = null_context; - } - if (ptr == NULL) return; - - fprintf(f,"talloc report on '%s' (total %lu bytes in %lu blocks)\n", - talloc_get_name(ptr), - (unsigned long)talloc_total_size(ptr), - (unsigned long)talloc_total_blocks(ptr)); - - tc = talloc_chunk_from_ptr(ptr); - - for (c=tc->child;c;c=c->next) { - fprintf(f, "\t%-30s contains %6lu bytes in %3lu blocks\n", - talloc_get_name(TC_PTR_FROM_CHUNK(c)), - (unsigned long)talloc_total_size(TC_PTR_FROM_CHUNK(c)), - (unsigned long)talloc_total_blocks(TC_PTR_FROM_CHUNK(c))); - } - fflush(f); + talloc_report_depth_file(ptr, 0, 1, f); } /* diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 9d6edd88ba..fdc0fd3494 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -5,6 +5,7 @@ Samba temporary memory allocation functions Copyright (C) Andrew Tridgell 2004-2005 + Copyright (C) Stefan Metzmacher 2006 ** NOTE! The following LGPL license applies to the talloc ** library. This does NOT imply that all of Samba is released @@ -110,6 +111,7 @@ typedef void TALLOC_CTX; void *_talloc(const void *context, size_t size); void _talloc_set_destructor(const void *ptr, int (*destructor)(void *)); int talloc_increase_ref_count(const void *ptr); +size_t talloc_reference_count(const void *ptr); void *_talloc_reference(const void *context, const void *ptr); int talloc_unlink(const void *context, void *ptr); const char *talloc_set_name(const void *ptr, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); @@ -119,7 +121,6 @@ void *talloc_named(const void *context, size_t size, void *talloc_named_const(const void *context, size_t size, const char *name); const char *talloc_get_name(const void *ptr); void *talloc_check_name(const void *ptr, const char *name); -void talloc_report_depth(const void *ptr, FILE *f, int depth); void *talloc_parent(const void *ptr); void *talloc_init(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2); int talloc_free(void *ptr); @@ -128,6 +129,13 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n void *_talloc_steal(const void *new_ctx, const void *ptr); size_t talloc_total_size(const void *ptr); size_t talloc_total_blocks(const void *ptr); +void talloc_report_depth_cb(const void *ptr, int depth, int max_depth, + void (*callback)(const void *ptr, + int depth, int max_depth, + int is_ref, + void *private_data), + void *private_data); +void talloc_report_depth_file(const void *ptr, int depth, int max_depth, FILE *f); void talloc_report_full(const void *ptr, FILE *f); void talloc_report(const void *ptr, FILE *f); void talloc_enable_null_tracking(void); @@ -142,8 +150,7 @@ char *talloc_append_string(const void *t, char *orig, const char *append); char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); -char *talloc_asprintf_append(char *s, - const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); +char *talloc_asprintf_append(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name); void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name); void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name); diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index 2c32fb1a87..83f524862f 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -204,6 +204,11 @@ your code. It returns 0 on success and -1 on failure. +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +size_t talloc_reference_count(const void *ptr); + +Return the number of references to the pointer. + =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- void talloc_set_name(const void *ptr, const char *fmt, ...); @@ -348,6 +353,34 @@ Passing NULL is allowed, but it will only give a meaningful result if talloc_enable_leak_report() or talloc_enable_leak_report_full() has been called. +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void talloc_report_depth_cb(const void *ptr, int depth, int max_depth, + void (*callback)(const void *ptr, + int depth, int max_depth, + int is_ref, + void *priv), + void *priv); + +This provides a more flexible reports than talloc_report(). It +will recursively call the callback for the entire tree of memory +referenced by the pointer. References in the tree are passed with +is_ref = 1 and the pointer that is referenced. + +You can pass NULL for the pointer, in which case a report is +printed for the top level memory context, but only if +talloc_enable_leak_report() or talloc_enable_leak_report_full() +has been called. + +The recursion is stopped when depth >= max_depth. +max_depth = -1 means only stop at leaf nodes. + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +void talloc_report_depth_file(const void *ptr, int depth, int max_depth, FILE *f); + +This provides a more flexible reports than talloc_report(). It +will let you specify the depth and max_depth. + =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- void talloc_report(const void *ptr, FILE *f); -- cgit From 4ce057c3f41ce759ab5b197087c5b38b40a1f1d3 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 31 Aug 2006 06:33:54 +0000 Subject: r17950: sync talloc with samba3 metze (This used to be commit 5697841e2949d2f7a053b4766c48906943a5a04e) --- source4/lib/talloc/talloc.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 2fb8fb2530..b7284e9317 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -492,6 +492,13 @@ void *talloc_init(const char *fmt, ...) void *ptr; const char *name; + /* + * samba3 expects talloc_report_depth_cb(NULL, ...) + * reports all talloc'ed memory, so we need to enable + * null_tracking + */ + talloc_enable_null_tracking(); + ptr = _talloc(NULL, 0); if (ptr == NULL) return NULL; -- cgit From 930edaaba75fe2112380f027e3f6d5626bea703c Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 31 Aug 2006 07:43:09 +0000 Subject: r17952: merge changes from samba3 metze (This used to be commit ff8d044c2e14e81b4bb32eaacc56875e9602ce4d) --- source4/lib/talloc/testsuite.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 5f7b68776b..013f01cc2c 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -24,6 +24,10 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#ifdef _SAMBA_BUILD_ +#include "version.h" +#endif /* _SAMBA_BUILD_ */ + #include "config.h" #include #include @@ -64,7 +68,7 @@ static double timeval_elapsed(struct timeval *tv) (tv2.tv_usec - tv->tv_usec)*1.0e-6; } -#if SAMBA_VERSION_MAJOR<4 +#if SAMBA_VERSION_MAJOR==3 #ifdef malloc #undef malloc #endif -- cgit From cca9dbb66f605edc950dc048eb51cc39d14a01d3 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 31 Aug 2006 09:18:06 +0000 Subject: r17957: don't try to use an internet connection when generating the manpage and only install the manpage if we build it metze (This used to be commit 23c6c7a27cc966d8e948e00c41d34e9a6ad40f2c) --- source4/lib/talloc/Makefile.in | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index 71953aa371..7e14d22e1f 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -30,16 +30,16 @@ install: all ${INSTALLCMD} -d ${includedir} ${INSTALLCMD} -m 644 $(srcdir)/talloc.h $(includedir) ${INSTALLCMD} -m 644 talloc.pc $(libdir)/pkgconfig - ${INSTALLCMD} -d ${mandir}/man3 - test -z "$(XSLTPROC)" || ${INSTALLCMD} -m 644 talloc.3 $(mandir)/man3 + test -f talloc.3 && ${INSTALLCMD} -d ${mandir}/man3 + test -f talloc.3 && ${INSTALLCMD} -m 644 talloc.3 $(mandir)/man3 -doc: talloc.3 +doc: talloc.3 talloc.3.html .3.xml.3: - test -z "$(XSLTPROC)" || $(XSLTPROC) -o $@ http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< + -test -z "$(XSLTPROC)" || $(XSLTPROC) --nonet -o $@ http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< .xml.html: - test -z "$(XSLTPROC)" || $(XSLTPROC) -o $@ http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl $< + -test -z "$(XSLTPROC)" || $(XSLTPROC) --nonet -o $@ http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl $< clean: rm -f *~ *.o testsuite *.gc?? -- cgit From 722d20f4ddef98ba8f305ea858c54e5df54ca27c Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 31 Aug 2006 09:26:43 +0000 Subject: r17958: as talloc_init() enabled null tracking, we should avoid to use it in smbtorture, and in the LOCAL-TALLOC we should reset the null tracking also make bin/smbtorture //url/foo LOCAL-TALLOC LOCAL-TALLOC possible metze (This used to be commit d1dd3df5e4fd21f5cbd00e472438fe3eadb266e5) --- source4/lib/talloc/testsuite.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 013f01cc2c..ca5e9042d3 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -910,6 +910,7 @@ static BOOL test_loop(void) printf("FAILED TO FIRE LOOP DESTRUCTOR\n"); return False; } + loop_destructor_count = 0; return True; } @@ -1021,6 +1022,7 @@ BOOL torture_local_talloc(struct torture_context *torture) { BOOL ret = True; + talloc_disable_null_tracking(); talloc_enable_null_tracking(); ret &= test_ref1(); -- cgit From 071582898cc8f973f37550893e6d937890b7ebba Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 31 Aug 2006 09:38:48 +0000 Subject: r17960: try to use gmake if present on IRIX metze (This used to be commit 18b4ae591a3a137dd25edd16a574e489cd5552bf) --- source4/lib/talloc/Makefile.in | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index 7e14d22e1f..a4b34fbf92 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -1,3 +1,5 @@ +#!gmake +# prefix = @prefix@ datarootdir = @datarootdir@ exec_prefix = @exec_prefix@ -- cgit From 648dacfaa167f857c22efc9a312d25a55af7b9f0 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 31 Aug 2006 10:17:54 +0000 Subject: r17963: fix install logic for talloc.3 metze (This used to be commit 161f2c04f78ba03ae4a24667e50cc9d8a446921e) --- source4/lib/talloc/Makefile.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index a4b34fbf92..ad298e6b49 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -32,8 +32,8 @@ install: all ${INSTALLCMD} -d ${includedir} ${INSTALLCMD} -m 644 $(srcdir)/talloc.h $(includedir) ${INSTALLCMD} -m 644 talloc.pc $(libdir)/pkgconfig - test -f talloc.3 && ${INSTALLCMD} -d ${mandir}/man3 - test -f talloc.3 && ${INSTALLCMD} -m 644 talloc.3 $(mandir)/man3 + test ! -e talloc.3 || ${INSTALLCMD} -d ${mandir}/man3 + test ! -e talloc.3 || ${INSTALLCMD} -m 644 talloc.3 $(mandir)/man3 doc: talloc.3 talloc.3.html -- cgit From e683a57f325909003fa17bf82fc6570c49ef5f1b Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 31 Aug 2006 10:31:40 +0000 Subject: r17964: try to support sun* hosts metze (This used to be commit 87d88b3a47047f837101aca2180555dc35cfcf31) --- source4/lib/talloc/Makefile.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index ad298e6b49..cb8fb00406 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -32,8 +32,8 @@ install: all ${INSTALLCMD} -d ${includedir} ${INSTALLCMD} -m 644 $(srcdir)/talloc.h $(includedir) ${INSTALLCMD} -m 644 talloc.pc $(libdir)/pkgconfig - test ! -e talloc.3 || ${INSTALLCMD} -d ${mandir}/man3 - test ! -e talloc.3 || ${INSTALLCMD} -m 644 talloc.3 $(mandir)/man3 + if [ -f talloc.3 ];then ${INSTALLCMD} -d ${mandir}/man3; fi + if [ -f talloc.3 ];then ${INSTALLCMD} -m 644 talloc.3 $(mandir)/man3; fi doc: talloc.3 talloc.3.html -- cgit From 5e214d5160ade4b727d7ba937292b5a6262c3bec Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 31 Aug 2006 11:31:10 +0000 Subject: r17965: make talloc build more portable metze (This used to be commit 64ba7ffdb866cc74366842750d95a25b47266097) --- source4/lib/talloc/Makefile.in | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index cb8fb00406..8290f05e02 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -24,7 +24,9 @@ all: libtalloc.a testsuite $(EXTRA_TARGETS) testsuite: $(LIBOBJ) testsuite.o $(CC) $(CFLAGS) -o testsuite testsuite.o $(LIBOBJ) $(LIBS) -libtalloc.a: libtalloc.a($(LIBOBJ)) +libtalloc.a: $(LIBOBJ) + ar -rv $@ $(LIBOBJ) + @-ranlib $@ install: all ${INSTALLCMD} -d ${libdir} -- cgit From c3d6fea11f0b755c4971697440b6a4f9389706f7 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 31 Aug 2006 11:35:03 +0000 Subject: r17966: remove all generated files metze (This used to be commit 2493f670d3581df2bbbca7a0295e31ae3a09c2c0) --- source4/lib/talloc/Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index 8290f05e02..b9e4d398f4 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -46,7 +46,7 @@ doc: talloc.3 talloc.3.html -test -z "$(XSLTPROC)" || $(XSLTPROC) --nonet -o $@ http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl $< clean: - rm -f *~ *.o testsuite *.gc?? + rm -f *~ *.o libtalloc.a testsuite *.gc?? talloc.3 talloc.3.html test: testsuite ./testsuite -- cgit From f6f4d868ea7d3a01ec28c6855240882911cae039 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 4 Sep 2006 08:55:58 +0000 Subject: r18027: Fix some 64-bit warnings (This used to be commit cd495d89314a653b5976b1690e075fd7bac2f59b) --- source4/lib/talloc/talloc.c | 2 +- source4/lib/talloc/testsuite.c | 27 ++++++++++++++++++--------- 2 files changed, 19 insertions(+), 10 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index b7284e9317..43c95a86e5 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -890,7 +890,7 @@ static void talloc_report_depth_FILE_helper(const void *ptr, int depth, int max_ name, (unsigned long)talloc_total_size(ptr), (unsigned long)talloc_total_blocks(ptr), - talloc_reference_count(ptr)); + (int)talloc_reference_count(ptr)); } /* diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index ca5e9042d3..8640e9475e 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -960,8 +960,10 @@ static BOOL test_talloc_ptrtype(void) s1 = talloc_ptrtype(top, s1);location1 = __location__; if (talloc_get_size(s1) != sizeof(struct struct1)) { - printf("%s: talloc_ptrtype() allocated the wrong size %u (should be %u)\n", - __location__, talloc_get_size(s1), sizeof(struct struct1)); + printf("%s: talloc_ptrtype() allocated the wrong size %lu " + "(should be %lu)\n", + __location__, (unsigned long)talloc_get_size(s1), + (unsigned long)sizeof(struct struct1)); ret = False; } @@ -974,22 +976,27 @@ static BOOL test_talloc_ptrtype(void) s2 = talloc_array_ptrtype(top, s2, 10);location2 = __location__; if (talloc_get_size(s2) != (sizeof(struct struct1) * 10)) { - printf("%s: talloc_array_ptrtype() allocated the wrong size %u (should be %u)\n", - __location__, talloc_get_size(s2), (sizeof(struct struct1)*10)); + printf("%s: talloc_array_ptrtype() allocated the wrong size " + "%lu (should be %lu)\n", + __location__, (unsigned long)talloc_get_size(s2), + (unsigned long)(sizeof(struct struct1)*10)); ret = False; } if (strcmp(location2, talloc_get_name(s2)) != 0) { printf("%s: talloc_array_ptrtype() sets the wrong name '%s' (should be '%s')\n", - __location__, talloc_get_name(s2), location2); + __location__, talloc_get_name(s2), + location2); ret = False; } s3 = talloc_array_ptrtype(top, s3, 10);location3 = __location__; if (talloc_get_size(s3) != (sizeof(struct struct1 *) * 10)) { - printf("%s: talloc_array_ptrtype() allocated the wrong size %u (should be %u)\n", - __location__, talloc_get_size(s3), (sizeof(struct struct1 *)*10)); + printf("%s: talloc_array_ptrtype() allocated the wrong size " + "%lu (should be %lu)\n", + __location__, (unsigned long)talloc_get_size(s3), + (unsigned long)(sizeof(struct struct1 *)*10)); ret = False; } @@ -1002,8 +1009,10 @@ static BOOL test_talloc_ptrtype(void) s4 = talloc_array_ptrtype(top, s4, 10);location4 = __location__; if (talloc_get_size(s4) != (sizeof(struct struct1 **) * 10)) { - printf("%s: talloc_array_ptrtype() allocated the wrong size %u (should be %u)\n", - __location__, talloc_get_size(s4), (sizeof(struct struct1 **)*10)); + printf("%s: talloc_array_ptrtype() allocated the wrong size " + "%lu (should be %lu)\n", + __location__, (unsigned long)talloc_get_size(s4), + (unsigned long)(sizeof(struct struct1 **)*10)); ret = False; } -- cgit From 38fdde5d9bf15b10caa60ee216d278ba8d870c2e Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 4 Sep 2006 12:21:42 +0000 Subject: r18031: Merge my replace fixes: * libreplace can now build stand-alone * add stub testsuite for libreplace * make talloc/tdb/ldb use libreplace (This used to be commit fe7ca4b1454e01a33ed0d53791ebffdd349298b4) --- source4/lib/talloc/config.mk | 1 + source4/lib/talloc/configure.ac | 19 +++++++++++++++++++ source4/lib/talloc/configure.in | 19 ------------------- 3 files changed, 20 insertions(+), 19 deletions(-) create mode 100644 source4/lib/talloc/configure.ac delete mode 100644 source4/lib/talloc/configure.in (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 8c704520f5..dc523d4ede 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -6,6 +6,7 @@ SO_VERSION = 0 OBJ_FILES = talloc.o PUBLIC_DEPENDENCIES = LIBREPLACE MANPAGE = talloc.3 +CFLAGS = -Ilib/talloc PUBLIC_HEADERS = talloc.h DESCRIPTION = A hierarchical pool based memory system with destructors # diff --git a/source4/lib/talloc/configure.ac b/source4/lib/talloc/configure.ac new file mode 100644 index 0000000000..253992cb1a --- /dev/null +++ b/source4/lib/talloc/configure.ac @@ -0,0 +1,19 @@ +AC_PREREQ(2.50) +AC_INIT(talloc.h) +AC_CONFIG_SRCDIR([talloc.c]) +AC_SUBST(datarootdir) +AC_PROG_CC +if test "x$GCC" = "xyes"; then + CFLAGS="$CFLAGS -Wall -W" +fi +AC_PROG_INSTALL +AC_PATH_PROG(XSLTPROC,xsltproc) +DOC_TARGET="" +if test -n "$XSLTPROC"; then + DOC_TARGET=doc +fi +AC_SUBST(DOC_TARGET) +AC_CONFIG_HEADER(config.h) +AC_SYS_LARGEFILE +sinclude(config.m4) +AC_OUTPUT(Makefile talloc.pc) diff --git a/source4/lib/talloc/configure.in b/source4/lib/talloc/configure.in deleted file mode 100644 index 253992cb1a..0000000000 --- a/source4/lib/talloc/configure.in +++ /dev/null @@ -1,19 +0,0 @@ -AC_PREREQ(2.50) -AC_INIT(talloc.h) -AC_CONFIG_SRCDIR([talloc.c]) -AC_SUBST(datarootdir) -AC_PROG_CC -if test "x$GCC" = "xyes"; then - CFLAGS="$CFLAGS -Wall -W" -fi -AC_PROG_INSTALL -AC_PATH_PROG(XSLTPROC,xsltproc) -DOC_TARGET="" -if test -n "$XSLTPROC"; then - DOC_TARGET=doc -fi -AC_SUBST(DOC_TARGET) -AC_CONFIG_HEADER(config.h) -AC_SYS_LARGEFILE -sinclude(config.m4) -AC_OUTPUT(Makefile talloc.pc) -- cgit From 10d58661be5588e8877c696abf67a932d5a5373c Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 5 Sep 2006 06:40:39 +0000 Subject: r18064: merge from samba3 metze (This used to be commit c60deff667941e462fd9c8a894a723c792fe465e) --- source4/lib/talloc/testsuite.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 8640e9475e..ae533399bc 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -609,6 +609,14 @@ static BOOL test_realloc(void) return True; } +struct el2 { + const char *name; +}; + +struct el1 { + int count; + struct el2 **list, **list2, **list3; +}; /* test realloc with a child @@ -616,12 +624,7 @@ static BOOL test_realloc(void) static BOOL test_realloc_child(void) { void *root; - struct el1 { - int count; - struct el2 { - const char *name; - } **list, **list2, **list3; - } *el1; + struct el1 *el1; struct el2 *el2; printf("TESTING REALLOC WITH CHILD\n"); -- cgit From 9b10009938612ff8796ffdda0d666ef9060ba534 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 5 Sep 2006 11:34:43 +0000 Subject: r18076: convert talloc to the new libreplace system (This used to be commit 968a4e97cfa6585b06f0c5e64d746715a1297461) --- source4/lib/talloc/Makefile.in | 8 ++++---- source4/lib/talloc/autogen.sh | 5 +++-- source4/lib/talloc/config.m4 | 13 +++++++++++++ source4/lib/talloc/configure.ac | 4 +++- 4 files changed, 23 insertions(+), 7 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index b9e4d398f4..847ac6fc56 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -6,18 +6,18 @@ exec_prefix = @exec_prefix@ includedir = @includedir@ libdir = @libdir@ mandir = @mandir@ -VPATH = @srcdir@ +VPATH = @srcdir@:@libreplacedir@ srcdir = @srcdir@ builddir = @builddir@ XSLTPROC = @XSLTPROC@ INSTALLCMD = @INSTALL@ CC = @CC@ -CFLAGS = @CFLAGS@ -DHAVE_CONFIG_H= -I$(srcdir) -I. +CFLAGS = @CFLAGS@ -DHAVE_CONFIG_H= -I. -I@srcdir@ -I@libreplacedir@ EXTRA_TARGETS = @DOC_TARGET@ .SUFFIXES: .c .o .3 .3.xml .xml .html -LIBOBJ = talloc.o +LIBOBJ = @TALLOCOBJ@ @LIBREPLACEOBJ@ all: libtalloc.a testsuite $(EXTRA_TARGETS) @@ -46,7 +46,7 @@ doc: talloc.3 talloc.3.html -test -z "$(XSLTPROC)" || $(XSLTPROC) --nonet -o $@ http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl $< clean: - rm -f *~ *.o libtalloc.a testsuite *.gc?? talloc.3 talloc.3.html + rm -f *~ $(LIBOBJ) libtalloc.a testsuite *.gc?? talloc.3 talloc.3.html test: testsuite ./testsuite diff --git a/source4/lib/talloc/autogen.sh b/source4/lib/talloc/autogen.sh index e118019a39..1ebdb211d9 100755 --- a/source4/lib/talloc/autogen.sh +++ b/source4/lib/talloc/autogen.sh @@ -1,7 +1,8 @@ #!/bin/sh -autoconf || exit 1 -autoheader || exit 1 +IPATHS="-I libreplace -I lib/replace -I ../libreplace -I ../replace" +autoconf $IPATHS || exit 1 +autoheader $IPATHS || exit 1 echo "Now run ./configure and then make." exit 0 diff --git a/source4/lib/talloc/config.m4 b/source4/lib/talloc/config.m4 index 0286bde6c2..e5eccb3a22 100644 --- a/source4/lib/talloc/config.m4 +++ b/source4/lib/talloc/config.m4 @@ -1,3 +1,16 @@ +dnl find the talloc sources. This is meant to work both for +dnl talloc standalone builds, and builds of packages using talloc +tallocdir="" +for d in "$srcdir" "$srcdir/lib/talloc" "$srcdir/talloc" "$srcdir/../talloc"; do + if test -f "$d/talloc.c"; then + tallocdir="$d" + AC_SUBST(tallocdir) + break; + fi +done +TALLOCOBJ="talloc.o" +AC_SUBST(TALLOCOBJ) + AC_CHECK_HEADERS(stdarg.h vararg.h) dnl VA_COPY diff --git a/source4/lib/talloc/configure.ac b/source4/lib/talloc/configure.ac index 253992cb1a..59b9e4470a 100644 --- a/source4/lib/talloc/configure.ac +++ b/source4/lib/talloc/configure.ac @@ -13,7 +13,9 @@ if test -n "$XSLTPROC"; then DOC_TARGET=doc fi AC_SUBST(DOC_TARGET) -AC_CONFIG_HEADER(config.h) +AC_CONFIG_HEADER(talloc_config.h) AC_SYS_LARGEFILE sinclude(config.m4) + +sinclude(libreplace.m4) AC_OUTPUT(Makefile talloc.pc) -- cgit From f9cdcd2eca7737979790479c9823ede98a2233cd Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 5 Sep 2006 11:38:50 +0000 Subject: r18077: move some configure tests out of talloc that are now in libreplace (This used to be commit b5d519eb1eea507a749cb252d8dd9265022f7054) --- source4/lib/talloc/config.m4 | 22 ---------------------- 1 file changed, 22 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.m4 b/source4/lib/talloc/config.m4 index e5eccb3a22..14e92b212c 100644 --- a/source4/lib/talloc/config.m4 +++ b/source4/lib/talloc/config.m4 @@ -11,28 +11,6 @@ done TALLOCOBJ="talloc.o" AC_SUBST(TALLOCOBJ) -AC_CHECK_HEADERS(stdarg.h vararg.h) - -dnl VA_COPY -AC_CACHE_CHECK([for va_copy],samba_cv_HAVE_VA_COPY,[ -AC_TRY_LINK([#include -va_list ap1,ap2;], [va_copy(ap1,ap2);], -samba_cv_HAVE_VA_COPY=yes,samba_cv_HAVE_VA_COPY=no)]) -if test x"$samba_cv_HAVE_VA_COPY" = x"yes"; then - AC_DEFINE(HAVE_VA_COPY,1,[Whether va_copy() is available]) -fi - -if test x"$samba_cv_HAVE_VA_COPY" != x"yes"; then -AC_CACHE_CHECK([for __va_copy],samba_cv_HAVE___VA_COPY,[ -AC_TRY_LINK([#include -va_list ap1,ap2;], [__va_copy(ap1,ap2);], -samba_cv_HAVE___VA_COPY=yes,samba_cv_HAVE___VA_COPY=no)]) -if test x"$samba_cv_HAVE___VA_COPY" = x"yes"; then - AC_DEFINE(HAVE___VA_COPY,1,[Whether __va_copy() is available]) -fi -fi - -AC_CHECK_TYPE(intptr_t, unsigned long long) AC_CHECK_SIZEOF(size_t,cross) AC_CHECK_SIZEOF(void *,cross) -- cgit From c75b6b92c8680868509e736941dba47fe8355022 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 5 Sep 2006 11:47:28 +0000 Subject: r18080: added distclean target to talloc (This used to be commit 1185dd044b40f722d06b0e148824582e7efcb380) --- source4/lib/talloc/Makefile.in | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index 847ac6fc56..cc319a1b7f 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -56,3 +56,10 @@ gcov: installcheck: $(MAKE) test + +distclean: clean + rm -f *~ */*~ + rm -rf autom4te.cache + rm -f configure \ + config.log config.status config.h + rm -f Makefile -- cgit From 1acb65fdef88ef9c5f0b94b5e518b07c51fd2260 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 5 Sep 2006 11:52:28 +0000 Subject: r18082: bring talloc in line with new conventions (This used to be commit 7f7c85fa2feb1398050ea6b2929628f83b6bdb11) --- source4/lib/talloc/config.m4 | 23 ----------------------- source4/lib/talloc/configure.ac | 5 +++-- source4/lib/talloc/libtdb.m4 | 23 +++++++++++++++++++++++ 3 files changed, 26 insertions(+), 25 deletions(-) delete mode 100644 source4/lib/talloc/config.m4 create mode 100644 source4/lib/talloc/libtdb.m4 (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.m4 b/source4/lib/talloc/config.m4 deleted file mode 100644 index 14e92b212c..0000000000 --- a/source4/lib/talloc/config.m4 +++ /dev/null @@ -1,23 +0,0 @@ -dnl find the talloc sources. This is meant to work both for -dnl talloc standalone builds, and builds of packages using talloc -tallocdir="" -for d in "$srcdir" "$srcdir/lib/talloc" "$srcdir/talloc" "$srcdir/../talloc"; do - if test -f "$d/talloc.c"; then - tallocdir="$d" - AC_SUBST(tallocdir) - break; - fi -done -TALLOCOBJ="talloc.o" -AC_SUBST(TALLOCOBJ) - -AC_CHECK_SIZEOF(size_t,cross) -AC_CHECK_SIZEOF(void *,cross) - -if test $ac_cv_sizeof_size_t -lt $ac_cv_sizeof_void_p; then - AC_WARN([size_t cannot represent the amount of used memory of a process]) - AC_WARN([please report this to ]) - AC_WARN([sizeof(size_t) = $ac_cv_sizeof_size_t]) - AC_WARN([sizeof(void *) = $ac_cv_sizeof_void_p]) - AC_ERROR([sizeof(size_t) < sizeof(void *)]) -fi diff --git a/source4/lib/talloc/configure.ac b/source4/lib/talloc/configure.ac index 59b9e4470a..9c81382884 100644 --- a/source4/lib/talloc/configure.ac +++ b/source4/lib/talloc/configure.ac @@ -13,9 +13,10 @@ if test -n "$XSLTPROC"; then DOC_TARGET=doc fi AC_SUBST(DOC_TARGET) -AC_CONFIG_HEADER(talloc_config.h) +AC_CONFIG_HEADER(config.h) AC_SYS_LARGEFILE -sinclude(config.m4) sinclude(libreplace.m4) +sinclude(libtdb.m4) + AC_OUTPUT(Makefile talloc.pc) diff --git a/source4/lib/talloc/libtdb.m4 b/source4/lib/talloc/libtdb.m4 new file mode 100644 index 0000000000..14e92b212c --- /dev/null +++ b/source4/lib/talloc/libtdb.m4 @@ -0,0 +1,23 @@ +dnl find the talloc sources. This is meant to work both for +dnl talloc standalone builds, and builds of packages using talloc +tallocdir="" +for d in "$srcdir" "$srcdir/lib/talloc" "$srcdir/talloc" "$srcdir/../talloc"; do + if test -f "$d/talloc.c"; then + tallocdir="$d" + AC_SUBST(tallocdir) + break; + fi +done +TALLOCOBJ="talloc.o" +AC_SUBST(TALLOCOBJ) + +AC_CHECK_SIZEOF(size_t,cross) +AC_CHECK_SIZEOF(void *,cross) + +if test $ac_cv_sizeof_size_t -lt $ac_cv_sizeof_void_p; then + AC_WARN([size_t cannot represent the amount of used memory of a process]) + AC_WARN([please report this to ]) + AC_WARN([sizeof(size_t) = $ac_cv_sizeof_size_t]) + AC_WARN([sizeof(void *) = $ac_cv_sizeof_void_p]) + AC_ERROR([sizeof(size_t) < sizeof(void *)]) +fi -- cgit From 6c1bcc6521c819da08813b645133e113eb4833f6 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 5 Sep 2006 12:01:18 +0000 Subject: r18083: i should sleep more .... (This used to be commit 9bc583cf6c66130df4b9fd2ee1ab3ea486e22b8a) --- source4/lib/talloc/configure.ac | 2 +- source4/lib/talloc/libtalloc.m4 | 23 +++++++++++++++++++++++ source4/lib/talloc/libtdb.m4 | 23 ----------------------- 3 files changed, 24 insertions(+), 24 deletions(-) create mode 100644 source4/lib/talloc/libtalloc.m4 delete mode 100644 source4/lib/talloc/libtdb.m4 (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/configure.ac b/source4/lib/talloc/configure.ac index 9c81382884..8b33fe0b1a 100644 --- a/source4/lib/talloc/configure.ac +++ b/source4/lib/talloc/configure.ac @@ -17,6 +17,6 @@ AC_CONFIG_HEADER(config.h) AC_SYS_LARGEFILE sinclude(libreplace.m4) -sinclude(libtdb.m4) +sinclude(libtalloc.m4) AC_OUTPUT(Makefile talloc.pc) diff --git a/source4/lib/talloc/libtalloc.m4 b/source4/lib/talloc/libtalloc.m4 new file mode 100644 index 0000000000..14e92b212c --- /dev/null +++ b/source4/lib/talloc/libtalloc.m4 @@ -0,0 +1,23 @@ +dnl find the talloc sources. This is meant to work both for +dnl talloc standalone builds, and builds of packages using talloc +tallocdir="" +for d in "$srcdir" "$srcdir/lib/talloc" "$srcdir/talloc" "$srcdir/../talloc"; do + if test -f "$d/talloc.c"; then + tallocdir="$d" + AC_SUBST(tallocdir) + break; + fi +done +TALLOCOBJ="talloc.o" +AC_SUBST(TALLOCOBJ) + +AC_CHECK_SIZEOF(size_t,cross) +AC_CHECK_SIZEOF(void *,cross) + +if test $ac_cv_sizeof_size_t -lt $ac_cv_sizeof_void_p; then + AC_WARN([size_t cannot represent the amount of used memory of a process]) + AC_WARN([please report this to ]) + AC_WARN([sizeof(size_t) = $ac_cv_sizeof_size_t]) + AC_WARN([sizeof(void *) = $ac_cv_sizeof_void_p]) + AC_ERROR([sizeof(size_t) < sizeof(void *)]) +fi diff --git a/source4/lib/talloc/libtdb.m4 b/source4/lib/talloc/libtdb.m4 deleted file mode 100644 index 14e92b212c..0000000000 --- a/source4/lib/talloc/libtdb.m4 +++ /dev/null @@ -1,23 +0,0 @@ -dnl find the talloc sources. This is meant to work both for -dnl talloc standalone builds, and builds of packages using talloc -tallocdir="" -for d in "$srcdir" "$srcdir/lib/talloc" "$srcdir/talloc" "$srcdir/../talloc"; do - if test -f "$d/talloc.c"; then - tallocdir="$d" - AC_SUBST(tallocdir) - break; - fi -done -TALLOCOBJ="talloc.o" -AC_SUBST(TALLOCOBJ) - -AC_CHECK_SIZEOF(size_t,cross) -AC_CHECK_SIZEOF(void *,cross) - -if test $ac_cv_sizeof_size_t -lt $ac_cv_sizeof_void_p; then - AC_WARN([size_t cannot represent the amount of used memory of a process]) - AC_WARN([please report this to ]) - AC_WARN([sizeof(size_t) = $ac_cv_sizeof_size_t]) - AC_WARN([sizeof(void *) = $ac_cv_sizeof_void_p]) - AC_ERROR([sizeof(size_t) < sizeof(void *)]) -fi -- cgit From 9105f1323b89d93c2363f04c1660ebbb3b7c9c6c Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 5 Sep 2006 12:13:34 +0000 Subject: r18086: here too (This used to be commit e485b25a39ebbbfaf150fad1946e138830bdbfec) --- source4/lib/talloc/configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/configure.ac b/source4/lib/talloc/configure.ac index 8b33fe0b1a..a8b446169e 100644 --- a/source4/lib/talloc/configure.ac +++ b/source4/lib/talloc/configure.ac @@ -16,7 +16,7 @@ AC_SUBST(DOC_TARGET) AC_CONFIG_HEADER(config.h) AC_SYS_LARGEFILE -sinclude(libreplace.m4) -sinclude(libtalloc.m4) +m4_include(libreplace.m4) +m4_include(libtalloc.m4) AC_OUTPUT(Makefile talloc.pc) -- cgit From bf0250c621f10a6548eb75601cb61a23286f6e71 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 5 Sep 2006 13:43:35 +0000 Subject: r18089: sometimes autoconf picks up some old stuff: - remove configure and config.h.in - cleanup after autoconf and autoheader are done metze (This used to be commit 8246d8ecd2679af59e32901174638a166ed69222) --- source4/lib/talloc/autogen.sh | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/autogen.sh b/source4/lib/talloc/autogen.sh index 1ebdb211d9..bf84eeee19 100755 --- a/source4/lib/talloc/autogen.sh +++ b/source4/lib/talloc/autogen.sh @@ -1,9 +1,14 @@ #!/bin/sh +rm -rf autom4te.cache +rm -f configure config.h.in + IPATHS="-I libreplace -I lib/replace -I ../libreplace -I ../replace" autoconf $IPATHS || exit 1 autoheader $IPATHS || exit 1 +rm -rf autom4te.cache + echo "Now run ./configure and then make." exit 0 -- cgit From 7a29fb6dd77922e179300a458949bc22280bdb34 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 5 Sep 2006 15:03:06 +0000 Subject: r18096: try to make tcc happy and don't the same struct names in a global and a local scope metze (This used to be commit b787259365eb3dbbc5e8a82a95f0beeea0015682) --- source4/lib/talloc/testsuite.c | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index ae533399bc..766cf039c0 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -609,23 +609,19 @@ static BOOL test_realloc(void) return True; } -struct el2 { - const char *name; -}; - -struct el1 { - int count; - struct el2 **list, **list2, **list3; -}; - /* test realloc with a child */ static BOOL test_realloc_child(void) { void *root; - struct el1 *el1; - struct el2 *el2; + struct el2 { + const char *name; + } *el2; + struct el1 { + int count; + struct el2 **list, **list2, **list3; + } *el1; printf("TESTING REALLOC WITH CHILD\n"); -- cgit From 3c6ce57101eb555d01152b1fe5ea15fcf5bb8133 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 5 Sep 2006 16:16:27 +0000 Subject: r18100: actually make usage of libreplace :-) metze (This used to be commit 357882e6ec20b559b7053a8dffb72b7dec26b82f) --- source4/lib/talloc/talloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 43c95a86e5..f92d76bb3d 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -48,7 +48,7 @@ #endif /* _SAMBA_BUILD_ */ #ifndef _TALLOC_SAMBA3 -#include "config.h" +#include "replace.h" #include #include -- cgit From a983b06d37c3b87a02444d9a9862777b88629344 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 6 Sep 2006 04:44:32 +0000 Subject: r18129: moved the system includes into libreplace - this gives much more isolation of our portability environment from the main code, and also simplifies the includes system (no separate #ifdef _SAMBA_BUILD for tdb. ldb etc now) (This used to be commit 77d1a468e06290aba789e2f3affc769fc5159a21) --- source4/lib/talloc/talloc.c | 17 ----------------- source4/lib/talloc/testsuite.c | 14 ++------------ 2 files changed, 2 insertions(+), 29 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index f92d76bb3d..d2f7a5d828 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -49,23 +49,6 @@ #ifndef _TALLOC_SAMBA3 #include "replace.h" - -#include -#include -#include -#include -#ifdef HAVE_STDINT_H -#include -#endif - -#if defined(HAVE_STDARG_H) -#include -#elif defined (HAVE_VARARGS_H) -#include -#else -#error "no var arg header" -#endif - #include "talloc.h" #endif /* not _TALLOC_SAMBA3 */ diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 766cf039c0..1fa2c7bfe4 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -28,18 +28,8 @@ #include "version.h" #endif /* _SAMBA_BUILD_ */ -#include "config.h" -#include -#include -#include - -#ifdef HAVE_STDARG_H -#include -#endif - -#include -#include - +#include "replace.h" +#include "system/time.h" #include "talloc.h" #ifndef False -- cgit From eb1def379e12264438504402a543490a06036e00 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 6 Sep 2006 06:47:10 +0000 Subject: r18142: add make distclean to talloc build metze (This used to be commit c8342c9ae5b37acd72271e025f0ee735a95cf8e5) --- source4/lib/talloc/Makefile.in | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index cc319a1b7f..73336c2933 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -46,7 +46,7 @@ doc: talloc.3 talloc.3.html -test -z "$(XSLTPROC)" || $(XSLTPROC) --nonet -o $@ http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl $< clean: - rm -f *~ $(LIBOBJ) libtalloc.a testsuite *.gc?? talloc.3 talloc.3.html + rm -f *~ $(LIBOBJ) libtalloc.a testsuite testsuite.o *.gc?? talloc.3 talloc.3.html test: testsuite ./testsuite @@ -59,7 +59,10 @@ installcheck: distclean: clean rm -f *~ */*~ - rm -rf autom4te.cache - rm -f configure \ - config.log config.status config.h rm -f Makefile + rm -f config.log \ + config.status \ + config.h + +realdistclean: distclean + rm -f configure config.h.in -- cgit From ed356c798974a302036b7e68c7e6b703c50bf09d Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 6 Sep 2006 07:11:09 +0000 Subject: r18143: the 'showflags' convention from Samba is useful for the other packages (This used to be commit a4d1f1d2229e1a0b1523bf14fab59278207abbc0) --- source4/lib/talloc/Makefile.in | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index 73336c2933..4effa96415 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -19,7 +19,12 @@ EXTRA_TARGETS = @DOC_TARGET@ LIBOBJ = @TALLOCOBJ@ @LIBREPLACEOBJ@ -all: libtalloc.a testsuite $(EXTRA_TARGETS) +all: showflags libtalloc.a testsuite $(EXTRA_TARGETS) + +showflags: + @echo 'talloc will be compiled with flags:' + @echo ' CFLAGS = $(CFLAGS)' + @echo ' LIBS = $(LIBS)' testsuite: $(LIBOBJ) testsuite.o $(CC) $(CFLAGS) -o testsuite testsuite.o $(LIBOBJ) $(LIBS) -- cgit From 6150443532ef714fcd060e4fe384db11552eb673 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 6 Sep 2006 09:52:16 +0000 Subject: r18152: move our AC macros into lib/replace/libreplace_macros.m4 and include them from there metze (This used to be commit 38f9e90a120b4e62f005a1bac89139ee87f63071) --- source4/lib/talloc/aclocal.m4 | 1 + 1 file changed, 1 insertion(+) create mode 100644 source4/lib/talloc/aclocal.m4 (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/aclocal.m4 b/source4/lib/talloc/aclocal.m4 new file mode 100644 index 0000000000..2a7ad94963 --- /dev/null +++ b/source4/lib/talloc/aclocal.m4 @@ -0,0 +1 @@ +m4_include(libreplace_macros.m4) -- cgit From 1869a8cc6653ad2977b9baf3a88dc8c1a8b67fb9 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 6 Sep 2006 12:10:25 +0000 Subject: r18163: Remove defines for BOOL, False and True (This used to be commit 6f5e7df6f2cf67731e596b1d1d6fafbb76123e89) --- source4/lib/talloc/testsuite.c | 154 +++++++++++++++++++---------------------- 1 file changed, 72 insertions(+), 82 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 1fa2c7bfe4..2faa6d64c4 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -32,16 +32,6 @@ #include "system/time.h" #include "talloc.h" -#ifndef False -#define False 0 -#endif -#ifndef True -#define True 1 -#endif -#ifndef BOOL -#define BOOL int -#endif - struct torture_context; static struct timeval timeval_current(void) @@ -74,7 +64,7 @@ static double timeval_elapsed(struct timeval *tv) (unsigned)talloc_total_size(ptr), \ (unsigned)tsize); \ talloc_report_full(ptr, stdout); \ - return False; \ + return false; \ } \ } while (0) @@ -85,7 +75,7 @@ static double timeval_elapsed(struct timeval *tv) (unsigned)talloc_total_blocks(ptr), \ (unsigned)tblocks); \ talloc_report_full(ptr, stdout); \ - return False; \ + return false; \ } \ } while (0) @@ -98,7 +88,7 @@ static double timeval_elapsed(struct timeval *tv) talloc_report_full(ptr, stdout); \ talloc_report_full(parent, stdout); \ talloc_report_full(NULL, stdout); \ - return False; \ + return false; \ } \ } while (0) @@ -106,7 +96,7 @@ static double timeval_elapsed(struct timeval *tv) /* test references */ -static BOOL test_ref1(void) +static bool test_ref1(void) { void *root, *p1, *p2, *ref, *r1; @@ -147,7 +137,7 @@ static BOOL test_ref1(void) printf("Testing NULL\n"); if (talloc_reference(root, NULL)) { - return False; + return false; } CHECK_BLOCKS(root, 1); @@ -156,13 +146,13 @@ static BOOL test_ref1(void) talloc_free(root); - return True; + return true; } /* test references */ -static BOOL test_ref2(void) +static bool test_ref2(void) { void *root, *p1, *p2, *ref, *r1; @@ -212,13 +202,13 @@ static BOOL test_ref2(void) talloc_free(root); - return True; + return true; } /* test references */ -static BOOL test_ref3(void) +static bool test_ref3(void) { void *root, *p1, *p2, *ref, *r1; @@ -250,13 +240,13 @@ static BOOL test_ref3(void) talloc_free(root); - return True; + return true; } /* test references */ -static BOOL test_ref4(void) +static bool test_ref4(void) { void *root, *p1, *p2, *ref, *r1; @@ -298,14 +288,14 @@ static BOOL test_ref4(void) talloc_free(root); - return True; + return true; } /* test references */ -static BOOL test_unlink1(void) +static bool test_unlink1(void) { void *root, *p1, *p2, *ref, *r1; @@ -342,7 +332,7 @@ static BOOL test_unlink1(void) talloc_free(root); - return True; + return true; } static int fail_destructor(void *ptr) @@ -353,7 +343,7 @@ static int fail_destructor(void *ptr) /* miscellaneous tests to try to get a higher test coverage percentage */ -static BOOL test_misc(void) +static bool test_misc(void) { void *root, *p1; char *p2; @@ -367,7 +357,7 @@ static BOOL test_misc(void) p1 = talloc_size(root, 0x7fffffff); if (p1) { printf("failed: large talloc allowed\n"); - return False; + return false; } p1 = talloc_strdup(root, "foo"); @@ -385,11 +375,11 @@ static BOOL test_misc(void) p2 = talloc_strdup(p1, "foo"); if (talloc_unlink(root, p2) != -1) { printf("failed: talloc_unlink() of non-reference context should return -1\n"); - return False; + return false; } if (talloc_unlink(p1, p2) != 0) { printf("failed: talloc_unlink() of parent should succeed\n"); - return False; + return false; } talloc_free(p1); CHECK_BLOCKS(p1, 1); @@ -399,7 +389,7 @@ static BOOL test_misc(void) if (strcmp(talloc_get_name(p1), "my name is foo") != 0) { printf("failed: wrong name after talloc_set_name(my name is foo) - '%s'=>'%s'\n", (name?name:"NULL"), talloc_get_name(p1)); - return False; + return false; } CHECK_BLOCKS(p1, 2); CHECK_BLOCKS(root, 3); @@ -408,7 +398,7 @@ static BOOL test_misc(void) if (strcmp(talloc_get_name(p1), "UNNAMED") != 0) { printf("failed: wrong name after talloc_set_name(NULL) - '%s'\n", talloc_get_name(p1)); - return False; + return false; } CHECK_BLOCKS(p1, 2); CHECK_BLOCKS(root, 3); @@ -416,13 +406,13 @@ static BOOL test_misc(void) if (talloc_free(NULL) != -1) { printf("talloc_free(NULL) should give -1\n"); - return False; + return false; } talloc_set_destructor(p1, fail_destructor); if (talloc_free(p1) != -1) { printf("Failed destructor should cause talloc_free to fail\n"); - return False; + return false; } talloc_set_destructor(p1, NULL); @@ -432,24 +422,24 @@ static BOOL test_misc(void) p2 = (char *)talloc_zero_size(p1, 20); if (p2[19] != 0) { printf("Failed to give zero memory\n"); - return False; + return false; } talloc_free(p2); if (talloc_strdup(root, NULL) != NULL) { printf("failed: strdup on NULL should give NULL\n"); - return False; + return false; } p2 = talloc_strndup(p1, "foo", 2); if (strcmp("fo", p2) != 0) { printf("failed: strndup doesn't work\n"); - return False; + return false; } p2 = talloc_asprintf_append(p2, "o%c", 'd'); if (strcmp("food", p2) != 0) { printf("failed: talloc_asprintf_append doesn't work\n"); - return False; + return false; } CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(p1, 3); @@ -457,7 +447,7 @@ static BOOL test_misc(void) p2 = talloc_asprintf_append(NULL, "hello %s", "world"); if (strcmp("hello world", p2) != 0) { printf("failed: talloc_asprintf_append doesn't work\n"); - return False; + return false; } CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(p1, 3); @@ -466,13 +456,13 @@ static BOOL test_misc(void) d = talloc_array(p1, double, 0x20000000); if (d) { printf("failed: integer overflow not detected\n"); - return False; + return false; } d = talloc_realloc(p1, d, double, 0x20000000); if (d) { printf("failed: integer overflow not detected\n"); - return False; + return false; } talloc_free(p1); @@ -487,7 +477,7 @@ static BOOL test_misc(void) p2 = talloc_asprintf(p1, "my test '%s'", "string"); if (strcmp(p2, "my test 'string'") != 0) { printf("failed: talloc_asprintf(\"my test '%%s'\", \"string\") gave: \"%s\"\n", p2); - return False; + return false; } CHECK_BLOCKS(p1, 3); CHECK_SIZE(p2, 17); @@ -522,7 +512,7 @@ static BOOL test_misc(void) if (talloc_unlink(root, NULL) != -1) { printf("failed: talloc_unlink(root, NULL) == -1\n"); - return False; + return false; } talloc_report(root, stdout); @@ -537,14 +527,14 @@ static BOOL test_misc(void) talloc_enable_leak_report(); talloc_enable_leak_report_full(); - return True; + return true; } /* test realloc */ -static BOOL test_realloc(void) +static bool test_realloc(void) { void *root, *p1, *p2; @@ -576,7 +566,7 @@ static BOOL test_realloc(void) talloc_increase_ref_count(p2); if (talloc_realloc_size(NULL, p2, 5) != NULL) { printf("failed: talloc_realloc() on a referenced pointer should fail\n"); - return False; + return false; } CHECK_BLOCKS(p1, 4); @@ -586,7 +576,7 @@ static BOOL test_realloc(void) if (talloc_realloc_size(NULL, p1, 0x7fffffff) != NULL) { printf("failed: oversize talloc should fail\n"); - return False; + return false; } talloc_realloc_size(NULL, p1, 0); @@ -596,13 +586,13 @@ static BOOL test_realloc(void) talloc_free(root); - return True; + return true; } /* test realloc with a child */ -static BOOL test_realloc_child(void) +static bool test_realloc_child(void) { void *root; struct el2 { @@ -640,14 +630,14 @@ static BOOL test_realloc_child(void) talloc_free(root); - return True; + return true; } /* test type checking */ -static BOOL test_type(void) +static bool test_type(void) { void *root; struct el1 { @@ -668,27 +658,27 @@ static BOOL test_type(void) if (talloc_get_type(el1, struct el1) != el1) { printf("type check failed on el1\n"); - return False; + return false; } if (talloc_get_type(el1, struct el2) != NULL) { printf("type check failed on el1 with el2\n"); - return False; + return false; } talloc_set_type(el1, struct el2); if (talloc_get_type(el1, struct el2) != (struct el2 *)el1) { printf("type set failed on el1 with el2\n"); - return False; + return false; } talloc_free(root); - return True; + return true; } /* test steal */ -static BOOL test_steal(void) +static bool test_steal(void) { void *root, *p1, *p2; @@ -705,12 +695,12 @@ static BOOL test_steal(void) if (talloc_steal(p1, NULL) != NULL) { printf("failed: stealing NULL should give NULL\n"); - return False; + return false; } if (talloc_steal(p1, p1) != p1) { printf("failed: stealing to ourselves is a nop\n"); - return False; + return false; } CHECK_BLOCKS(root, 3); CHECK_SIZE(root, 30); @@ -737,13 +727,13 @@ static BOOL test_steal(void) CHECK_SIZE(NULL, 3); talloc_free(p1); - return True; + return true; } /* test talloc_realloc_fn */ -static BOOL test_realloc_fn(void) +static bool test_realloc_fn(void) { void *root, *p1; @@ -764,11 +754,11 @@ static BOOL test_realloc_fn(void) talloc_free(root); - return True; + return true; } -static BOOL test_unref_reparent(void) +static bool test_unref_reparent(void) { void *root, *p1, *p2, *c1; @@ -794,13 +784,13 @@ static BOOL test_unref_reparent(void) talloc_free(p2); talloc_free(root); - return True; + return true; } /* measure the speed of talloc versus malloc */ -static BOOL test_speed(void) +static bool test_speed(void) { void *ctx = talloc_new(NULL); unsigned count; @@ -838,11 +828,11 @@ static BOOL test_speed(void) printf("malloc: %.0f ops/sec\n", count/timeval_elapsed(&tv)); - return True; + return true; } -static BOOL test_lifeless(void) +static bool test_lifeless(void) { void *top = talloc_new(NULL); char *parent, *child; @@ -862,7 +852,7 @@ static BOOL test_lifeless(void) talloc_free(child_owner); talloc_free(child); - return True; + return true; } static int loop_destructor_count; @@ -874,7 +864,7 @@ static int test_loop_destructor(char *ptr) return 0; } -static BOOL test_loop(void) +static bool test_loop(void) { void *top = talloc_new(NULL); char *parent; @@ -897,11 +887,11 @@ static BOOL test_loop(void) if (loop_destructor_count != 1) { printf("FAILED TO FIRE LOOP DESTRUCTOR\n"); - return False; + return false; } loop_destructor_count = 0; - return True; + return true; } static int fail_destructor_str(char *ptr) @@ -909,7 +899,7 @@ static int fail_destructor_str(char *ptr) return -1; } -static BOOL test_free_parent_deny_child(void) +static bool test_free_parent_deny_child(void) { void *top = talloc_new(NULL); char *level1; @@ -929,12 +919,12 @@ static BOOL test_free_parent_deny_child(void) talloc_free(top); - return True; + return true; } -static BOOL test_talloc_ptrtype(void) +static bool test_talloc_ptrtype(void) { - BOOL ret = True; + bool ret = true; void *top = talloc_new(NULL); struct struct1 { int foo; @@ -953,13 +943,13 @@ static BOOL test_talloc_ptrtype(void) "(should be %lu)\n", __location__, (unsigned long)talloc_get_size(s1), (unsigned long)sizeof(struct struct1)); - ret = False; + ret = false; } if (strcmp(location1, talloc_get_name(s1)) != 0) { printf("%s: talloc_ptrtype() sets the wrong name '%s' (should be '%s')\n", __location__, talloc_get_name(s1), location1); - ret = False; + ret = false; } s2 = talloc_array_ptrtype(top, s2, 10);location2 = __location__; @@ -969,14 +959,14 @@ static BOOL test_talloc_ptrtype(void) "%lu (should be %lu)\n", __location__, (unsigned long)talloc_get_size(s2), (unsigned long)(sizeof(struct struct1)*10)); - ret = False; + ret = false; } if (strcmp(location2, talloc_get_name(s2)) != 0) { printf("%s: talloc_array_ptrtype() sets the wrong name '%s' (should be '%s')\n", __location__, talloc_get_name(s2), location2); - ret = False; + ret = false; } s3 = talloc_array_ptrtype(top, s3, 10);location3 = __location__; @@ -986,13 +976,13 @@ static BOOL test_talloc_ptrtype(void) "%lu (should be %lu)\n", __location__, (unsigned long)talloc_get_size(s3), (unsigned long)(sizeof(struct struct1 *)*10)); - ret = False; + ret = false; } if (strcmp(location3, talloc_get_name(s3)) != 0) { printf("%s: talloc_array_ptrtype() sets the wrong name '%s' (should be '%s')\n", __location__, talloc_get_name(s3), location3); - ret = False; + ret = false; } s4 = talloc_array_ptrtype(top, s4, 10);location4 = __location__; @@ -1002,13 +992,13 @@ static BOOL test_talloc_ptrtype(void) "%lu (should be %lu)\n", __location__, (unsigned long)talloc_get_size(s4), (unsigned long)(sizeof(struct struct1 **)*10)); - ret = False; + ret = false; } if (strcmp(location4, talloc_get_name(s4)) != 0) { printf("%s: talloc_array_ptrtype() sets the wrong name '%s' (should be '%s')\n", __location__, talloc_get_name(s4), location4); - ret = False; + ret = false; } talloc_free(top); @@ -1016,9 +1006,9 @@ static BOOL test_talloc_ptrtype(void) return ret; } -BOOL torture_local_talloc(struct torture_context *torture) +bool torture_local_talloc(struct torture_context *torture) { - BOOL ret = True; + bool ret = true; talloc_disable_null_tracking(); talloc_enable_null_tracking(); -- cgit From a46e12d0e07e1630f8ef15aff0f97cb2f1f4c273 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 7 Sep 2006 10:02:32 +0000 Subject: r18213: don't list LIBREPLACE depdendecies explicit and always at it as first private dependencies metze (This used to be commit 135d096776b53ae09ffc2b4f767dfbd18139570f) --- source4/lib/talloc/config.mk | 1 - 1 file changed, 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index dc523d4ede..3a8a22aa57 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -4,7 +4,6 @@ VERSION = 0.0.1 SO_VERSION = 0 OBJ_FILES = talloc.o -PUBLIC_DEPENDENCIES = LIBREPLACE MANPAGE = talloc.3 CFLAGS = -Ilib/talloc PUBLIC_HEADERS = talloc.h -- cgit From e6b457d55031f1987c8fa5719c5bbf46743281a0 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 9 Sep 2006 02:52:41 +0000 Subject: r18283: libreplace.m4 needs to be early in configure.ac in other packages too (This used to be commit 03f9c67c066d772d9a544f1183fbee609ab8137b) --- source4/lib/talloc/configure.ac | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/configure.ac b/source4/lib/talloc/configure.ac index a8b446169e..acde824b87 100644 --- a/source4/lib/talloc/configure.ac +++ b/source4/lib/talloc/configure.ac @@ -2,21 +2,16 @@ AC_PREREQ(2.50) AC_INIT(talloc.h) AC_CONFIG_SRCDIR([talloc.c]) AC_SUBST(datarootdir) -AC_PROG_CC -if test "x$GCC" = "xyes"; then - CFLAGS="$CFLAGS -Wall -W" -fi -AC_PROG_INSTALL +AC_CONFIG_HEADER(config.h) + +m4_include(libreplace.m4) +m4_include(libtalloc.m4) + AC_PATH_PROG(XSLTPROC,xsltproc) DOC_TARGET="" if test -n "$XSLTPROC"; then DOC_TARGET=doc fi AC_SUBST(DOC_TARGET) -AC_CONFIG_HEADER(config.h) -AC_SYS_LARGEFILE - -m4_include(libreplace.m4) -m4_include(libtalloc.m4) AC_OUTPUT(Makefile talloc.pc) -- cgit From 1a5978445199a1d8697a5604761899aa065059fe Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 13 Sep 2006 00:05:07 +0000 Subject: r18435: added a function talloc_move() which is like talloc_steal(), but is meant for moving pointers between structures. The difference is that talloc_move() will zero the source pointer, thus ensuring you don't reference the pointer in the old context. talloc_move() is appropriate in some, but not all cases where we use talloc_steal() now. The interface came out of a discussion with Jeremy. (This used to be commit 200756017e1867faa207703eddc00a75ae4527df) --- source4/lib/talloc/talloc.3.xml | 12 +++++++++++- source4/lib/talloc/talloc.c | 11 +++++++++++ source4/lib/talloc/talloc.h | 6 ++++-- source4/lib/talloc/testsuite.c | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 3 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.3.xml b/source4/lib/talloc/talloc.3.xml index a448e8d978..76b54ddb80 100644 --- a/source4/lib/talloc/talloc.3.xml +++ b/source4/lib/talloc/talloc.3.xml @@ -369,7 +369,7 @@ talloc_realloc(ctx, ptr, type, 0) ==> talloc_free(ptr); known so the type-safe talloc_realloc() cannot be used. - void *talloc_steal(const void *<emphasis role="italic">new_ctx</emphasis>, const void *<emphasis role="italic">ptr</emphasis>); + TYPE *talloc_steal(const void *<emphasis role="italic">new_ctx</emphasis>, const TYPE *<emphasis role="italic">ptr</emphasis>); The talloc_steal() function changes the parent context of a talloc pointer. It is typically used when the context that the @@ -387,6 +387,16 @@ talloc_realloc(ctx, ptr, type, 0) ==> talloc_free(ptr); data if you do this. + TYPE *talloc_move(const void *<emphasis role="italic">new_ctx</emphasis>, TYPE *<emphasis role="italic">ptr</emphasis>); + + The talloc_move() function is a wrapper around + talloc_steal() which zeros the source pointer after the + move. This avoids a potential source of bugs where a + programmer leaves a pointer in two structures, and uses the + pointer from the old structure after it has been moved to a + new one. + + size_t talloc_total_size(const void *<emphasis role="italic">ptr</emphasis>); The talloc_total_size() function returns the total size in bytes diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index d2f7a5d828..2b80594e80 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -737,6 +737,17 @@ void *_talloc_steal(const void *new_ctx, const void *ptr) return discard_const_p(void, ptr); } +/* + a wrapper around talloc_steal() for situations where you are moving a pointer + between two structures, and want the old pointer to be set to NULL +*/ +void *_talloc_move(const void *new_ctx, const void **pptr) +{ + void *ret = _talloc_steal(new_ctx, *pptr); + (*pptr) = NULL; + return ret; +} + /* return the total size of a talloc pool (subtree) */ diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index fdc0fd3494..b9ecd8f0b8 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -65,15 +65,16 @@ typedef void TALLOC_CTX; /* this extremely strange macro is to avoid some braindamaged warning stupidity in gcc 4.1.x */ #define talloc_steal(ctx, ptr) ({ _TALLOC_TYPEOF(ptr) __talloc_steal_ret = (_TALLOC_TYPEOF(ptr))_talloc_steal((ctx),(ptr)); __talloc_steal_ret; }) -#define talloc_reference(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_reference((ctx),(ptr)) #else #define talloc_set_destructor(ptr, function) \ _talloc_set_destructor((ptr), (int (*)(void *))(function)) #define _TALLOC_TYPEOF(ptr) void * #define talloc_steal(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_steal((ctx),(ptr)) -#define talloc_reference(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_reference((ctx),(ptr)) #endif +#define talloc_reference(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_reference((ctx),(ptr)) +#define talloc_move(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_move((ctx),&(ptr)) + /* useful macros for creating type checked pointers */ #define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) #define talloc_size(ctx, size) talloc_named_const(ctx, size, __location__) @@ -127,6 +128,7 @@ int talloc_free(void *ptr); void talloc_free_children(void *ptr); void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *name); void *_talloc_steal(const void *new_ctx, const void *ptr); +void *_talloc_move(const void *new_ctx, const void **pptr); size_t talloc_total_size(const void *ptr); size_t talloc_total_blocks(const void *ptr); void talloc_report_depth_cb(const void *ptr, int depth, int max_depth, diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 2faa6d64c4..38039c11bf 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -730,6 +730,40 @@ static bool test_steal(void) return true; } +/* + test move +*/ +static bool test_move(void) +{ + void *root; + struct t_move { + char *p; + int *x; + } *t1, *t2; + printf("TESTING MOVE\n"); + + root = talloc_new(NULL); + + t1 = talloc(root, struct t_move); + t2 = talloc(root, struct t_move); + t1->p = talloc_strdup(t1, "foo"); + t1->x = talloc(t1, int); + *t1->x = 42; + + t2->p = talloc_move(t2, t1->p); + t2->x = talloc_move(t2, t1->x); + if (t1->p != NULL || t1->x != NULL || + strcmp(t2->p, "foo") || + *t2->x != 42) { + printf("talloc move failed\n"); + return false; + } + + talloc_free(root); + + return true; +} + /* test talloc_realloc_fn */ @@ -1022,6 +1056,7 @@ bool torture_local_talloc(struct torture_context *torture) ret &= test_realloc(); ret &= test_realloc_child(); ret &= test_steal(); + ret &= test_move(); ret &= test_unref_reparent(); ret &= test_realloc_fn(); ret &= test_type(); -- cgit From 05cdd9ccafeeb384792b9ce7ca044bcec1bfc839 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 13 Sep 2006 02:33:51 +0000 Subject: r18439: 2nd try at a talloc_move() api. This type with the ** ptr interface exposed. Unfortunately this generates a large number of type punning warnings. We'll have to find some magic to hide those. (This used to be commit 254cbf09dee5a1e20c47e47a298f1a8d172b41b9) --- source4/lib/talloc/talloc.3.xml | 2 +- source4/lib/talloc/talloc.h | 2 +- source4/lib/talloc/testsuite.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.3.xml b/source4/lib/talloc/talloc.3.xml index 76b54ddb80..2400fef2dc 100644 --- a/source4/lib/talloc/talloc.3.xml +++ b/source4/lib/talloc/talloc.3.xml @@ -387,7 +387,7 @@ talloc_realloc(ctx, ptr, type, 0) ==> talloc_free(ptr); data if you do this. - TYPE *talloc_move(const void *<emphasis role="italic">new_ctx</emphasis>, TYPE *<emphasis role="italic">ptr</emphasis>); + TYPE *talloc_move(const void *<emphasis role="italic">new_ctx</emphasis>, TYPE **<emphasis role="italic">ptr</emphasis>); The talloc_move() function is a wrapper around talloc_steal() which zeros the source pointer after the diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index b9ecd8f0b8..56f9dbb21a 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -73,7 +73,7 @@ typedef void TALLOC_CTX; #endif #define talloc_reference(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_reference((ctx),(ptr)) -#define talloc_move(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_move((ctx),&(ptr)) +#define talloc_move(ctx, ptr) (_TALLOC_TYPEOF(*(ptr)))_talloc_move((ctx),(const void **)(ptr)) /* useful macros for creating type checked pointers */ #define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 38039c11bf..00ea212e58 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -750,8 +750,8 @@ static bool test_move(void) t1->x = talloc(t1, int); *t1->x = 42; - t2->p = talloc_move(t2, t1->p); - t2->x = talloc_move(t2, t1->x); + t2->p = talloc_move(t2, &t1->p); + t2->x = talloc_move(t2, &t1->x); if (t1->p != NULL || t1->x != NULL || strcmp(t2->p, "foo") || *t2->x != 42) { -- cgit From d08fb7b1cc39f4fa92045a4789fcf6182caba907 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 13 Sep 2006 16:51:45 +0000 Subject: r18485: include libreplace.m4 in the aclocal.m4 files and use the macros in configure.ac metze (This used to be commit 95d33e4d71b4c97af8413bcd136f393aa3e380dd) --- source4/lib/talloc/aclocal.m4 | 2 +- source4/lib/talloc/configure.ac | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/aclocal.m4 b/source4/lib/talloc/aclocal.m4 index 2a7ad94963..5605e476ba 100644 --- a/source4/lib/talloc/aclocal.m4 +++ b/source4/lib/talloc/aclocal.m4 @@ -1 +1 @@ -m4_include(libreplace_macros.m4) +m4_include(libreplace.m4) diff --git a/source4/lib/talloc/configure.ac b/source4/lib/talloc/configure.ac index acde824b87..51e7256bf8 100644 --- a/source4/lib/talloc/configure.ac +++ b/source4/lib/talloc/configure.ac @@ -4,7 +4,8 @@ AC_CONFIG_SRCDIR([talloc.c]) AC_SUBST(datarootdir) AC_CONFIG_HEADER(config.h) -m4_include(libreplace.m4) +AC_LIBREPLACE_ALL_CHECKS + m4_include(libtalloc.m4) AC_PATH_PROG(XSLTPROC,xsltproc) -- cgit From c902a8927c517f1d8c8c5e083db48fd797ece8f4 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 14 Sep 2006 12:18:44 +0000 Subject: r18521: implement volkers suggestion for avoiding the type punning warnings (This used to be commit 9b9f058edb033c999c4430add4f05459ac43c9e2) --- source4/lib/talloc/talloc.c | 3 ++- source4/lib/talloc/talloc.h | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 2b80594e80..d790c6c26b 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -741,8 +741,9 @@ void *_talloc_steal(const void *new_ctx, const void *ptr) a wrapper around talloc_steal() for situations where you are moving a pointer between two structures, and want the old pointer to be set to NULL */ -void *_talloc_move(const void *new_ctx, const void **pptr) +void *_talloc_move(const void *new_ctx, const void *_pptr) { + const void **pptr = (const void **)_pptr; void *ret = _talloc_steal(new_ctx, *pptr); (*pptr) = NULL; return ret; diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 56f9dbb21a..8b17eec03a 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -73,7 +73,7 @@ typedef void TALLOC_CTX; #endif #define talloc_reference(ctx, ptr) (_TALLOC_TYPEOF(ptr))_talloc_reference((ctx),(ptr)) -#define talloc_move(ctx, ptr) (_TALLOC_TYPEOF(*(ptr)))_talloc_move((ctx),(const void **)(ptr)) +#define talloc_move(ctx, ptr) (_TALLOC_TYPEOF(*(ptr)))_talloc_move((ctx),(void *)(ptr)) /* useful macros for creating type checked pointers */ #define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) @@ -128,7 +128,7 @@ int talloc_free(void *ptr); void talloc_free_children(void *ptr); void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *name); void *_talloc_steal(const void *new_ctx, const void *ptr); -void *_talloc_move(const void *new_ctx, const void **pptr); +void *_talloc_move(const void *new_ctx, const void *pptr); size_t talloc_total_size(const void *ptr); size_t talloc_total_blocks(const void *ptr); void talloc_report_depth_cb(const void *ptr, int depth, int max_depth, -- cgit From fafa8c3e47497a9f399e9ca52a7e6a904f1fb9f6 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 14 Sep 2006 18:46:10 +0000 Subject: r18535: move the AC_CANONICAL_HOST and host specific flag tests into libreplace. This should fix the standalone build of tdb on HPUX, where we need to blacklist mmap. Unfortunately this requires that we have a copy of config.guess and config.sub in each of our project subdirectories. I tried to find a way to use something like AC_CONFIG_AUX_DIR($libreplacedir) and just put config.{guess,sub} in the lib/replace/ directory, but I couldn't figure out how to do that in a way that kept autoconf happy for each of our separate builds. Any autoconf guru out there see a way to do this? (This used to be commit 823cd3ab35456769dcefee17bdaca21f01ba0f63) --- source4/lib/talloc/config.guess | 1466 ++++++++++++++++++++++++++++++++++++ source4/lib/talloc/config.sub | 1579 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 3045 insertions(+) create mode 100755 source4/lib/talloc/config.guess create mode 100755 source4/lib/talloc/config.sub (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.guess b/source4/lib/talloc/config.guess new file mode 100755 index 0000000000..ad5281e66e --- /dev/null +++ b/source4/lib/talloc/config.guess @@ -0,0 +1,1466 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + +timestamp='2005-08-03' + +# This file 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., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerppc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + x86:Interix*:[34]*) + echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' + exit ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #ifdef __INTEL_COMPILER + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + test x"${LIBC}" != x && { + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit + } + test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + *86) UNAME_PROCESSOR=i686 ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/source4/lib/talloc/config.sub b/source4/lib/talloc/config.sub new file mode 100755 index 0000000000..1c366dfde9 --- /dev/null +++ b/source4/lib/talloc/config.sub @@ -0,0 +1,1579 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + +timestamp='2005-07-08' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file 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., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ + kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | ms1 \ + | msp430 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m32c) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | ms1-* \ + | msp430-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + m32c-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16c) + basic_machine=cr16c-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: -- cgit From 182ab7107c13046c650f51c0a4a55955cc38fa24 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 14 Sep 2006 20:08:21 +0000 Subject: r18539: 'make distclean' should delete config.cache (This used to be commit 5a8becb1be1b41b4fecf9f9f47a60eed5f77c264) --- source4/lib/talloc/Makefile.in | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index 4effa96415..14e8115692 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -65,9 +65,7 @@ installcheck: distclean: clean rm -f *~ */*~ rm -f Makefile - rm -f config.log \ - config.status \ - config.h + rm -f config.log config.status config.h config.cache realdistclean: distclean rm -f configure config.h.in -- cgit From 550834c9df68377d1308084814870d45d65472df Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 17 Sep 2006 19:17:41 +0000 Subject: r18594: fail the configure step if the required library is not found for tdb, talloc or libreplace (This used to be commit 9f45f970f71ee5585bf3c924b9c77188405fa246) --- source4/lib/talloc/libtalloc.m4 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/libtalloc.m4 b/source4/lib/talloc/libtalloc.m4 index 14e92b212c..06d5a15ff4 100644 --- a/source4/lib/talloc/libtalloc.m4 +++ b/source4/lib/talloc/libtalloc.m4 @@ -1,13 +1,17 @@ dnl find the talloc sources. This is meant to work both for dnl talloc standalone builds, and builds of packages using talloc tallocdir="" -for d in "$srcdir" "$srcdir/lib/talloc" "$srcdir/talloc" "$srcdir/../talloc"; do +tallocpaths="$srcdir $srcdir/lib/talloc $srcdir/talloc $srcdir/../talloc" +for d in $tallocpaths; do if test -f "$d/talloc.c"; then tallocdir="$d" AC_SUBST(tallocdir) break; fi done +if [ x"$tallocdir" = "x" ]; then + AC_MSG_ERROR([cannot find talloc source in $tallocpaths]) +fi TALLOCOBJ="talloc.o" AC_SUBST(TALLOCOBJ) -- cgit From e84ee4a6fd3bb1cc0b92de89f4568e0865ccac0a Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 18 Sep 2006 01:31:57 +0000 Subject: r18600: - fix shell syntax in tests for libraries - add library test for libpopt (This used to be commit 13878b7e7ec65b21df954f83afc0e9ceb73e44a0) --- source4/lib/talloc/libtalloc.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/libtalloc.m4 b/source4/lib/talloc/libtalloc.m4 index 06d5a15ff4..4a0ee3c8fc 100644 --- a/source4/lib/talloc/libtalloc.m4 +++ b/source4/lib/talloc/libtalloc.m4 @@ -9,7 +9,7 @@ for d in $tallocpaths; do break; fi done -if [ x"$tallocdir" = "x" ]; then +if test x"$tallocdir" = "x"; then AC_MSG_ERROR([cannot find talloc source in $tallocpaths]) fi TALLOCOBJ="talloc.o" -- cgit From f96b8c5391c92491dd11167a041087e1bd56440b Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 18 Sep 2006 01:51:57 +0000 Subject: r18601: updated web page for new talloc build method (This used to be commit fbd8028080108cd920ee0a65bdb10de2eb419cde) --- source4/lib/talloc/web/index.html | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/web/index.html b/source4/lib/talloc/web/index.html index 2a6c2d0768..106920e8a5 100644 --- a/source4/lib/talloc/web/index.html +++ b/source4/lib/talloc/web/index.html @@ -29,12 +29,14 @@ svn. To fetch via svn use the following command:
   svn co svn://svnanon.samba.org/samba/branches/SAMBA_4_0/source/lib/talloc talloc
+  svn co svn://svnanon.samba.org/samba/branches/SAMBA_4_0/source/lib/replace libreplace
 
To fetch via rsync use this command:
   rsync -Pavz samba.org::ftp/unpacked/samba4/source/lib/talloc .
+  rsync -Pavz samba.org::ftp/unpacked/samba4/source/lib/libreplace .
 

-- cgit From ee97148354090aa63b99abc02fe2811bf18a549e Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 27 Sep 2006 06:48:24 +0000 Subject: r18946: fix compiler warning metze (This used to be commit 450595822441ebaa199d6b10d568274940b1a91b) --- source4/lib/talloc/talloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index d790c6c26b..58028a85b8 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -743,7 +743,7 @@ void *_talloc_steal(const void *new_ctx, const void *ptr) */ void *_talloc_move(const void *new_ctx, const void *_pptr) { - const void **pptr = (const void **)_pptr; + const void **pptr = discard_const_p(const void *,_pptr); void *ret = _talloc_steal(new_ctx, *pptr); (*pptr) = NULL; return ret; -- cgit From 4ccdd5370416a90088ad5a5879eca5f7cb1161a4 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 29 Sep 2006 10:50:12 +0000 Subject: r18995: - fix bug 4078 - talloc_free(talloc_autofree_context()); should not result in a SIGABORT on exit - add a test for this, but this test can also pass in the standalone build and samba3, as samba4 uses talloc_autofree_context() metze (This used to be commit 2be48c1b033dceb9517826054b8ea97df2c94472) --- source4/lib/talloc/talloc.c | 18 ++++++++++++------ source4/lib/talloc/testsuite.c | 31 +++++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 12 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 58028a85b8..15b27c61ee 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -82,7 +82,7 @@ NULL */ static void *null_context; -static void *cleanup_context; +static void *autofree_context; struct talloc_reference_handle { struct talloc_reference_handle *next, *prev; @@ -1208,10 +1208,15 @@ void *talloc_realloc_fn(const void *context, void *ptr, size_t size) } +static int talloc_autofree_destructor(void *ptr) +{ + autofree_context = NULL; + return 0; +} + static void talloc_autofree(void) { - talloc_free(cleanup_context); - cleanup_context = NULL; + talloc_free(autofree_context); } /* @@ -1220,11 +1225,12 @@ static void talloc_autofree(void) */ void *talloc_autofree_context(void) { - if (cleanup_context == NULL) { - cleanup_context = talloc_named_const(NULL, 0, "autofree_context"); + if (autofree_context == NULL) { + autofree_context = talloc_named_const(NULL, 0, "autofree_context"); + talloc_set_destructor(autofree_context, talloc_autofree_destructor); atexit(talloc_autofree); } - return cleanup_context; + return autofree_context; } size_t talloc_get_size(const void *context) diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 00ea212e58..70ee35cbef 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -24,10 +24,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifdef _SAMBA_BUILD_ -#include "version.h" -#endif /* _SAMBA_BUILD_ */ - #include "replace.h" #include "system/time.h" #include "talloc.h" @@ -48,7 +44,7 @@ static double timeval_elapsed(struct timeval *tv) (tv2.tv_usec - tv->tv_usec)*1.0e-6; } -#if SAMBA_VERSION_MAJOR==3 +#if _SAMBA_BUILD_==3 #ifdef malloc #undef malloc #endif @@ -1040,6 +1036,28 @@ static bool test_talloc_ptrtype(void) return ret; } +static bool test_autofree(void) +{ +#if _SAMBA_BUILD_>=4 + /* + * we can't run this inside smbtorture in samba4 + * as smbtorture uses talloc_autofree_context() + */ + printf("SKIPPING TALLOC AUTOFREE CONTEXT (not supported from smbtorture)\n"); +#else + void *p; + + printf("TESTING TALLOC AUTOFREE CONTEXT\n"); + + p = talloc_autofree_context(); + talloc_free(p); + + p = talloc_autofree_context(); + talloc_free(p); +#endif + return true; +} + bool torture_local_talloc(struct torture_context *torture) { bool ret = true; @@ -1067,13 +1085,14 @@ bool torture_local_talloc(struct torture_context *torture) if (ret) { ret &= test_speed(); } + ret &= test_autofree(); return ret; } -#if !defined(_SAMBA_BUILD_) || ((SAMBA_VERSION_MAJOR==3)&&(SAMBA_VERSION_MINOR<9)) +#if _SAMBA_BUILD_<4 int main(void) { if (!torture_local_talloc(NULL)) { -- cgit From 18278a5560db58d447f4b0a5701fefb70383a048 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Fri, 6 Oct 2006 09:26:29 +0000 Subject: r19118: get rid of a bunch of bool misuse warnings (This used to be commit e620f44643caf93a8bcb203a966c986c14a8dc0e) --- source4/lib/talloc/testsuite.c | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 70ee35cbef..1a2a60a3a3 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -1065,27 +1065,27 @@ bool torture_local_talloc(struct torture_context *torture) talloc_disable_null_tracking(); talloc_enable_null_tracking(); - ret &= test_ref1(); - ret &= test_ref2(); - ret &= test_ref3(); - ret &= test_ref4(); - ret &= test_unlink1(); - ret &= test_misc(); - ret &= test_realloc(); - ret &= test_realloc_child(); - ret &= test_steal(); - ret &= test_move(); - ret &= test_unref_reparent(); - ret &= test_realloc_fn(); - ret &= test_type(); - ret &= test_lifeless(); - ret &= test_loop(); - ret &= test_free_parent_deny_child(); - ret &= test_talloc_ptrtype(); + ret = ret && test_ref1(); + ret = ret && test_ref2(); + ret = ret && test_ref3(); + ret = ret && test_ref4(); + ret = ret && test_unlink1(); + ret = ret && test_misc(); + ret = ret && test_realloc(); + ret = ret && test_realloc_child(); + ret = ret && test_steal(); + ret = ret && test_move(); + ret = ret && test_unref_reparent(); + ret = ret && test_realloc_fn(); + ret = ret && test_type(); + ret = ret && test_lifeless(); + ret = ret && test_loop(); + ret = ret && test_free_parent_deny_child(); + ret = ret && test_talloc_ptrtype(); if (ret) { - ret &= test_speed(); + ret = ret && test_speed(); } - ret &= test_autofree(); + ret = ret && test_autofree(); return ret; } -- cgit From 666a72e39a09d820284bedccc6c5fe712c2e6f08 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Mon, 16 Oct 2006 01:00:47 +0000 Subject: r19304: If you really want to look at the contents undef this one (This used to be commit fe20ac404d654abe31729664584391f3b3cd0214) --- source4/lib/talloc/talloc.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 15b27c61ee..87b4d51ba4 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -886,6 +886,23 @@ static void talloc_report_depth_FILE_helper(const void *ptr, int depth, int max_ (unsigned long)talloc_total_size(ptr), (unsigned long)talloc_total_blocks(ptr), (int)talloc_reference_count(ptr)); + +#if 0 + fprintf(f, "content: "); + if (talloc_total_size(ptr)) { + int tot = talloc_total_size(ptr); + int i; + + for (i = 0; i < tot; i++) { + if ((((char *)ptr)[i] > 31) && (((char *)ptr)[i] < 126)) { + fprintf(f, "%c", ((char *)ptr)[i]); + } else { + fprintf(f, "~%02x", ((char *)ptr)[i]); + } + } + } + fprintf(f, "\n"); +#endif } /* -- cgit From 8773e743c518578584d07d35ffdafdd598af88b0 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 16 Oct 2006 13:06:41 +0000 Subject: r19339: Merge my 4.0-unittest branch. This adds an API for more fine-grained output in the testsuite rather than just True or False for a set of tests. The aim is to use this for: * known failure lists (run all tests and detect tests that started working or started failing). This would allow us to get rid of the RPC-SAMBA3-* tests * nicer torture output * simplification of the testsuite system * compatibility with other unit testing systems * easier usage of smbtorture (being able to run one test and automatically set up the environment for that) This is still a work-in-progress; expect more updates over the next couple of days. (This used to be commit 0eb6097305776325c75081356309115f445a7218) --- source4/lib/talloc/testsuite.c | 499 ++++++++++++++++------------------------- 1 file changed, 195 insertions(+), 304 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 1a2a60a3a3..f2e61157e4 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -27,8 +27,17 @@ #include "replace.h" #include "system/time.h" #include "talloc.h" +#ifdef _SAMBA_BUILD_ +#include "includes.h" +#include "torture/ui.h" +#else +#define torture_comment printf +#define torture_assert(tctx, expr, str) if (!(expr)) { printf str; return false; } +#define torture_suite_add_simple_tcase(suite,name,fn) \ + ret &= printf("TESTING %s\n", name), fn(); +#define torture_out stdout -struct torture_context; +struct torture_suite; static struct timeval timeval_current(void) { @@ -43,6 +52,7 @@ static double timeval_elapsed(struct timeval *tv) return (tv2.tv_sec - tv->tv_sec) + (tv2.tv_usec - tv->tv_usec)*1.0e-6; } +#endif /* _SAMBA_BUILD_ */ #if _SAMBA_BUILD_==3 #ifdef malloc @@ -55,10 +65,10 @@ static double timeval_elapsed(struct timeval *tv) #define CHECK_SIZE(ptr, tsize) do { \ if (talloc_total_size(ptr) != (tsize)) { \ - printf(__location__ " failed: wrong '%s' tree size: got %u expected %u\n", \ + torture_comment(tctx, talloc_asprintf(tctx, "failed: wrong '%s' tree size: got %u expected %u\n", \ #ptr, \ (unsigned)talloc_total_size(ptr), \ - (unsigned)tsize); \ + (unsigned)tsize)); \ talloc_report_full(ptr, stdout); \ return false; \ } \ @@ -66,10 +76,10 @@ static double timeval_elapsed(struct timeval *tv) #define CHECK_BLOCKS(ptr, tblocks) do { \ if (talloc_total_blocks(ptr) != (tblocks)) { \ - printf(__location__ " failed: wrong '%s' tree blocks: got %u expected %u\n", \ + torture_comment(tctx, talloc_asprintf(tctx, "failed: wrong '%s' tree blocks: got %u expected %u\n", \ #ptr, \ (unsigned)talloc_total_blocks(ptr), \ - (unsigned)tblocks); \ + (unsigned)tblocks)); \ talloc_report_full(ptr, stdout); \ return false; \ } \ @@ -77,10 +87,10 @@ static double timeval_elapsed(struct timeval *tv) #define CHECK_PARENT(ptr, parent) do { \ if (talloc_parent(ptr) != (parent)) { \ - printf(__location__ " failed: '%s' has wrong parent: got %p expected %p\n", \ + torture_comment(tctx, talloc_asprintf(tctx, "failed: '%s' has wrong parent: got %p expected %p\n", \ #ptr, \ talloc_parent(ptr), \ - (parent)); \ + (parent))); \ talloc_report_full(ptr, stdout); \ talloc_report_full(parent, stdout); \ talloc_report_full(NULL, stdout); \ @@ -92,12 +102,10 @@ static double timeval_elapsed(struct timeval *tv) /* test references */ -static bool test_ref1(void) +static bool test_ref1(struct torture_context *tctx) { void *root, *p1, *p2, *ref, *r1; - printf("TESTING SINGLE REFERENCE FREE\n"); - root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); p2 = talloc_named_const(p1, 1, "p2"); @@ -107,31 +115,31 @@ static bool test_ref1(void) r1 = talloc_named_const(root, 1, "r1"); ref = talloc_reference(r1, p2); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_BLOCKS(p1, 5); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(r1, 2); - printf("Freeing p2\n"); + torture_comment(tctx, "Freeing p2\n"); talloc_free(p2); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_BLOCKS(p1, 5); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(r1, 1); - printf("Freeing p1\n"); + torture_comment(tctx, "Freeing p1\n"); talloc_free(p1); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_BLOCKS(r1, 1); - printf("Freeing r1\n"); + torture_comment(tctx, "Freeing r1\n"); talloc_free(r1); - talloc_report_full(NULL, stdout); + talloc_report_full(NULL, torture_out); - printf("Testing NULL\n"); + torture_comment(tctx, "Testing NULL\n"); if (talloc_reference(root, NULL)) { return false; } @@ -141,19 +149,16 @@ static bool test_ref1(void) CHECK_SIZE(root, 0); talloc_free(root); - return true; } /* test references */ -static bool test_ref2(void) +static bool test_ref2(struct torture_context *tctx) { void *root, *p1, *p2, *ref, *r1; - printf("TESTING DOUBLE REFERENCE FREE\n"); - root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); talloc_named_const(p1, 1, "x1"); @@ -163,91 +168,85 @@ static bool test_ref2(void) r1 = talloc_named_const(root, 1, "r1"); ref = talloc_reference(r1, p2); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_BLOCKS(p1, 5); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(r1, 2); - printf("Freeing ref\n"); + torture_comment(tctx, "Freeing ref\n"); talloc_free(ref); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_BLOCKS(p1, 5); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(r1, 1); - printf("Freeing p2\n"); + torture_comment(tctx, "Freeing p2\n"); talloc_free(p2); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_BLOCKS(p1, 4); CHECK_BLOCKS(r1, 1); - printf("Freeing p1\n"); + torture_comment(tctx, "Freeing p1\n"); talloc_free(p1); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_BLOCKS(r1, 1); - printf("Freeing r1\n"); + torture_comment(tctx, "Freeing r1\n"); talloc_free(r1); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_SIZE(root, 0); talloc_free(root); - return true; } /* test references */ -static bool test_ref3(void) +static bool test_ref3(struct torture_context *tctx) { void *root, *p1, *p2, *ref, *r1; - printf("TESTING PARENT REFERENCE FREE\n"); - root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); p2 = talloc_named_const(root, 1, "p2"); r1 = talloc_named_const(p1, 1, "r1"); ref = talloc_reference(p2, r1); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_BLOCKS(p1, 2); CHECK_BLOCKS(p2, 2); CHECK_BLOCKS(r1, 1); - printf("Freeing p1\n"); + torture_comment(tctx, "Freeing p1\n"); talloc_free(p1); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_BLOCKS(p2, 2); CHECK_BLOCKS(r1, 1); - printf("Freeing p2\n"); + torture_comment(tctx, "Freeing p2\n"); talloc_free(p2); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_SIZE(root, 0); talloc_free(root); - return true; } /* test references */ -static bool test_ref4(void) +static bool test_ref4(struct torture_context *tctx) { void *root, *p1, *p2, *ref, *r1; - printf("TESTING REFERRER REFERENCE FREE\n"); - root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); talloc_named_const(p1, 1, "x1"); @@ -257,33 +256,32 @@ static bool test_ref4(void) r1 = talloc_named_const(root, 1, "r1"); ref = talloc_reference(r1, p2); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_BLOCKS(p1, 5); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(r1, 2); - printf("Freeing r1\n"); + torture_comment(tctx, "Freeing r1\n"); talloc_free(r1); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_BLOCKS(p1, 5); CHECK_BLOCKS(p2, 1); - printf("Freeing p2\n"); + torture_comment(tctx, "Freeing p2\n"); talloc_free(p2); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_BLOCKS(p1, 4); - printf("Freeing p1\n"); + torture_comment(tctx, "Freeing p1\n"); talloc_free(p1); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_SIZE(root, 0); talloc_free(root); - return true; } @@ -291,12 +289,10 @@ static bool test_ref4(void) /* test references */ -static bool test_unlink1(void) +static bool test_unlink1(struct torture_context *tctx) { void *root, *p1, *p2, *ref, *r1; - printf("TESTING UNLINK\n"); - root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); talloc_named_const(p1, 1, "x1"); @@ -306,28 +302,27 @@ static bool test_unlink1(void) r1 = talloc_named_const(p1, 1, "r1"); ref = talloc_reference(r1, p2); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_BLOCKS(p1, 7); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(r1, 2); - printf("Unreferencing r1\n"); + torture_comment(tctx, "Unreferencing r1\n"); talloc_unlink(r1, p2); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_BLOCKS(p1, 6); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(r1, 1); - printf("Freeing p1\n"); + torture_comment(tctx, "Freeing p1\n"); talloc_free(p1); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_SIZE(root, 0); talloc_free(root); - return true; } @@ -339,22 +334,17 @@ static int fail_destructor(void *ptr) /* miscellaneous tests to try to get a higher test coverage percentage */ -static bool test_misc(void) +static bool test_misc(struct torture_context *tctx) { void *root, *p1; char *p2; double *d; const char *name; - printf("TESTING MISCELLANEOUS\n"); - root = talloc_new(NULL); p1 = talloc_size(root, 0x7fffffff); - if (p1) { - printf("failed: large talloc allowed\n"); - return false; - } + torture_assert(tctx, !p1, "failed: large talloc allowed\n"); p1 = talloc_strdup(root, "foo"); talloc_increase_ref_count(p1); @@ -369,97 +359,65 @@ static bool test_misc(void) CHECK_BLOCKS(p1, 1); CHECK_BLOCKS(root, 2); p2 = talloc_strdup(p1, "foo"); - if (talloc_unlink(root, p2) != -1) { - printf("failed: talloc_unlink() of non-reference context should return -1\n"); - return false; - } - if (talloc_unlink(p1, p2) != 0) { - printf("failed: talloc_unlink() of parent should succeed\n"); - return false; - } + torture_assert(tctx, talloc_unlink(root, p2) == -1, + "failed: talloc_unlink() of non-reference context should return -1\n"); + torture_assert(tctx, talloc_unlink(p1, p2) == 0, + "failed: talloc_unlink() of parent should succeed\n"); talloc_free(p1); CHECK_BLOCKS(p1, 1); CHECK_BLOCKS(root, 2); name = talloc_set_name(p1, "my name is %s", "foo"); - if (strcmp(talloc_get_name(p1), "my name is foo") != 0) { - printf("failed: wrong name after talloc_set_name(my name is foo) - '%s'=>'%s'\n", - (name?name:"NULL"), talloc_get_name(p1)); - return false; - } + torture_assert_str_equal(tctx, talloc_get_name(p1), "my name is foo", + "failed: wrong name after talloc_set_name(my name is foo)"); CHECK_BLOCKS(p1, 2); CHECK_BLOCKS(root, 3); talloc_set_name_const(p1, NULL); - if (strcmp(talloc_get_name(p1), "UNNAMED") != 0) { - printf("failed: wrong name after talloc_set_name(NULL) - '%s'\n", - talloc_get_name(p1)); - return false; - } + torture_assert_str_equal (tctx, talloc_get_name(p1), "UNNAMED", + "failed: wrong name after talloc_set_name(NULL)"); CHECK_BLOCKS(p1, 2); CHECK_BLOCKS(root, 3); - if (talloc_free(NULL) != -1) { - printf("talloc_free(NULL) should give -1\n"); - return false; - } + torture_assert(tctx, talloc_free(NULL) == -1, + "talloc_free(NULL) should give -1\n"); talloc_set_destructor(p1, fail_destructor); - if (talloc_free(p1) != -1) { - printf("Failed destructor should cause talloc_free to fail\n"); - return false; - } + torture_assert(tctx, talloc_free(p1) == -1, + "Failed destructor should cause talloc_free to fail\n"); talloc_set_destructor(p1, NULL); - talloc_report(root, stdout); + talloc_report(root, torture_out); p2 = (char *)talloc_zero_size(p1, 20); - if (p2[19] != 0) { - printf("Failed to give zero memory\n"); - return false; - } + torture_assert(tctx, p2[19] == 0, "Failed to give zero memory\n"); talloc_free(p2); - if (talloc_strdup(root, NULL) != NULL) { - printf("failed: strdup on NULL should give NULL\n"); - return false; - } + torture_assert(tctx, talloc_strdup(root, NULL) == NULL, + "failed: strdup on NULL should give NULL\n"); p2 = talloc_strndup(p1, "foo", 2); - if (strcmp("fo", p2) != 0) { - printf("failed: strndup doesn't work\n"); - return false; - } + torture_assert(tctx, strcmp("fo", p2) == 0, "failed: strndup doesn't work\n"); p2 = talloc_asprintf_append(p2, "o%c", 'd'); - if (strcmp("food", p2) != 0) { - printf("failed: talloc_asprintf_append doesn't work\n"); - return false; - } + torture_assert(tctx, strcmp("food", p2) == 0, + "failed: talloc_asprintf_append doesn't work\n"); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(p1, 3); p2 = talloc_asprintf_append(NULL, "hello %s", "world"); - if (strcmp("hello world", p2) != 0) { - printf("failed: talloc_asprintf_append doesn't work\n"); - return false; - } + torture_assert(tctx, strcmp("hello world", p2) == 0, + "failed: talloc_asprintf_append doesn't work\n"); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(p1, 3); talloc_free(p2); d = talloc_array(p1, double, 0x20000000); - if (d) { - printf("failed: integer overflow not detected\n"); - return false; - } + torture_assert(tctx, !d, "failed: integer overflow not detected\n"); d = talloc_realloc(p1, d, double, 0x20000000); - if (d) { - printf("failed: integer overflow not detected\n"); - return false; - } + torture_assert(tctx, !d, "failed: integer overflow not detected\n"); talloc_free(p1); CHECK_BLOCKS(root, 1); @@ -471,10 +429,8 @@ static bool test_misc(void) p1 = talloc_init("%d bytes", 200); p2 = talloc_asprintf(p1, "my test '%s'", "string"); - if (strcmp(p2, "my test 'string'") != 0) { - printf("failed: talloc_asprintf(\"my test '%%s'\", \"string\") gave: \"%s\"\n", p2); - return false; - } + torture_assert_str_equal(tctx, p2, "my test 'string'", + "failed: talloc_asprintf(\"my test '%%s'\", \"string\") gave: \"%s\""); CHECK_BLOCKS(p1, 3); CHECK_SIZE(p2, 17); CHECK_BLOCKS(root, 1); @@ -483,9 +439,9 @@ static bool test_misc(void) p1 = talloc_named_const(root, 10, "p1"); p2 = (char *)talloc_named_const(root, 20, "p2"); (void)talloc_reference(p1, p2); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); talloc_unlink(root, p2); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(p1, 2); CHECK_BLOCKS(root, 3); @@ -495,9 +451,9 @@ static bool test_misc(void) p1 = talloc_named_const(root, 10, "p1"); p2 = (char *)talloc_named_const(root, 20, "p2"); (void)talloc_reference(NULL, p2); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); talloc_unlink(root, p2); - talloc_report_full(root, stdout); + talloc_report_full(root, torture_out); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(p1, 1); CHECK_BLOCKS(root, 2); @@ -506,13 +462,11 @@ static bool test_misc(void) /* Test that talloc_unlink is a no-op */ - if (talloc_unlink(root, NULL) != -1) { - printf("failed: talloc_unlink(root, NULL) == -1\n"); - return false; - } + torture_assert(tctx, talloc_unlink(root, NULL) == -1, + "failed: talloc_unlink(root, NULL) == -1\n"); - talloc_report(root, stdout); - talloc_report(NULL, stdout); + talloc_report(root, torture_out); + talloc_report(NULL, torture_out); CHECK_SIZE(root, 0); @@ -522,7 +476,6 @@ static bool test_misc(void) talloc_enable_leak_report(); talloc_enable_leak_report_full(); - return true; } @@ -530,12 +483,10 @@ static bool test_misc(void) /* test realloc */ -static bool test_realloc(void) +static bool test_realloc(struct torture_context *tctx) { void *root, *p1, *p2; - printf("TESTING REALLOC\n"); - root = talloc_new(NULL); p1 = talloc_size(root, 10); @@ -560,20 +511,16 @@ static bool test_realloc(void) CHECK_SIZE(p1, 60); talloc_increase_ref_count(p2); - if (talloc_realloc_size(NULL, p2, 5) != NULL) { - printf("failed: talloc_realloc() on a referenced pointer should fail\n"); - return false; - } + torture_assert(tctx, talloc_realloc_size(NULL, p2, 5) == NULL, + "failed: talloc_realloc() on a referenced pointer should fail\n"); CHECK_BLOCKS(p1, 4); talloc_realloc_size(NULL, p2, 0); talloc_realloc_size(NULL, p2, 0); CHECK_BLOCKS(p1, 3); - if (talloc_realloc_size(NULL, p1, 0x7fffffff) != NULL) { - printf("failed: oversize talloc should fail\n"); - return false; - } + torture_assert(tctx, talloc_realloc_size(NULL, p1, 0x7fffffff) == NULL, + "failed: oversize talloc should fail\n"); talloc_realloc_size(NULL, p1, 0); @@ -581,14 +528,13 @@ static bool test_realloc(void) CHECK_SIZE(root, 0); talloc_free(root); - return true; } /* test realloc with a child */ -static bool test_realloc_child(void) +static bool test_realloc_child(struct torture_context *tctx) { void *root; struct el2 { @@ -599,8 +545,6 @@ static bool test_realloc_child(void) struct el2 **list, **list2, **list3; } *el1; - printf("TESTING REALLOC WITH CHILD\n"); - root = talloc_new(NULL); el1 = talloc(root, struct el1); @@ -625,15 +569,13 @@ static bool test_realloc_child(void) el1->list3 = talloc_realloc(el1, el1->list3, struct el2 *, 300); talloc_free(root); - return true; } - /* test type checking */ -static bool test_type(void) +static bool test_type(struct torture_context *tctx) { void *root; struct el1 { @@ -644,42 +586,31 @@ static bool test_type(void) }; struct el1 *el1; - printf("TESTING talloc type checking\n"); - root = talloc_new(NULL); el1 = talloc(root, struct el1); el1->count = 1; - if (talloc_get_type(el1, struct el1) != el1) { - printf("type check failed on el1\n"); - return false; - } - if (talloc_get_type(el1, struct el2) != NULL) { - printf("type check failed on el1 with el2\n"); - return false; - } + torture_assert(tctx, talloc_get_type(el1, struct el1) == el1, + "type check failed on el1\n"); + torture_assert(tctx, talloc_get_type(el1, struct el2) == NULL, + "type check failed on el1 with el2\n"); talloc_set_type(el1, struct el2); - if (talloc_get_type(el1, struct el2) != (struct el2 *)el1) { - printf("type set failed on el1 with el2\n"); - return false; - } + torture_assert(tctx, talloc_get_type(el1, struct el2) == (struct el2 *)el1, + "type set failed on el1 with el2\n"); talloc_free(root); - return true; } /* test steal */ -static bool test_steal(void) +static bool test_steal(struct torture_context *tctx) { void *root, *p1, *p2; - printf("TESTING STEAL\n"); - root = talloc_new(NULL); p1 = talloc_array(root, char, 10); @@ -689,15 +620,11 @@ static bool test_steal(void) CHECK_SIZE(p1, 10); CHECK_SIZE(root, 30); - if (talloc_steal(p1, NULL) != NULL) { - printf("failed: stealing NULL should give NULL\n"); - return false; - } + torture_assert(tctx, talloc_steal(p1, NULL) == NULL, + "failed: stealing NULL should give NULL\n"); - if (talloc_steal(p1, p1) != p1) { - printf("failed: stealing to ourselves is a nop\n"); - return false; - } + torture_assert(tctx, talloc_steal(p1, p1) == p1, + "failed: stealing to ourselves is a nop\n"); CHECK_BLOCKS(root, 3); CHECK_SIZE(root, 30); @@ -719,24 +646,22 @@ static bool test_steal(void) talloc_free(root); p1 = talloc_size(NULL, 3); - talloc_report_full(NULL, stdout); + talloc_report_full(NULL, torture_out); CHECK_SIZE(NULL, 3); talloc_free(p1); - return true; } /* test move */ -static bool test_move(void) +static bool test_move(struct torture_context *tctx) { void *root; struct t_move { char *p; int *x; } *t1, *t2; - printf("TESTING MOVE\n"); root = talloc_new(NULL); @@ -748,12 +673,9 @@ static bool test_move(void) t2->p = talloc_move(t2, &t1->p); t2->x = talloc_move(t2, &t1->x); - if (t1->p != NULL || t1->x != NULL || - strcmp(t2->p, "foo") || - *t2->x != 42) { - printf("talloc move failed\n"); - return false; - } + torture_assert(tctx, t1->p == NULL && t1->x == NULL && + strcmp(t2->p, "foo") == 0 && *t2->x == 42, + "talloc move failed"); talloc_free(root); @@ -763,12 +685,10 @@ static bool test_move(void) /* test talloc_realloc_fn */ -static bool test_realloc_fn(void) +static bool test_realloc_fn(struct torture_context *tctx) { void *root, *p1; - printf("TESTING talloc_realloc_fn\n"); - root = talloc_new(NULL); p1 = talloc_realloc_fn(root, NULL, 10); @@ -782,18 +702,14 @@ static bool test_realloc_fn(void) CHECK_SIZE(root, 0); talloc_free(root); - - return true; } -static bool test_unref_reparent(void) +static bool test_unref_reparent(struct torture_context *tctx) { void *root, *p1, *p2, *c1; - printf("TESTING UNREFERENCE AFTER PARENT FREED\n"); - root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "orig parent"); p2 = talloc_named_const(root, 1, "parent by reference"); @@ -813,21 +729,18 @@ static bool test_unref_reparent(void) talloc_free(p2); talloc_free(root); - return true; } /* measure the speed of talloc versus malloc */ -static bool test_speed(void) +static bool test_speed(struct torture_context *tctx) { void *ctx = talloc_new(NULL); unsigned count; struct timeval tv; - printf("MEASURING TALLOC VS MALLOC SPEED\n"); - tv = timeval_current(); count = 0; do { @@ -839,7 +752,7 @@ static bool test_speed(void) count += 3; } while (timeval_elapsed(&tv) < 5.0); - printf("talloc: %.0f ops/sec\n", count/timeval_elapsed(&tv)); + torture_comment(tctx, talloc_asprintf(tctx, "talloc: %.0f ops/sec\n", count/timeval_elapsed(&tv))); talloc_free(ctx); @@ -856,32 +769,27 @@ static bool test_speed(void) count += 3; } while (timeval_elapsed(&tv) < 5.0); - printf("malloc: %.0f ops/sec\n", count/timeval_elapsed(&tv)); - - return true; + torture_comment(tctx, talloc_asprintf(tctx, "malloc: %.0f ops/sec\n", count/timeval_elapsed(&tv))); + return true; } - -static bool test_lifeless(void) +static bool test_lifeless(struct torture_context *tctx) { void *top = talloc_new(NULL); char *parent, *child; void *child_owner = talloc_new(NULL); - printf("TESTING TALLOC_UNLINK LOOP\n"); - parent = talloc_strdup(top, "parent"); child = talloc_strdup(parent, "child"); (void)talloc_reference(child, parent); (void)talloc_reference(child_owner, child); - talloc_report_full(top, stdout); + talloc_report_full(top, torture_out); talloc_unlink(top, parent); talloc_free(child); - talloc_report_full(top, stdout); + talloc_report_full(top, torture_out); talloc_free(top); talloc_free(child_owner); talloc_free(child); - return true; } @@ -889,12 +797,11 @@ static int loop_destructor_count; static int test_loop_destructor(char *ptr) { - printf("loop destructor\n"); loop_destructor_count++; return 0; } -static bool test_loop(void) +static bool test_loop(struct torture_context *tctx) { void *top = talloc_new(NULL); char *parent; @@ -902,25 +809,21 @@ static bool test_loop(void) char *req2, *req3; } *req1; - printf("TESTING TALLOC LOOP DESTRUCTION\n"); parent = talloc_strdup(top, "parent"); req1 = talloc(parent, struct req1); req1->req2 = talloc_strdup(req1, "req2"); talloc_set_destructor(req1->req2, test_loop_destructor); req1->req3 = talloc_strdup(req1, "req3"); (void)talloc_reference(req1->req3, req1); - talloc_report_full(top, stdout); + talloc_report_full(top, torture_out); talloc_free(parent); - talloc_report_full(top, stdout); - talloc_report_full(NULL, stdout); + talloc_report_full(top, torture_out); + talloc_report_full(NULL, torture_out); talloc_free(top); - if (loop_destructor_count != 1) { - printf("FAILED TO FIRE LOOP DESTRUCTOR\n"); - return false; - } + torture_assert(tctx, loop_destructor_count == 1, + "FAILED TO FIRE LOOP DESTRUCTOR\n"); loop_destructor_count = 0; - return true; } @@ -929,14 +832,13 @@ static int fail_destructor_str(char *ptr) return -1; } -static bool test_free_parent_deny_child(void) +static bool test_free_parent_deny_child(struct torture_context *tctx) { void *top = talloc_new(NULL); char *level1; char *level2; char *level3; - printf("TESTING TALLOC FREE PARENT DENY CHILD\n"); level1 = talloc_strdup(top, "level1"); level2 = talloc_strdup(level1, "level2"); level3 = talloc_strdup(level2, "level3"); @@ -948,13 +850,11 @@ static bool test_free_parent_deny_child(void) CHECK_PARENT(level3, top); talloc_free(top); - return true; } -static bool test_talloc_ptrtype(void) +static bool test_talloc_ptrtype(struct torture_context *tctx) { - bool ret = true; void *top = talloc_new(NULL); struct struct1 { int foo; @@ -965,90 +865,73 @@ static bool test_talloc_ptrtype(void) const char *location3; const char *location4; - printf("TESTING TALLOC PTRTYPE\n"); s1 = talloc_ptrtype(top, s1);location1 = __location__; - if (talloc_get_size(s1) != sizeof(struct struct1)) { - printf("%s: talloc_ptrtype() allocated the wrong size %lu " - "(should be %lu)\n", - __location__, (unsigned long)talloc_get_size(s1), - (unsigned long)sizeof(struct struct1)); - ret = false; - } + torture_assert(tctx, talloc_get_size(s1) == sizeof(struct struct1), + talloc_asprintf(tctx, + "talloc_ptrtype() allocated the wrong size %lu " + "(should be %lu)\n", (unsigned long)talloc_get_size(s1), + (unsigned long)sizeof(struct struct1))); - if (strcmp(location1, talloc_get_name(s1)) != 0) { - printf("%s: talloc_ptrtype() sets the wrong name '%s' (should be '%s')\n", - __location__, talloc_get_name(s1), location1); - ret = false; - } + torture_assert(tctx, strcmp(location1, talloc_get_name(s1)) == 0, + talloc_asprintf(tctx, + "talloc_ptrtype() sets the wrong name '%s' (should be '%s')\n", + talloc_get_name(s1), location1)); s2 = talloc_array_ptrtype(top, s2, 10);location2 = __location__; - if (talloc_get_size(s2) != (sizeof(struct struct1) * 10)) { - printf("%s: talloc_array_ptrtype() allocated the wrong size " + torture_assert(tctx, talloc_get_size(s2) == (sizeof(struct struct1) * 10), + talloc_asprintf(tctx, + "talloc_array_ptrtype() allocated the wrong size " "%lu (should be %lu)\n", - __location__, (unsigned long)talloc_get_size(s2), - (unsigned long)(sizeof(struct struct1)*10)); - ret = false; - } + (unsigned long)talloc_get_size(s2), + (unsigned long)(sizeof(struct struct1)*10))); - if (strcmp(location2, talloc_get_name(s2)) != 0) { - printf("%s: talloc_array_ptrtype() sets the wrong name '%s' (should be '%s')\n", - __location__, talloc_get_name(s2), - location2); - ret = false; - } + torture_assert(tctx, strcmp(location2, talloc_get_name(s2)) == 0, + talloc_asprintf(tctx, + "talloc_array_ptrtype() sets the wrong name '%s' (should be '%s')\n", + talloc_get_name(s2), location2)); s3 = talloc_array_ptrtype(top, s3, 10);location3 = __location__; - if (talloc_get_size(s3) != (sizeof(struct struct1 *) * 10)) { - printf("%s: talloc_array_ptrtype() allocated the wrong size " + torture_assert(tctx, talloc_get_size(s3) == (sizeof(struct struct1 *) * 10), + talloc_asprintf(tctx, + "talloc_array_ptrtype() allocated the wrong size " "%lu (should be %lu)\n", - __location__, (unsigned long)talloc_get_size(s3), - (unsigned long)(sizeof(struct struct1 *)*10)); - ret = false; - } + (unsigned long)talloc_get_size(s3), + (unsigned long)(sizeof(struct struct1 *)*10))); - if (strcmp(location3, talloc_get_name(s3)) != 0) { - printf("%s: talloc_array_ptrtype() sets the wrong name '%s' (should be '%s')\n", - __location__, talloc_get_name(s3), location3); - ret = false; - } + torture_assert_str_equal(tctx, location3, talloc_get_name(s3), + "talloc_array_ptrtype() sets the wrong name"); s4 = talloc_array_ptrtype(top, s4, 10);location4 = __location__; - if (talloc_get_size(s4) != (sizeof(struct struct1 **) * 10)) { - printf("%s: talloc_array_ptrtype() allocated the wrong size " + torture_assert(tctx, talloc_get_size(s4) == (sizeof(struct struct1 **) * 10), + talloc_asprintf(tctx, + "talloc_array_ptrtype() allocated the wrong size " "%lu (should be %lu)\n", - __location__, (unsigned long)talloc_get_size(s4), - (unsigned long)(sizeof(struct struct1 **)*10)); - ret = false; - } + (unsigned long)talloc_get_size(s4), + (unsigned long)(sizeof(struct struct1 **)*10))); - if (strcmp(location4, talloc_get_name(s4)) != 0) { - printf("%s: talloc_array_ptrtype() sets the wrong name '%s' (should be '%s')\n", - __location__, talloc_get_name(s4), location4); - ret = false; - } + torture_assert_str_equal(tctx, location4, talloc_get_name(s4), + "talloc_array_ptrtype() sets the wrong name"); talloc_free(top); - - return ret; + return true; } -static bool test_autofree(void) +static bool test_autofree(struct torture_context *tctx) { #if _SAMBA_BUILD_>=4 /* * we can't run this inside smbtorture in samba4 * as smbtorture uses talloc_autofree_context() */ - printf("SKIPPING TALLOC AUTOFREE CONTEXT (not supported from smbtorture)\n"); + torture_skip(tctx, + "SKIPPING TALLOC AUTOFREE CONTEXT (not supported from smbtorture)"); #else void *p; - printf("TESTING TALLOC AUTOFREE CONTEXT\n"); - p = talloc_autofree_context(); talloc_free(p); @@ -1058,34 +941,42 @@ static bool test_autofree(void) return true; } -bool torture_local_talloc(struct torture_context *torture) +bool torture_local_talloc(struct torture_suite *tsuite) { bool ret = true; talloc_disable_null_tracking(); talloc_enable_null_tracking(); - ret = ret && test_ref1(); - ret = ret && test_ref2(); - ret = ret && test_ref3(); - ret = ret && test_ref4(); - ret = ret && test_unlink1(); - ret = ret && test_misc(); - ret = ret && test_realloc(); - ret = ret && test_realloc_child(); - ret = ret && test_steal(); - ret = ret && test_move(); - ret = ret && test_unref_reparent(); - ret = ret && test_realloc_fn(); - ret = ret && test_type(); - ret = ret && test_lifeless(); - ret = ret && test_loop(); - ret = ret && test_free_parent_deny_child(); - ret = ret && test_talloc_ptrtype(); + torture_suite_add_simple_test(tsuite, "SINGLE REFERENCE FREE", test_ref1); + torture_suite_add_simple_test(tsuite, "DOUBLE REFERENCE FREE", test_ref2); + torture_suite_add_simple_test(tsuite, "PARENT REFERENCE FREE", test_ref3); + torture_suite_add_simple_test(tsuite, "REFERRER REFERENCE FREE", test_ref4); + torture_suite_add_simple_test(tsuite, "UNLINK", test_unlink1); + torture_suite_add_simple_test(tsuite, "MISCELLANEOUS", test_misc); + torture_suite_add_simple_test(tsuite, "REALLOC", test_realloc); + torture_suite_add_simple_test(tsuite, "REALLOC WITH CHILD", + test_realloc_child); + torture_suite_add_simple_test(tsuite, "STEAL", test_steal); + torture_suite_add_simple_test(tsuite, "MOVE", test_move); + torture_suite_add_simple_test(tsuite, "UNREFERENCE AFTER PARENT FREED", + test_unref_reparent); + torture_suite_add_simple_test(tsuite, "talloc_realloc_fn", + test_realloc_fn); + torture_suite_add_simple_test(tsuite, "talloc type checking", test_type); + torture_suite_add_simple_test(tsuite, "TALLOC_UNLINK LOOP", test_lifeless); + torture_suite_add_simple_test(tsuite, "TALLOC LOOP DESTRUCTION", test_loop); + torture_suite_add_simple_test(tsuite, "TALLOC FREE PARENT DENY CHILD", + test_free_parent_deny_child); + torture_suite_add_simple_test(tsuite, "TALLOC PTRTYPE", + test_talloc_ptrtype); + if (ret) { - ret = ret && test_speed(); + torture_suite_add_simple_test(tsuite, "TALLOC VS MALLOC SPEED", + test_speed); } - ret = ret && test_autofree(); + torture_suite_add_simple_test(tsuite, "TALLOC AUTOFREE CONTEXT", + test_autofree); return ret; } -- cgit From 52e3f69a36b6ba6a589a8f768fbee77ee06b281c Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 16 Oct 2006 20:05:19 +0000 Subject: r19343: Add support for external scripts/binaries that write results using the 'subunit' protocol. This allows us to easily plug EJS scripts or binaries that can't depend on -ltorture into smbtorture. The protocol is very simple: - write "comments" to stderr Example output on stdout: test: foo success: foo test: bar success: bar test: blah failure: blah [ dummy.c:30: Expression 1 != 2 failed! ] test: blie skip: blie [ Iconv support not built in ] I've already converted the talloc testsuite. (This used to be commit e1742c14a247fabba969f8698108e73997d3f420) --- source4/lib/talloc/config.mk | 4 + source4/lib/talloc/testsuite.c | 436 +++++++++++++++++++++++------------------ 2 files changed, 252 insertions(+), 188 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 3a8a22aa57..19059ca4dc 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -12,3 +12,7 @@ DESCRIPTION = A hierarchical pool based memory system with destructors # End LIBRARY LIBTALLOC ################################################ +[BINARY::LOCAL-TALLOC] +OBJ_FILES = testsuite.o +PRIVATE_DEPENDENCIES = LIBTALLOC +INSTALLDIR = TORTUREDIR diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index f2e61157e4..14222c75af 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -27,17 +27,6 @@ #include "replace.h" #include "system/time.h" #include "talloc.h" -#ifdef _SAMBA_BUILD_ -#include "includes.h" -#include "torture/ui.h" -#else -#define torture_comment printf -#define torture_assert(tctx, expr, str) if (!(expr)) { printf str; return false; } -#define torture_suite_add_simple_tcase(suite,name,fn) \ - ret &= printf("TESTING %s\n", name), fn(); -#define torture_out stdout - -struct torture_suite; static struct timeval timeval_current(void) { @@ -52,7 +41,18 @@ static double timeval_elapsed(struct timeval *tv) return (tv2.tv_sec - tv->tv_sec) + (tv2.tv_usec - tv->tv_usec)*1.0e-6; } -#endif /* _SAMBA_BUILD_ */ + +#define torture_assert(expr, str) if (!(expr)) { \ + printf("failure: xx [\n%s: Expression %s failed: %s\n]\n", \ + __location__, #expr, str); \ + return false; \ +} + +#define torture_assert_str_equal(arg1, arg2, desc) if (strcmp(arg1, arg2)) { \ + printf("failure: xx [\n%s: Expected %s, got %s: %s\n]\n", \ + __location__, arg1, arg2, desc); \ + return false; \ +} #if _SAMBA_BUILD_==3 #ifdef malloc @@ -65,10 +65,10 @@ static double timeval_elapsed(struct timeval *tv) #define CHECK_SIZE(ptr, tsize) do { \ if (talloc_total_size(ptr) != (tsize)) { \ - torture_comment(tctx, talloc_asprintf(tctx, "failed: wrong '%s' tree size: got %u expected %u\n", \ + fprintf(stderr, "failed: wrong '%s' tree size: got %u expected %u\n", \ #ptr, \ (unsigned)talloc_total_size(ptr), \ - (unsigned)tsize)); \ + (unsigned)tsize); \ talloc_report_full(ptr, stdout); \ return false; \ } \ @@ -76,10 +76,10 @@ static double timeval_elapsed(struct timeval *tv) #define CHECK_BLOCKS(ptr, tblocks) do { \ if (talloc_total_blocks(ptr) != (tblocks)) { \ - torture_comment(tctx, talloc_asprintf(tctx, "failed: wrong '%s' tree blocks: got %u expected %u\n", \ + fprintf(stderr, "failed: wrong '%s' tree blocks: got %u expected %u\n", \ #ptr, \ (unsigned)talloc_total_blocks(ptr), \ - (unsigned)tblocks)); \ + (unsigned)tblocks); \ talloc_report_full(ptr, stdout); \ return false; \ } \ @@ -87,10 +87,10 @@ static double timeval_elapsed(struct timeval *tv) #define CHECK_PARENT(ptr, parent) do { \ if (talloc_parent(ptr) != (parent)) { \ - torture_comment(tctx, talloc_asprintf(tctx, "failed: '%s' has wrong parent: got %p expected %p\n", \ + fprintf(stderr, "failed: '%s' has wrong parent: got %p expected %p\n", \ #ptr, \ talloc_parent(ptr), \ - (parent))); \ + (parent)); \ talloc_report_full(ptr, stdout); \ talloc_report_full(parent, stdout); \ talloc_report_full(NULL, stdout); \ @@ -102,10 +102,12 @@ static double timeval_elapsed(struct timeval *tv) /* test references */ -static bool test_ref1(struct torture_context *tctx) +static bool test_ref1(void) { void *root, *p1, *p2, *ref, *r1; + printf("test: SINGLE REFERENCE FREE\n"); + root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); p2 = talloc_named_const(p1, 1, "p2"); @@ -115,31 +117,31 @@ static bool test_ref1(struct torture_context *tctx) r1 = talloc_named_const(root, 1, "r1"); ref = talloc_reference(r1, p2); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_BLOCKS(p1, 5); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(r1, 2); - torture_comment(tctx, "Freeing p2\n"); + fprintf(stderr, "Freeing p2\n"); talloc_free(p2); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_BLOCKS(p1, 5); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(r1, 1); - torture_comment(tctx, "Freeing p1\n"); + fprintf(stderr, "Freeing p1\n"); talloc_free(p1); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_BLOCKS(r1, 1); - torture_comment(tctx, "Freeing r1\n"); + fprintf(stderr, "Freeing r1\n"); talloc_free(r1); - talloc_report_full(NULL, torture_out); + talloc_report_full(NULL, stderr); - torture_comment(tctx, "Testing NULL\n"); + fprintf(stderr, "Testing NULL\n"); if (talloc_reference(root, NULL)) { return false; } @@ -149,16 +151,18 @@ static bool test_ref1(struct torture_context *tctx) CHECK_SIZE(root, 0); talloc_free(root); + printf("success: SINGLE REFERENCE FREE\n"); return true; } /* test references */ -static bool test_ref2(struct torture_context *tctx) +static bool test_ref2(void) { void *root, *p1, *p2, *ref, *r1; + printf("test: DOUBLE REFERENCE FREE\n"); root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); talloc_named_const(p1, 1, "x1"); @@ -168,85 +172,92 @@ static bool test_ref2(struct torture_context *tctx) r1 = talloc_named_const(root, 1, "r1"); ref = talloc_reference(r1, p2); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_BLOCKS(p1, 5); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(r1, 2); - torture_comment(tctx, "Freeing ref\n"); + fprintf(stderr, "Freeing ref\n"); talloc_free(ref); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_BLOCKS(p1, 5); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(r1, 1); - torture_comment(tctx, "Freeing p2\n"); + fprintf(stderr, "Freeing p2\n"); talloc_free(p2); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_BLOCKS(p1, 4); CHECK_BLOCKS(r1, 1); - torture_comment(tctx, "Freeing p1\n"); + fprintf(stderr, "Freeing p1\n"); talloc_free(p1); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_BLOCKS(r1, 1); - torture_comment(tctx, "Freeing r1\n"); + fprintf(stderr, "Freeing r1\n"); talloc_free(r1); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_SIZE(root, 0); talloc_free(root); + printf("success: DOUBLE REFERENCE FREE\n"); return true; } /* test references */ -static bool test_ref3(struct torture_context *tctx) +static bool test_ref3(void) { void *root, *p1, *p2, *ref, *r1; + printf("test: PARENT REFERENCE FREE\n"); + root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); p2 = talloc_named_const(root, 1, "p2"); r1 = talloc_named_const(p1, 1, "r1"); ref = talloc_reference(p2, r1); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_BLOCKS(p1, 2); CHECK_BLOCKS(p2, 2); CHECK_BLOCKS(r1, 1); - torture_comment(tctx, "Freeing p1\n"); + fprintf(stderr, "Freeing p1\n"); talloc_free(p1); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_BLOCKS(p2, 2); CHECK_BLOCKS(r1, 1); - torture_comment(tctx, "Freeing p2\n"); + fprintf(stderr, "Freeing p2\n"); talloc_free(p2); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_SIZE(root, 0); talloc_free(root); + + printf("success: PARENT REFERENCE FREE\n"); return true; } /* test references */ -static bool test_ref4(struct torture_context *tctx) +static bool test_ref4(void) { void *root, *p1, *p2, *ref, *r1; + printf("test: REFERRER REFERENCE FREE\n"); + root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); talloc_named_const(p1, 1, "x1"); @@ -256,32 +267,34 @@ static bool test_ref4(struct torture_context *tctx) r1 = talloc_named_const(root, 1, "r1"); ref = talloc_reference(r1, p2); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_BLOCKS(p1, 5); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(r1, 2); - torture_comment(tctx, "Freeing r1\n"); + fprintf(stderr, "Freeing r1\n"); talloc_free(r1); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_BLOCKS(p1, 5); CHECK_BLOCKS(p2, 1); - torture_comment(tctx, "Freeing p2\n"); + fprintf(stderr, "Freeing p2\n"); talloc_free(p2); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_BLOCKS(p1, 4); - torture_comment(tctx, "Freeing p1\n"); + fprintf(stderr, "Freeing p1\n"); talloc_free(p1); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_SIZE(root, 0); talloc_free(root); + + printf("success: REFERRER REFERENCE FREE\n"); return true; } @@ -289,10 +302,12 @@ static bool test_ref4(struct torture_context *tctx) /* test references */ -static bool test_unlink1(struct torture_context *tctx) +static bool test_unlink1(void) { void *root, *p1, *p2, *ref, *r1; + printf("test: UNLINK\n"); + root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); talloc_named_const(p1, 1, "x1"); @@ -302,27 +317,29 @@ static bool test_unlink1(struct torture_context *tctx) r1 = talloc_named_const(p1, 1, "r1"); ref = talloc_reference(r1, p2); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_BLOCKS(p1, 7); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(r1, 2); - torture_comment(tctx, "Unreferencing r1\n"); + fprintf(stderr, "Unreferencing r1\n"); talloc_unlink(r1, p2); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_BLOCKS(p1, 6); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(r1, 1); - torture_comment(tctx, "Freeing p1\n"); + fprintf(stderr, "Freeing p1\n"); talloc_free(p1); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_SIZE(root, 0); talloc_free(root); + + printf("success: UNLINK\n"); return true; } @@ -334,17 +351,19 @@ static int fail_destructor(void *ptr) /* miscellaneous tests to try to get a higher test coverage percentage */ -static bool test_misc(struct torture_context *tctx) +static bool test_misc(void) { void *root, *p1; char *p2; double *d; const char *name; + printf("test: MISCELLANEOUS\n"); + root = talloc_new(NULL); p1 = talloc_size(root, 0x7fffffff); - torture_assert(tctx, !p1, "failed: large talloc allowed\n"); + torture_assert(!p1, "failed: large talloc allowed\n"); p1 = talloc_strdup(root, "foo"); talloc_increase_ref_count(p1); @@ -359,65 +378,65 @@ static bool test_misc(struct torture_context *tctx) CHECK_BLOCKS(p1, 1); CHECK_BLOCKS(root, 2); p2 = talloc_strdup(p1, "foo"); - torture_assert(tctx, talloc_unlink(root, p2) == -1, + torture_assert(talloc_unlink(root, p2) == -1, "failed: talloc_unlink() of non-reference context should return -1\n"); - torture_assert(tctx, talloc_unlink(p1, p2) == 0, + torture_assert(talloc_unlink(p1, p2) == 0, "failed: talloc_unlink() of parent should succeed\n"); talloc_free(p1); CHECK_BLOCKS(p1, 1); CHECK_BLOCKS(root, 2); name = talloc_set_name(p1, "my name is %s", "foo"); - torture_assert_str_equal(tctx, talloc_get_name(p1), "my name is foo", + torture_assert_str_equal(talloc_get_name(p1), "my name is foo", "failed: wrong name after talloc_set_name(my name is foo)"); CHECK_BLOCKS(p1, 2); CHECK_BLOCKS(root, 3); talloc_set_name_const(p1, NULL); - torture_assert_str_equal (tctx, talloc_get_name(p1), "UNNAMED", + torture_assert_str_equal (talloc_get_name(p1), "UNNAMED", "failed: wrong name after talloc_set_name(NULL)"); CHECK_BLOCKS(p1, 2); CHECK_BLOCKS(root, 3); - torture_assert(tctx, talloc_free(NULL) == -1, + torture_assert(talloc_free(NULL) == -1, "talloc_free(NULL) should give -1\n"); talloc_set_destructor(p1, fail_destructor); - torture_assert(tctx, talloc_free(p1) == -1, + torture_assert(talloc_free(p1) == -1, "Failed destructor should cause talloc_free to fail\n"); talloc_set_destructor(p1, NULL); - talloc_report(root, torture_out); + talloc_report(root, stderr); p2 = (char *)talloc_zero_size(p1, 20); - torture_assert(tctx, p2[19] == 0, "Failed to give zero memory\n"); + torture_assert(p2[19] == 0, "Failed to give zero memory\n"); talloc_free(p2); - torture_assert(tctx, talloc_strdup(root, NULL) == NULL, + torture_assert(talloc_strdup(root, NULL) == NULL, "failed: strdup on NULL should give NULL\n"); p2 = talloc_strndup(p1, "foo", 2); - torture_assert(tctx, strcmp("fo", p2) == 0, "failed: strndup doesn't work\n"); + torture_assert(strcmp("fo", p2) == 0, "failed: strndup doesn't work\n"); p2 = talloc_asprintf_append(p2, "o%c", 'd'); - torture_assert(tctx, strcmp("food", p2) == 0, + torture_assert(strcmp("food", p2) == 0, "failed: talloc_asprintf_append doesn't work\n"); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(p1, 3); p2 = talloc_asprintf_append(NULL, "hello %s", "world"); - torture_assert(tctx, strcmp("hello world", p2) == 0, + torture_assert(strcmp("hello world", p2) == 0, "failed: talloc_asprintf_append doesn't work\n"); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(p1, 3); talloc_free(p2); d = talloc_array(p1, double, 0x20000000); - torture_assert(tctx, !d, "failed: integer overflow not detected\n"); + torture_assert(!d, "failed: integer overflow not detected\n"); d = talloc_realloc(p1, d, double, 0x20000000); - torture_assert(tctx, !d, "failed: integer overflow not detected\n"); + torture_assert(!d, "failed: integer overflow not detected\n"); talloc_free(p1); CHECK_BLOCKS(root, 1); @@ -429,7 +448,7 @@ static bool test_misc(struct torture_context *tctx) p1 = talloc_init("%d bytes", 200); p2 = talloc_asprintf(p1, "my test '%s'", "string"); - torture_assert_str_equal(tctx, p2, "my test 'string'", + torture_assert_str_equal(p2, "my test 'string'", "failed: talloc_asprintf(\"my test '%%s'\", \"string\") gave: \"%s\""); CHECK_BLOCKS(p1, 3); CHECK_SIZE(p2, 17); @@ -439,9 +458,9 @@ static bool test_misc(struct torture_context *tctx) p1 = talloc_named_const(root, 10, "p1"); p2 = (char *)talloc_named_const(root, 20, "p2"); (void)talloc_reference(p1, p2); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); talloc_unlink(root, p2); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(p1, 2); CHECK_BLOCKS(root, 3); @@ -451,9 +470,9 @@ static bool test_misc(struct torture_context *tctx) p1 = talloc_named_const(root, 10, "p1"); p2 = (char *)talloc_named_const(root, 20, "p2"); (void)talloc_reference(NULL, p2); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); talloc_unlink(root, p2); - talloc_report_full(root, torture_out); + talloc_report_full(root, stderr); CHECK_BLOCKS(p2, 1); CHECK_BLOCKS(p1, 1); CHECK_BLOCKS(root, 2); @@ -462,11 +481,11 @@ static bool test_misc(struct torture_context *tctx) /* Test that talloc_unlink is a no-op */ - torture_assert(tctx, talloc_unlink(root, NULL) == -1, + torture_assert(talloc_unlink(root, NULL) == -1, "failed: talloc_unlink(root, NULL) == -1\n"); - talloc_report(root, torture_out); - talloc_report(NULL, torture_out); + talloc_report(root, stderr); + talloc_report(NULL, stderr); CHECK_SIZE(root, 0); @@ -476,6 +495,9 @@ static bool test_misc(struct torture_context *tctx) talloc_enable_leak_report(); talloc_enable_leak_report_full(); + + printf("success: MISCELLANEOUS\n"); + return true; } @@ -483,10 +505,12 @@ static bool test_misc(struct torture_context *tctx) /* test realloc */ -static bool test_realloc(struct torture_context *tctx) +static bool test_realloc(void) { void *root, *p1, *p2; + printf("test: REALLOC\n"); + root = talloc_new(NULL); p1 = talloc_size(root, 10); @@ -511,7 +535,7 @@ static bool test_realloc(struct torture_context *tctx) CHECK_SIZE(p1, 60); talloc_increase_ref_count(p2); - torture_assert(tctx, talloc_realloc_size(NULL, p2, 5) == NULL, + torture_assert(talloc_realloc_size(NULL, p2, 5) == NULL, "failed: talloc_realloc() on a referenced pointer should fail\n"); CHECK_BLOCKS(p1, 4); @@ -519,7 +543,7 @@ static bool test_realloc(struct torture_context *tctx) talloc_realloc_size(NULL, p2, 0); CHECK_BLOCKS(p1, 3); - torture_assert(tctx, talloc_realloc_size(NULL, p1, 0x7fffffff) == NULL, + torture_assert(talloc_realloc_size(NULL, p1, 0x7fffffff) == NULL, "failed: oversize talloc should fail\n"); talloc_realloc_size(NULL, p1, 0); @@ -528,13 +552,16 @@ static bool test_realloc(struct torture_context *tctx) CHECK_SIZE(root, 0); talloc_free(root); + + printf("success: REALLOC\n"); + return true; } /* test realloc with a child */ -static bool test_realloc_child(struct torture_context *tctx) +static bool test_realloc_child(void) { void *root; struct el2 { @@ -545,6 +572,8 @@ static bool test_realloc_child(struct torture_context *tctx) struct el2 **list, **list2, **list3; } *el1; + printf("test: REALLOC WITH CHILD\n"); + root = talloc_new(NULL); el1 = talloc(root, struct el1); @@ -569,13 +598,15 @@ static bool test_realloc_child(struct torture_context *tctx) el1->list3 = talloc_realloc(el1, el1->list3, struct el2 *, 300); talloc_free(root); + + printf("success: REALLOC WITH CHILD\n"); return true; } /* test type checking */ -static bool test_type(struct torture_context *tctx) +static bool test_type(void) { void *root; struct el1 { @@ -586,31 +617,37 @@ static bool test_type(struct torture_context *tctx) }; struct el1 *el1; + printf("test: talloc type checking\n"); + root = talloc_new(NULL); el1 = talloc(root, struct el1); el1->count = 1; - torture_assert(tctx, talloc_get_type(el1, struct el1) == el1, + torture_assert(talloc_get_type(el1, struct el1) == el1, "type check failed on el1\n"); - torture_assert(tctx, talloc_get_type(el1, struct el2) == NULL, + torture_assert(talloc_get_type(el1, struct el2) == NULL, "type check failed on el1 with el2\n"); talloc_set_type(el1, struct el2); - torture_assert(tctx, talloc_get_type(el1, struct el2) == (struct el2 *)el1, + torture_assert(talloc_get_type(el1, struct el2) == (struct el2 *)el1, "type set failed on el1 with el2\n"); talloc_free(root); + + printf("success: talloc type checking\n"); return true; } /* test steal */ -static bool test_steal(struct torture_context *tctx) +static bool test_steal(void) { void *root, *p1, *p2; + printf("test: STEAL\n"); + root = talloc_new(NULL); p1 = talloc_array(root, char, 10); @@ -620,10 +657,10 @@ static bool test_steal(struct torture_context *tctx) CHECK_SIZE(p1, 10); CHECK_SIZE(root, 30); - torture_assert(tctx, talloc_steal(p1, NULL) == NULL, + torture_assert(talloc_steal(p1, NULL) == NULL, "failed: stealing NULL should give NULL\n"); - torture_assert(tctx, talloc_steal(p1, p1) == p1, + torture_assert(talloc_steal(p1, p1) == p1, "failed: stealing to ourselves is a nop\n"); CHECK_BLOCKS(root, 3); CHECK_SIZE(root, 30); @@ -646,16 +683,18 @@ static bool test_steal(struct torture_context *tctx) talloc_free(root); p1 = talloc_size(NULL, 3); - talloc_report_full(NULL, torture_out); + talloc_report_full(NULL, stderr); CHECK_SIZE(NULL, 3); talloc_free(p1); + + printf("success: STEAL\n"); return true; } /* test move */ -static bool test_move(struct torture_context *tctx) +static bool test_move(void) { void *root; struct t_move { @@ -663,6 +702,8 @@ static bool test_move(struct torture_context *tctx) int *x; } *t1, *t2; + printf("test: MOVE\n"); + root = talloc_new(NULL); t1 = talloc(root, struct t_move); @@ -673,22 +714,26 @@ static bool test_move(struct torture_context *tctx) t2->p = talloc_move(t2, &t1->p); t2->x = talloc_move(t2, &t1->x); - torture_assert(tctx, t1->p == NULL && t1->x == NULL && + torture_assert(t1->p == NULL && t1->x == NULL && strcmp(t2->p, "foo") == 0 && *t2->x == 42, "talloc move failed"); talloc_free(root); + printf("success: MOVE\n"); + return true; } /* test talloc_realloc_fn */ -static bool test_realloc_fn(struct torture_context *tctx) +static bool test_realloc_fn(void) { void *root, *p1; + printf("test: talloc_realloc_fn\n"); + root = talloc_new(NULL); p1 = talloc_realloc_fn(root, NULL, 10); @@ -702,14 +747,18 @@ static bool test_realloc_fn(struct torture_context *tctx) CHECK_SIZE(root, 0); talloc_free(root); + + printf("success: talloc_realloc_fn\n"); return true; } -static bool test_unref_reparent(struct torture_context *tctx) +static bool test_unref_reparent(void) { void *root, *p1, *p2, *c1; + printf("test: UNREFERENCE AFTER PARENT FREED\n"); + root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "orig parent"); p2 = talloc_named_const(root, 1, "parent by reference"); @@ -729,18 +778,22 @@ static bool test_unref_reparent(struct torture_context *tctx) talloc_free(p2); talloc_free(root); + + printf("success: UNREFERENCE AFTER PARENT FREED\n"); return true; } /* measure the speed of talloc versus malloc */ -static bool test_speed(struct torture_context *tctx) +static bool test_speed(void) { void *ctx = talloc_new(NULL); unsigned count; struct timeval tv; + printf("test: TALLOC VS MALLOC SPEED\n"); + tv = timeval_current(); count = 0; do { @@ -752,7 +805,7 @@ static bool test_speed(struct torture_context *tctx) count += 3; } while (timeval_elapsed(&tv) < 5.0); - torture_comment(tctx, talloc_asprintf(tctx, "talloc: %.0f ops/sec\n", count/timeval_elapsed(&tv))); + fprintf(stderr, "talloc: %.0f ops/sec\n", count/timeval_elapsed(&tv)); talloc_free(ctx); @@ -769,27 +822,34 @@ static bool test_speed(struct torture_context *tctx) count += 3; } while (timeval_elapsed(&tv) < 5.0); - torture_comment(tctx, talloc_asprintf(tctx, "malloc: %.0f ops/sec\n", count/timeval_elapsed(&tv))); + fprintf(stderr, "malloc: %.0f ops/sec\n", count/timeval_elapsed(&tv)); + + printf("success: TALLOC VS MALLOC SPEED\n"); + return true; } -static bool test_lifeless(struct torture_context *tctx) +static bool test_lifeless(void) { void *top = talloc_new(NULL); char *parent, *child; void *child_owner = talloc_new(NULL); + printf("test: TALLOC_UNLINK LOOP\n"); + parent = talloc_strdup(top, "parent"); child = talloc_strdup(parent, "child"); (void)talloc_reference(child, parent); (void)talloc_reference(child_owner, child); - talloc_report_full(top, torture_out); + talloc_report_full(top, stderr); talloc_unlink(top, parent); talloc_free(child); - talloc_report_full(top, torture_out); + talloc_report_full(top, stderr); talloc_free(top); talloc_free(child_owner); talloc_free(child); + + printf("success: TALLOC_UNLINK LOOP\n"); return true; } @@ -801,7 +861,7 @@ static int test_loop_destructor(char *ptr) return 0; } -static bool test_loop(struct torture_context *tctx) +static bool test_loop(void) { void *top = talloc_new(NULL); char *parent; @@ -809,21 +869,25 @@ static bool test_loop(struct torture_context *tctx) char *req2, *req3; } *req1; + printf("test: TALLOC LOOP DESTRUCTION\n"); + parent = talloc_strdup(top, "parent"); req1 = talloc(parent, struct req1); req1->req2 = talloc_strdup(req1, "req2"); talloc_set_destructor(req1->req2, test_loop_destructor); req1->req3 = talloc_strdup(req1, "req3"); (void)talloc_reference(req1->req3, req1); - talloc_report_full(top, torture_out); + talloc_report_full(top, stderr); talloc_free(parent); - talloc_report_full(top, torture_out); - talloc_report_full(NULL, torture_out); + talloc_report_full(top, stderr); + talloc_report_full(NULL, stderr); talloc_free(top); - torture_assert(tctx, loop_destructor_count == 1, + torture_assert(loop_destructor_count == 1, "FAILED TO FIRE LOOP DESTRUCTOR\n"); loop_destructor_count = 0; + + printf("success: TALLOC LOOP DESTRUCTION\n"); return true; } @@ -832,13 +896,15 @@ static int fail_destructor_str(char *ptr) return -1; } -static bool test_free_parent_deny_child(struct torture_context *tctx) +static bool test_free_parent_deny_child(void) { void *top = talloc_new(NULL); char *level1; char *level2; char *level3; + printf("test: TALLOC FREE PARENT DENY CHILD\n"); + level1 = talloc_strdup(top, "level1"); level2 = talloc_strdup(level1, "level2"); level3 = talloc_strdup(level2, "level3"); @@ -850,10 +916,12 @@ static bool test_free_parent_deny_child(struct torture_context *tctx) CHECK_PARENT(level3, top); talloc_free(top); + + printf("success: TALLOC FREE PARENT DENY CHILD\n"); return true; } -static bool test_talloc_ptrtype(struct torture_context *tctx) +static bool test_talloc_ptrtype(void) { void *top = talloc_new(NULL); struct struct1 { @@ -865,131 +933,123 @@ static bool test_talloc_ptrtype(struct torture_context *tctx) const char *location3; const char *location4; + printf("test: TALLOC PTRTYPE\n"); + s1 = talloc_ptrtype(top, s1);location1 = __location__; - torture_assert(tctx, talloc_get_size(s1) == sizeof(struct struct1), - talloc_asprintf(tctx, - "talloc_ptrtype() allocated the wrong size %lu " - "(should be %lu)\n", (unsigned long)talloc_get_size(s1), - (unsigned long)sizeof(struct struct1))); + if (talloc_get_size(s1) != sizeof(struct struct1)) { + printf("failure: TALLOC PTRTYPE [\n" + "talloc_ptrtype() allocated the wrong size %lu (should be %lu)\n" + "]\n", (unsigned long)talloc_get_size(s1), + (unsigned long)sizeof(struct struct1)); + return false; + } - torture_assert(tctx, strcmp(location1, talloc_get_name(s1)) == 0, - talloc_asprintf(tctx, - "talloc_ptrtype() sets the wrong name '%s' (should be '%s')\n", - talloc_get_name(s1), location1)); + if (strcmp(location1, talloc_get_name(s1)) != 0) { + printf("failure: TALLOC PTRTYPE [\n" + "talloc_ptrtype() sets the wrong name '%s' (should be '%s')\n]\n", + talloc_get_name(s1), location1); + return false; + } s2 = talloc_array_ptrtype(top, s2, 10);location2 = __location__; - torture_assert(tctx, talloc_get_size(s2) == (sizeof(struct struct1) * 10), - talloc_asprintf(tctx, - "talloc_array_ptrtype() allocated the wrong size " - "%lu (should be %lu)\n", + if (talloc_get_size(s2) != (sizeof(struct struct1) * 10)) { + printf("failure: TALLOC PTRTYPE [\n" + "talloc_array_ptrtype() allocated the wrong size " + "%lu (should be %lu)\n]\n", (unsigned long)talloc_get_size(s2), - (unsigned long)(sizeof(struct struct1)*10))); + (unsigned long)(sizeof(struct struct1)*10)); + return false; + } - torture_assert(tctx, strcmp(location2, talloc_get_name(s2)) == 0, - talloc_asprintf(tctx, - "talloc_array_ptrtype() sets the wrong name '%s' (should be '%s')\n", - talloc_get_name(s2), location2)); + if (strcmp(location2, talloc_get_name(s2)) != 0) { + printf("failure: TALLOC PTRTYPE [\n" + "talloc_array_ptrtype() sets the wrong name '%s' (should be '%s')\n]\n", + talloc_get_name(s2), location2); + return false; + } s3 = talloc_array_ptrtype(top, s3, 10);location3 = __location__; - torture_assert(tctx, talloc_get_size(s3) == (sizeof(struct struct1 *) * 10), - talloc_asprintf(tctx, - "talloc_array_ptrtype() allocated the wrong size " - "%lu (should be %lu)\n", + if (talloc_get_size(s3) != (sizeof(struct struct1 *) * 10)) { + printf("failure: TALLOC PTRTYPE [\n" + "talloc_array_ptrtype() allocated the wrong size " + "%lu (should be %lu)\n]\n", (unsigned long)talloc_get_size(s3), - (unsigned long)(sizeof(struct struct1 *)*10))); + (unsigned long)(sizeof(struct struct1 *)*10)); + return false; + } - torture_assert_str_equal(tctx, location3, talloc_get_name(s3), + torture_assert_str_equal(location3, talloc_get_name(s3), "talloc_array_ptrtype() sets the wrong name"); s4 = talloc_array_ptrtype(top, s4, 10);location4 = __location__; - torture_assert(tctx, talloc_get_size(s4) == (sizeof(struct struct1 **) * 10), - talloc_asprintf(tctx, + if (talloc_get_size(s4) != (sizeof(struct struct1 **) * 10)) { + printf("failure: TALLOC PTRTYPE [\n" "talloc_array_ptrtype() allocated the wrong size " - "%lu (should be %lu)\n", + "%lu (should be %lu)\n]\n", (unsigned long)talloc_get_size(s4), - (unsigned long)(sizeof(struct struct1 **)*10))); + (unsigned long)(sizeof(struct struct1 **)*10)); + return false; + } - torture_assert_str_equal(tctx, location4, talloc_get_name(s4), + torture_assert_str_equal(location4, talloc_get_name(s4), "talloc_array_ptrtype() sets the wrong name"); talloc_free(top); + + printf("success: TALLOC PTRTYPE\n"); return true; } -static bool test_autofree(struct torture_context *tctx) +static bool test_autofree(void) { -#if _SAMBA_BUILD_>=4 - /* - * we can't run this inside smbtorture in samba4 - * as smbtorture uses talloc_autofree_context() - */ - torture_skip(tctx, - "SKIPPING TALLOC AUTOFREE CONTEXT (not supported from smbtorture)"); -#else void *p; + printf("test: TALLOC AUTOFREE CONTEXT\n"); p = talloc_autofree_context(); talloc_free(p); p = talloc_autofree_context(); talloc_free(p); -#endif + + printf("success: TALLOC AUTOFREE CONTEXT\n"); return true; } -bool torture_local_talloc(struct torture_suite *tsuite) +int main(void) { bool ret = true; talloc_disable_null_tracking(); talloc_enable_null_tracking(); - torture_suite_add_simple_test(tsuite, "SINGLE REFERENCE FREE", test_ref1); - torture_suite_add_simple_test(tsuite, "DOUBLE REFERENCE FREE", test_ref2); - torture_suite_add_simple_test(tsuite, "PARENT REFERENCE FREE", test_ref3); - torture_suite_add_simple_test(tsuite, "REFERRER REFERENCE FREE", test_ref4); - torture_suite_add_simple_test(tsuite, "UNLINK", test_unlink1); - torture_suite_add_simple_test(tsuite, "MISCELLANEOUS", test_misc); - torture_suite_add_simple_test(tsuite, "REALLOC", test_realloc); - torture_suite_add_simple_test(tsuite, "REALLOC WITH CHILD", - test_realloc_child); - torture_suite_add_simple_test(tsuite, "STEAL", test_steal); - torture_suite_add_simple_test(tsuite, "MOVE", test_move); - torture_suite_add_simple_test(tsuite, "UNREFERENCE AFTER PARENT FREED", - test_unref_reparent); - torture_suite_add_simple_test(tsuite, "talloc_realloc_fn", - test_realloc_fn); - torture_suite_add_simple_test(tsuite, "talloc type checking", test_type); - torture_suite_add_simple_test(tsuite, "TALLOC_UNLINK LOOP", test_lifeless); - torture_suite_add_simple_test(tsuite, "TALLOC LOOP DESTRUCTION", test_loop); - torture_suite_add_simple_test(tsuite, "TALLOC FREE PARENT DENY CHILD", - test_free_parent_deny_child); - torture_suite_add_simple_test(tsuite, "TALLOC PTRTYPE", - test_talloc_ptrtype); + ret &= test_ref1(); + ret &= test_ref2(); + ret &= test_ref3(); + ret &= test_ref4(); + ret &= test_unlink1(); + ret &= test_misc(); + ret &= test_realloc(); + ret &= test_realloc_child(); + ret &= test_steal(); + ret &= test_move(); + ret &= test_unref_reparent(); + ret &= test_realloc_fn(); + ret &= test_type(); + ret &= test_lifeless(); + ret &= test_loop(); + ret &= test_free_parent_deny_child(); + ret &= test_talloc_ptrtype(); if (ret) { - torture_suite_add_simple_test(tsuite, "TALLOC VS MALLOC SPEED", - test_speed); + ret &= test_speed(); } - torture_suite_add_simple_test(tsuite, "TALLOC AUTOFREE CONTEXT", - test_autofree); + ret &= test_autofree(); - return ret; -} - - - -#if _SAMBA_BUILD_<4 - int main(void) -{ - if (!torture_local_talloc(NULL)) { - printf("ERROR: TESTSUITE FAILED\n"); + if (!ret) return -1; - } return 0; } -#endif -- cgit From b58deeea692fc28827e249f0fc4a9d39263a4095 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 16 Oct 2006 23:09:15 +0000 Subject: r19350: Properly list LOCAL-TALLOC under the "LOCAL" header. Support directories for subcategories in tests. Several small other fixes. (This used to be commit bde00d97068d559b025ab131ff698a82430d14b3) --- source4/lib/talloc/config.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 19059ca4dc..0b06687dab 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -12,7 +12,7 @@ DESCRIPTION = A hierarchical pool based memory system with destructors # End LIBRARY LIBTALLOC ################################################ -[BINARY::LOCAL-TALLOC] +[BINARY::TALLOC] OBJ_FILES = testsuite.o PRIVATE_DEPENDENCIES = LIBTALLOC -INSTALLDIR = TORTUREDIR +INSTALLDIR = TORTUREDIR/LOCAL -- cgit From 4517b7af0e867d7244d8fcb9af72358f3559660f Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 17 Oct 2006 22:06:43 +0000 Subject: r19381: Print out the specific tests that failed after a smbtorture run. Support listing known failures as a list of wildcards in the file `KNOWN_FAILURES'. (This used to be commit 23f66efd564d1ad549fc0cd60348f54808f5cafa) --- source4/lib/talloc/testsuite.c | 377 +++++++++++++++++++++-------------------- 1 file changed, 189 insertions(+), 188 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 14222c75af..0658a931d0 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -42,17 +42,18 @@ static double timeval_elapsed(struct timeval *tv) (tv2.tv_usec - tv->tv_usec)*1.0e-6; } -#define torture_assert(expr, str) if (!(expr)) { \ - printf("failure: xx [\n%s: Expression %s failed: %s\n]\n", \ - __location__, #expr, str); \ +#define torture_assert(test, expr, str) if (!(expr)) { \ + printf("failure: %s [\n%s: Expression %s failed: %s\n]\n", \ + test, __location__, #expr, str); \ return false; \ } -#define torture_assert_str_equal(arg1, arg2, desc) if (strcmp(arg1, arg2)) { \ - printf("failure: xx [\n%s: Expected %s, got %s: %s\n]\n", \ - __location__, arg1, arg2, desc); \ - return false; \ -} +#define torture_assert_str_equal(test, arg1, arg2, desc) \ + if (strcmp(arg1, arg2)) { \ + printf("failure: %s [\n%s: Expected %s, got %s: %s\n]\n", \ + test, __location__, arg1, arg2, desc); \ + return false; \ + } #if _SAMBA_BUILD_==3 #ifdef malloc @@ -63,10 +64,10 @@ static double timeval_elapsed(struct timeval *tv) #endif #endif -#define CHECK_SIZE(ptr, tsize) do { \ +#define CHECK_SIZE(test, ptr, tsize) do { \ if (talloc_total_size(ptr) != (tsize)) { \ - fprintf(stderr, "failed: wrong '%s' tree size: got %u expected %u\n", \ - #ptr, \ + printf("failed: %s [\nwrong '%s' tree size: got %u expected %u\n]\n", \ + test, #ptr, \ (unsigned)talloc_total_size(ptr), \ (unsigned)tsize); \ talloc_report_full(ptr, stdout); \ @@ -74,10 +75,10 @@ static double timeval_elapsed(struct timeval *tv) } \ } while (0) -#define CHECK_BLOCKS(ptr, tblocks) do { \ +#define CHECK_BLOCKS(test, ptr, tblocks) do { \ if (talloc_total_blocks(ptr) != (tblocks)) { \ - fprintf(stderr, "failed: wrong '%s' tree blocks: got %u expected %u\n", \ - #ptr, \ + printf("failed: %s [\nwrong '%s' tree blocks: got %u expected %u\n]\n", \ + test, #ptr, \ (unsigned)talloc_total_blocks(ptr), \ (unsigned)tblocks); \ talloc_report_full(ptr, stdout); \ @@ -85,10 +86,10 @@ static double timeval_elapsed(struct timeval *tv) } \ } while (0) -#define CHECK_PARENT(ptr, parent) do { \ +#define CHECK_PARENT(test, ptr, parent) do { \ if (talloc_parent(ptr) != (parent)) { \ - fprintf(stderr, "failed: '%s' has wrong parent: got %p expected %p\n", \ - #ptr, \ + printf("failed: %s [\n'%s' has wrong parent: got %p expected %p\n]\n", \ + test, #ptr, \ talloc_parent(ptr), \ (parent)); \ talloc_report_full(ptr, stdout); \ @@ -106,7 +107,7 @@ static bool test_ref1(void) { void *root, *p1, *p2, *ref, *r1; - printf("test: SINGLE REFERENCE FREE\n"); + printf("test: ref1 [\nSINGLE REFERENCE FREE\n]\n"); root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); @@ -119,23 +120,23 @@ static bool test_ref1(void) ref = talloc_reference(r1, p2); talloc_report_full(root, stderr); - CHECK_BLOCKS(p1, 5); - CHECK_BLOCKS(p2, 1); - CHECK_BLOCKS(r1, 2); + CHECK_BLOCKS("ref1", p1, 5); + CHECK_BLOCKS("ref1", p2, 1); + CHECK_BLOCKS("ref1", r1, 2); fprintf(stderr, "Freeing p2\n"); talloc_free(p2); talloc_report_full(root, stderr); - CHECK_BLOCKS(p1, 5); - CHECK_BLOCKS(p2, 1); - CHECK_BLOCKS(r1, 1); + CHECK_BLOCKS("ref1", p1, 5); + CHECK_BLOCKS("ref1", p2, 1); + CHECK_BLOCKS("ref1", r1, 1); fprintf(stderr, "Freeing p1\n"); talloc_free(p1); talloc_report_full(root, stderr); - CHECK_BLOCKS(r1, 1); + CHECK_BLOCKS("ref1", r1, 1); fprintf(stderr, "Freeing r1\n"); talloc_free(r1); @@ -146,12 +147,12 @@ static bool test_ref1(void) return false; } - CHECK_BLOCKS(root, 1); + CHECK_BLOCKS("ref1", root, 1); - CHECK_SIZE(root, 0); + CHECK_SIZE("ref1", root, 0); talloc_free(root); - printf("success: SINGLE REFERENCE FREE\n"); + printf("success: ref1\n"); return true; } @@ -162,7 +163,7 @@ static bool test_ref2(void) { void *root, *p1, *p2, *ref, *r1; - printf("test: DOUBLE REFERENCE FREE\n"); + printf("test: ref2 [\nDOUBLE REFERENCE FREE\n]\n"); root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); talloc_named_const(p1, 1, "x1"); @@ -174,39 +175,39 @@ static bool test_ref2(void) ref = talloc_reference(r1, p2); talloc_report_full(root, stderr); - CHECK_BLOCKS(p1, 5); - CHECK_BLOCKS(p2, 1); - CHECK_BLOCKS(r1, 2); + CHECK_BLOCKS("ref2", p1, 5); + CHECK_BLOCKS("ref2", p2, 1); + CHECK_BLOCKS("ref2", r1, 2); fprintf(stderr, "Freeing ref\n"); talloc_free(ref); talloc_report_full(root, stderr); - CHECK_BLOCKS(p1, 5); - CHECK_BLOCKS(p2, 1); - CHECK_BLOCKS(r1, 1); + CHECK_BLOCKS("ref2", p1, 5); + CHECK_BLOCKS("ref2", p2, 1); + CHECK_BLOCKS("ref2", r1, 1); fprintf(stderr, "Freeing p2\n"); talloc_free(p2); talloc_report_full(root, stderr); - CHECK_BLOCKS(p1, 4); - CHECK_BLOCKS(r1, 1); + CHECK_BLOCKS("ref2", p1, 4); + CHECK_BLOCKS("ref2", r1, 1); fprintf(stderr, "Freeing p1\n"); talloc_free(p1); talloc_report_full(root, stderr); - CHECK_BLOCKS(r1, 1); + CHECK_BLOCKS("ref2", r1, 1); fprintf(stderr, "Freeing r1\n"); talloc_free(r1); talloc_report_full(root, stderr); - CHECK_SIZE(root, 0); + CHECK_SIZE("ref2", root, 0); talloc_free(root); - printf("success: DOUBLE REFERENCE FREE\n"); + printf("success: ref2\n"); return true; } @@ -217,7 +218,7 @@ static bool test_ref3(void) { void *root, *p1, *p2, *ref, *r1; - printf("test: PARENT REFERENCE FREE\n"); + printf("test: ref3 [\nPARENT REFERENCE FREE\n]\n"); root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); @@ -226,26 +227,26 @@ static bool test_ref3(void) ref = talloc_reference(p2, r1); talloc_report_full(root, stderr); - CHECK_BLOCKS(p1, 2); - CHECK_BLOCKS(p2, 2); - CHECK_BLOCKS(r1, 1); + CHECK_BLOCKS("ref3", p1, 2); + CHECK_BLOCKS("ref3", p2, 2); + CHECK_BLOCKS("ref3", r1, 1); fprintf(stderr, "Freeing p1\n"); talloc_free(p1); talloc_report_full(root, stderr); - CHECK_BLOCKS(p2, 2); - CHECK_BLOCKS(r1, 1); + CHECK_BLOCKS("ref3", p2, 2); + CHECK_BLOCKS("ref3", r1, 1); fprintf(stderr, "Freeing p2\n"); talloc_free(p2); talloc_report_full(root, stderr); - CHECK_SIZE(root, 0); + CHECK_SIZE("ref3", root, 0); talloc_free(root); - printf("success: PARENT REFERENCE FREE\n"); + printf("success: ref3\n"); return true; } @@ -256,7 +257,7 @@ static bool test_ref4(void) { void *root, *p1, *p2, *ref, *r1; - printf("test: REFERRER REFERENCE FREE\n"); + printf("test: ref4 [\nREFERRER REFERENCE FREE\n]\n"); root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); @@ -269,32 +270,32 @@ static bool test_ref4(void) ref = talloc_reference(r1, p2); talloc_report_full(root, stderr); - CHECK_BLOCKS(p1, 5); - CHECK_BLOCKS(p2, 1); - CHECK_BLOCKS(r1, 2); + CHECK_BLOCKS("ref4", p1, 5); + CHECK_BLOCKS("ref4", p2, 1); + CHECK_BLOCKS("ref4", r1, 2); fprintf(stderr, "Freeing r1\n"); talloc_free(r1); talloc_report_full(root, stderr); - CHECK_BLOCKS(p1, 5); - CHECK_BLOCKS(p2, 1); + CHECK_BLOCKS("ref4", p1, 5); + CHECK_BLOCKS("ref4", p2, 1); fprintf(stderr, "Freeing p2\n"); talloc_free(p2); talloc_report_full(root, stderr); - CHECK_BLOCKS(p1, 4); + CHECK_BLOCKS("ref4", p1, 4); fprintf(stderr, "Freeing p1\n"); talloc_free(p1); talloc_report_full(root, stderr); - CHECK_SIZE(root, 0); + CHECK_SIZE("ref4", root, 0); talloc_free(root); - printf("success: REFERRER REFERENCE FREE\n"); + printf("success: ref4\n"); return true; } @@ -306,7 +307,7 @@ static bool test_unlink1(void) { void *root, *p1, *p2, *ref, *r1; - printf("test: UNLINK\n"); + printf("test: unlink [\nUNLINK\n]\n"); root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); @@ -319,27 +320,27 @@ static bool test_unlink1(void) ref = talloc_reference(r1, p2); talloc_report_full(root, stderr); - CHECK_BLOCKS(p1, 7); - CHECK_BLOCKS(p2, 1); - CHECK_BLOCKS(r1, 2); + CHECK_BLOCKS("unlink", p1, 7); + CHECK_BLOCKS("unlink", p2, 1); + CHECK_BLOCKS("unlink", r1, 2); fprintf(stderr, "Unreferencing r1\n"); talloc_unlink(r1, p2); talloc_report_full(root, stderr); - CHECK_BLOCKS(p1, 6); - CHECK_BLOCKS(p2, 1); - CHECK_BLOCKS(r1, 1); + CHECK_BLOCKS("unlink", p1, 6); + CHECK_BLOCKS("unlink", p2, 1); + CHECK_BLOCKS("unlink", r1, 1); fprintf(stderr, "Freeing p1\n"); talloc_free(p1); talloc_report_full(root, stderr); - CHECK_SIZE(root, 0); + CHECK_SIZE("unlink", root, 0); talloc_free(root); - printf("success: UNLINK\n"); + printf("success: unlink\n"); return true; } @@ -358,52 +359,51 @@ static bool test_misc(void) double *d; const char *name; - printf("test: MISCELLANEOUS\n"); + printf("test: misc [\nMISCELLANEOUS\n]\n"); root = talloc_new(NULL); p1 = talloc_size(root, 0x7fffffff); - torture_assert(!p1, "failed: large talloc allowed\n"); + torture_assert("misc", !p1, "failed: large talloc allowed\n"); p1 = talloc_strdup(root, "foo"); talloc_increase_ref_count(p1); talloc_increase_ref_count(p1); talloc_increase_ref_count(p1); - CHECK_BLOCKS(p1, 1); - CHECK_BLOCKS(root, 2); + CHECK_BLOCKS("misc", p1, 1); + CHECK_BLOCKS("misc", root, 2); talloc_free(p1); - CHECK_BLOCKS(p1, 1); - CHECK_BLOCKS(root, 2); + CHECK_BLOCKS("misc", p1, 1); + CHECK_BLOCKS("misc", root, 2); talloc_unlink(NULL, p1); - CHECK_BLOCKS(p1, 1); - CHECK_BLOCKS(root, 2); + CHECK_BLOCKS("misc", p1, 1); + CHECK_BLOCKS("misc", root, 2); p2 = talloc_strdup(p1, "foo"); - torture_assert(talloc_unlink(root, p2) == -1, + torture_assert("misc", talloc_unlink(root, p2) == -1, "failed: talloc_unlink() of non-reference context should return -1\n"); - torture_assert(talloc_unlink(p1, p2) == 0, + torture_assert("misc", talloc_unlink(p1, p2) == 0, "failed: talloc_unlink() of parent should succeed\n"); talloc_free(p1); - CHECK_BLOCKS(p1, 1); - CHECK_BLOCKS(root, 2); + CHECK_BLOCKS("misc", p1, 1); + CHECK_BLOCKS("misc", root, 2); name = talloc_set_name(p1, "my name is %s", "foo"); - torture_assert_str_equal(talloc_get_name(p1), "my name is foo", + torture_assert_str_equal("misc", talloc_get_name(p1), "my name is foo", "failed: wrong name after talloc_set_name(my name is foo)"); - CHECK_BLOCKS(p1, 2); - CHECK_BLOCKS(root, 3); + CHECK_BLOCKS("misc", p1, 2); + CHECK_BLOCKS("misc", root, 3); talloc_set_name_const(p1, NULL); - torture_assert_str_equal (talloc_get_name(p1), "UNNAMED", + torture_assert_str_equal ("misc", talloc_get_name(p1), "UNNAMED", "failed: wrong name after talloc_set_name(NULL)"); - CHECK_BLOCKS(p1, 2); - CHECK_BLOCKS(root, 3); - + CHECK_BLOCKS("misc", p1, 2); + CHECK_BLOCKS("misc", root, 3); - torture_assert(talloc_free(NULL) == -1, + torture_assert("misc", talloc_free(NULL) == -1, "talloc_free(NULL) should give -1\n"); talloc_set_destructor(p1, fail_destructor); - torture_assert(talloc_free(p1) == -1, + torture_assert("misc", talloc_free(p1) == -1, "Failed destructor should cause talloc_free to fail\n"); talloc_set_destructor(p1, NULL); @@ -411,48 +411,49 @@ static bool test_misc(void) p2 = (char *)talloc_zero_size(p1, 20); - torture_assert(p2[19] == 0, "Failed to give zero memory\n"); + torture_assert("misc", p2[19] == 0, "Failed to give zero memory\n"); talloc_free(p2); - torture_assert(talloc_strdup(root, NULL) == NULL, + torture_assert("misc", talloc_strdup(root, NULL) == NULL, "failed: strdup on NULL should give NULL\n"); p2 = talloc_strndup(p1, "foo", 2); - torture_assert(strcmp("fo", p2) == 0, "failed: strndup doesn't work\n"); + torture_assert("misc", strcmp("fo", p2) == 0, + "strndup doesn't work\n"); p2 = talloc_asprintf_append(p2, "o%c", 'd'); - torture_assert(strcmp("food", p2) == 0, - "failed: talloc_asprintf_append doesn't work\n"); - CHECK_BLOCKS(p2, 1); - CHECK_BLOCKS(p1, 3); + torture_assert("misc", strcmp("food", p2) == 0, + "talloc_asprintf_append doesn't work\n"); + CHECK_BLOCKS("misc", p2, 1); + CHECK_BLOCKS("misc", p1, 3); p2 = talloc_asprintf_append(NULL, "hello %s", "world"); - torture_assert(strcmp("hello world", p2) == 0, - "failed: talloc_asprintf_append doesn't work\n"); - CHECK_BLOCKS(p2, 1); - CHECK_BLOCKS(p1, 3); + torture_assert("misc", strcmp("hello world", p2) == 0, + "talloc_asprintf_append doesn't work\n"); + CHECK_BLOCKS("misc", p2, 1); + CHECK_BLOCKS("misc", p1, 3); talloc_free(p2); d = talloc_array(p1, double, 0x20000000); - torture_assert(!d, "failed: integer overflow not detected\n"); + torture_assert("misc", !d, "failed: integer overflow not detected\n"); d = talloc_realloc(p1, d, double, 0x20000000); - torture_assert(!d, "failed: integer overflow not detected\n"); + torture_assert("misc", !d, "failed: integer overflow not detected\n"); talloc_free(p1); - CHECK_BLOCKS(root, 1); + CHECK_BLOCKS("misc", root, 1); p1 = talloc_named(root, 100, "%d bytes", 100); - CHECK_BLOCKS(p1, 2); - CHECK_BLOCKS(root, 3); + CHECK_BLOCKS("misc", p1, 2); + CHECK_BLOCKS("misc", root, 3); talloc_unlink(root, p1); p1 = talloc_init("%d bytes", 200); p2 = talloc_asprintf(p1, "my test '%s'", "string"); - torture_assert_str_equal(p2, "my test 'string'", + torture_assert_str_equal("misc", p2, "my test 'string'", "failed: talloc_asprintf(\"my test '%%s'\", \"string\") gave: \"%s\""); - CHECK_BLOCKS(p1, 3); - CHECK_SIZE(p2, 17); - CHECK_BLOCKS(root, 1); + CHECK_BLOCKS("misc", p1, 3); + CHECK_SIZE("misc", p2, 17); + CHECK_BLOCKS("misc", root, 1); talloc_unlink(NULL, p1); p1 = talloc_named_const(root, 10, "p1"); @@ -461,9 +462,9 @@ static bool test_misc(void) talloc_report_full(root, stderr); talloc_unlink(root, p2); talloc_report_full(root, stderr); - CHECK_BLOCKS(p2, 1); - CHECK_BLOCKS(p1, 2); - CHECK_BLOCKS(root, 3); + CHECK_BLOCKS("misc", p2, 1); + CHECK_BLOCKS("misc", p1, 2); + CHECK_BLOCKS("misc", root, 3); talloc_unlink(p1, p2); talloc_unlink(root, p1); @@ -473,30 +474,30 @@ static bool test_misc(void) talloc_report_full(root, stderr); talloc_unlink(root, p2); talloc_report_full(root, stderr); - CHECK_BLOCKS(p2, 1); - CHECK_BLOCKS(p1, 1); - CHECK_BLOCKS(root, 2); + CHECK_BLOCKS("misc", p2, 1); + CHECK_BLOCKS("misc", p1, 1); + CHECK_BLOCKS("misc", root, 2); talloc_unlink(NULL, p2); talloc_unlink(root, p1); /* Test that talloc_unlink is a no-op */ - torture_assert(talloc_unlink(root, NULL) == -1, + torture_assert("misc", talloc_unlink(root, NULL) == -1, "failed: talloc_unlink(root, NULL) == -1\n"); talloc_report(root, stderr); talloc_report(NULL, stderr); - CHECK_SIZE(root, 0); + CHECK_SIZE("misc", root, 0); talloc_free(root); - CHECK_SIZE(NULL, 0); + CHECK_SIZE("misc", NULL, 0); talloc_enable_leak_report(); talloc_enable_leak_report_full(); - printf("success: MISCELLANEOUS\n"); + printf("success: misc\n"); return true; } @@ -509,15 +510,15 @@ static bool test_realloc(void) { void *root, *p1, *p2; - printf("test: REALLOC\n"); + printf("test: realloc [\nREALLOC\n]\n"); root = talloc_new(NULL); p1 = talloc_size(root, 10); - CHECK_SIZE(p1, 10); + CHECK_SIZE("realloc", p1, 10); p1 = talloc_realloc_size(NULL, p1, 20); - CHECK_SIZE(p1, 20); + CHECK_SIZE("realloc", p1, 20); talloc_new(p1); @@ -527,29 +528,29 @@ static bool test_realloc(void) p2 = talloc_realloc_size(p1, p2, 40); - CHECK_SIZE(p2, 40); - CHECK_SIZE(root, 60); - CHECK_BLOCKS(p1, 4); + CHECK_SIZE("realloc", p2, 40); + CHECK_SIZE("realloc", root, 60); + CHECK_BLOCKS("realloc", p1, 4); p1 = talloc_realloc_size(NULL, p1, 20); - CHECK_SIZE(p1, 60); + CHECK_SIZE("realloc", p1, 60); talloc_increase_ref_count(p2); - torture_assert(talloc_realloc_size(NULL, p2, 5) == NULL, + torture_assert("realloc", talloc_realloc_size(NULL, p2, 5) == NULL, "failed: talloc_realloc() on a referenced pointer should fail\n"); - CHECK_BLOCKS(p1, 4); + CHECK_BLOCKS("realloc", p1, 4); talloc_realloc_size(NULL, p2, 0); talloc_realloc_size(NULL, p2, 0); - CHECK_BLOCKS(p1, 3); + CHECK_BLOCKS("realloc", p1, 3); - torture_assert(talloc_realloc_size(NULL, p1, 0x7fffffff) == NULL, + torture_assert("realloc", talloc_realloc_size(NULL, p1, 0x7fffffff) == NULL, "failed: oversize talloc should fail\n"); talloc_realloc_size(NULL, p1, 0); - CHECK_BLOCKS(root, 1); - CHECK_SIZE(root, 0); + CHECK_BLOCKS("realloc", root, 1); + CHECK_SIZE("realloc", root, 0); talloc_free(root); @@ -617,7 +618,7 @@ static bool test_type(void) }; struct el1 *el1; - printf("test: talloc type checking\n"); + printf("test: type [\ntalloc type checking\n]\n"); root = talloc_new(NULL); @@ -625,17 +626,17 @@ static bool test_type(void) el1->count = 1; - torture_assert(talloc_get_type(el1, struct el1) == el1, + torture_assert("type", talloc_get_type(el1, struct el1) == el1, "type check failed on el1\n"); - torture_assert(talloc_get_type(el1, struct el2) == NULL, + torture_assert("type", talloc_get_type(el1, struct el2) == NULL, "type check failed on el1 with el2\n"); talloc_set_type(el1, struct el2); - torture_assert(talloc_get_type(el1, struct el2) == (struct el2 *)el1, + torture_assert("type", talloc_get_type(el1, struct el2) == (struct el2 *)el1, "type set failed on el1 with el2\n"); talloc_free(root); - printf("success: talloc type checking\n"); + printf("success: type\n"); return true; } @@ -646,48 +647,48 @@ static bool test_steal(void) { void *root, *p1, *p2; - printf("test: STEAL\n"); + printf("test: steal [\nSTEAL\n]\n"); root = talloc_new(NULL); p1 = talloc_array(root, char, 10); - CHECK_SIZE(p1, 10); + CHECK_SIZE("steal", p1, 10); p2 = talloc_realloc(root, NULL, char, 20); - CHECK_SIZE(p1, 10); - CHECK_SIZE(root, 30); + CHECK_SIZE("steal", p1, 10); + CHECK_SIZE("steal", root, 30); - torture_assert(talloc_steal(p1, NULL) == NULL, + torture_assert("steal", talloc_steal(p1, NULL) == NULL, "failed: stealing NULL should give NULL\n"); - torture_assert(talloc_steal(p1, p1) == p1, + torture_assert("steal", talloc_steal(p1, p1) == p1, "failed: stealing to ourselves is a nop\n"); - CHECK_BLOCKS(root, 3); - CHECK_SIZE(root, 30); + CHECK_BLOCKS("steal", root, 3); + CHECK_SIZE("steal", root, 30); talloc_steal(NULL, p1); talloc_steal(NULL, p2); - CHECK_BLOCKS(root, 1); - CHECK_SIZE(root, 0); + CHECK_BLOCKS("steal", root, 1); + CHECK_SIZE("steal", root, 0); talloc_free(p1); talloc_steal(root, p2); - CHECK_BLOCKS(root, 2); - CHECK_SIZE(root, 20); + CHECK_BLOCKS("steal", root, 2); + CHECK_SIZE("steal", root, 20); talloc_free(p2); - CHECK_BLOCKS(root, 1); - CHECK_SIZE(root, 0); + CHECK_BLOCKS("steal", root, 1); + CHECK_SIZE("steal", root, 0); talloc_free(root); p1 = talloc_size(NULL, 3); talloc_report_full(NULL, stderr); - CHECK_SIZE(NULL, 3); + CHECK_SIZE("steal", NULL, 3); talloc_free(p1); - printf("success: STEAL\n"); + printf("success: steal\n"); return true; } @@ -702,7 +703,7 @@ static bool test_move(void) int *x; } *t1, *t2; - printf("test: MOVE\n"); + printf("test: move [\nMOVE\n]\n"); root = talloc_new(NULL); @@ -714,13 +715,13 @@ static bool test_move(void) t2->p = talloc_move(t2, &t1->p); t2->x = talloc_move(t2, &t1->x); - torture_assert(t1->p == NULL && t1->x == NULL && + torture_assert("move", t1->p == NULL && t1->x == NULL && strcmp(t2->p, "foo") == 0 && *t2->x == 42, "talloc move failed"); talloc_free(root); - printf("success: MOVE\n"); + printf("success: move\n"); return true; } @@ -732,23 +733,23 @@ static bool test_realloc_fn(void) { void *root, *p1; - printf("test: talloc_realloc_fn\n"); + printf("test: realloc_fn [\ntalloc_realloc_fn\n]\n"); root = talloc_new(NULL); p1 = talloc_realloc_fn(root, NULL, 10); - CHECK_BLOCKS(root, 2); - CHECK_SIZE(root, 10); + CHECK_BLOCKS("realloc_fn", root, 2); + CHECK_SIZE("realloc_fn", root, 10); p1 = talloc_realloc_fn(root, p1, 20); - CHECK_BLOCKS(root, 2); - CHECK_SIZE(root, 20); + CHECK_BLOCKS("realloc_fn", root, 2); + CHECK_SIZE("realloc_fn", root, 20); p1 = talloc_realloc_fn(root, p1, 0); - CHECK_BLOCKS(root, 1); - CHECK_SIZE(root, 0); + CHECK_BLOCKS("realloc_fn", root, 1); + CHECK_SIZE("realloc_fn", root, 0); talloc_free(root); - printf("success: talloc_realloc_fn\n"); + printf("success: realloc_fn\n"); return true; } @@ -757,7 +758,7 @@ static bool test_unref_reparent(void) { void *root, *p1, *p2, *c1; - printf("test: UNREFERENCE AFTER PARENT FREED\n"); + printf("test: unref_reparent [\nUNREFERENCE AFTER PARENT FREED\n]\n"); root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "orig parent"); @@ -766,20 +767,20 @@ static bool test_unref_reparent(void) c1 = talloc_named_const(p1, 1, "child"); talloc_reference(p2, c1); - CHECK_PARENT(c1, p1); + CHECK_PARENT("unref_reparent", c1, p1); talloc_free(p1); - CHECK_PARENT(c1, p2); + CHECK_PARENT("unref_reparent", c1, p2); talloc_unlink(p2, c1); - CHECK_SIZE(root, 1); + CHECK_SIZE("unref_reparent", root, 1); talloc_free(p2); talloc_free(root); - printf("success: UNREFERENCE AFTER PARENT FREED\n"); + printf("success: unref_reparent\n"); return true; } @@ -792,7 +793,7 @@ static bool test_speed(void) unsigned count; struct timeval tv; - printf("test: TALLOC VS MALLOC SPEED\n"); + printf("test: speed [\nTALLOC VS MALLOC SPEED\n]\n"); tv = timeval_current(); count = 0; @@ -824,7 +825,7 @@ static bool test_speed(void) fprintf(stderr, "malloc: %.0f ops/sec\n", count/timeval_elapsed(&tv)); - printf("success: TALLOC VS MALLOC SPEED\n"); + printf("success: speed\n"); return true; } @@ -835,7 +836,7 @@ static bool test_lifeless(void) char *parent, *child; void *child_owner = talloc_new(NULL); - printf("test: TALLOC_UNLINK LOOP\n"); + printf("test: lifeless [\nTALLOC_UNLINK LOOP\n]\n"); parent = talloc_strdup(top, "parent"); child = talloc_strdup(parent, "child"); @@ -849,7 +850,7 @@ static bool test_lifeless(void) talloc_free(child_owner); talloc_free(child); - printf("success: TALLOC_UNLINK LOOP\n"); + printf("success: lifeless\n"); return true; } @@ -869,7 +870,7 @@ static bool test_loop(void) char *req2, *req3; } *req1; - printf("test: TALLOC LOOP DESTRUCTION\n"); + printf("test: loop [\nTALLOC LOOP DESTRUCTION\n]\n"); parent = talloc_strdup(top, "parent"); req1 = talloc(parent, struct req1); @@ -883,11 +884,11 @@ static bool test_loop(void) talloc_report_full(NULL, stderr); talloc_free(top); - torture_assert(loop_destructor_count == 1, + torture_assert("loop", loop_destructor_count == 1, "FAILED TO FIRE LOOP DESTRUCTOR\n"); loop_destructor_count = 0; - printf("success: TALLOC LOOP DESTRUCTION\n"); + printf("success: loop\n"); return true; } @@ -903,7 +904,7 @@ static bool test_free_parent_deny_child(void) char *level2; char *level3; - printf("test: TALLOC FREE PARENT DENY CHILD\n"); + printf("test: free_parent_deny_child [\nTALLOC FREE PARENT DENY CHILD\n]\n"); level1 = talloc_strdup(top, "level1"); level2 = talloc_strdup(level1, "level2"); @@ -913,11 +914,11 @@ static bool test_free_parent_deny_child(void) talloc_free(level1); talloc_set_destructor(level3, NULL); - CHECK_PARENT(level3, top); + CHECK_PARENT("free_parent_deny_child", level3, top); talloc_free(top); - printf("success: TALLOC FREE PARENT DENY CHILD\n"); + printf("success: free_parent_deny_child\n"); return true; } @@ -933,12 +934,12 @@ static bool test_talloc_ptrtype(void) const char *location3; const char *location4; - printf("test: TALLOC PTRTYPE\n"); + printf("test: ptrtype [\nTALLOC PTRTYPE\n]\n"); s1 = talloc_ptrtype(top, s1);location1 = __location__; if (talloc_get_size(s1) != sizeof(struct struct1)) { - printf("failure: TALLOC PTRTYPE [\n" + printf("failure: ptrtype [\n" "talloc_ptrtype() allocated the wrong size %lu (should be %lu)\n" "]\n", (unsigned long)talloc_get_size(s1), (unsigned long)sizeof(struct struct1)); @@ -946,7 +947,7 @@ static bool test_talloc_ptrtype(void) } if (strcmp(location1, talloc_get_name(s1)) != 0) { - printf("failure: TALLOC PTRTYPE [\n" + printf("failure: ptrtype [\n" "talloc_ptrtype() sets the wrong name '%s' (should be '%s')\n]\n", talloc_get_name(s1), location1); return false; @@ -955,7 +956,7 @@ static bool test_talloc_ptrtype(void) s2 = talloc_array_ptrtype(top, s2, 10);location2 = __location__; if (talloc_get_size(s2) != (sizeof(struct struct1) * 10)) { - printf("failure: TALLOC PTRTYPE [\n" + printf("failure: ptrtype [\n" "talloc_array_ptrtype() allocated the wrong size " "%lu (should be %lu)\n]\n", (unsigned long)talloc_get_size(s2), @@ -964,7 +965,7 @@ static bool test_talloc_ptrtype(void) } if (strcmp(location2, talloc_get_name(s2)) != 0) { - printf("failure: TALLOC PTRTYPE [\n" + printf("failure: ptrtype [\n" "talloc_array_ptrtype() sets the wrong name '%s' (should be '%s')\n]\n", talloc_get_name(s2), location2); return false; @@ -973,7 +974,7 @@ static bool test_talloc_ptrtype(void) s3 = talloc_array_ptrtype(top, s3, 10);location3 = __location__; if (talloc_get_size(s3) != (sizeof(struct struct1 *) * 10)) { - printf("failure: TALLOC PTRTYPE [\n" + printf("failure: ptrtype [\n" "talloc_array_ptrtype() allocated the wrong size " "%lu (should be %lu)\n]\n", (unsigned long)talloc_get_size(s3), @@ -981,7 +982,7 @@ static bool test_talloc_ptrtype(void) return false; } - torture_assert_str_equal(location3, talloc_get_name(s3), + torture_assert_str_equal("ptrtype", location3, talloc_get_name(s3), "talloc_array_ptrtype() sets the wrong name"); s4 = talloc_array_ptrtype(top, s4, 10);location4 = __location__; @@ -995,19 +996,19 @@ static bool test_talloc_ptrtype(void) return false; } - torture_assert_str_equal(location4, talloc_get_name(s4), + torture_assert_str_equal("ptrtype", location4, talloc_get_name(s4), "talloc_array_ptrtype() sets the wrong name"); talloc_free(top); - printf("success: TALLOC PTRTYPE\n"); + printf("success: ptrtype\n"); return true; } static bool test_autofree(void) { void *p; - printf("test: TALLOC AUTOFREE CONTEXT\n"); + printf("test: autofree [\nTALLOC AUTOFREE CONTEXT\n]\n"); p = talloc_autofree_context(); talloc_free(p); @@ -1015,7 +1016,7 @@ static bool test_autofree(void) p = talloc_autofree_context(); talloc_free(p); - printf("success: TALLOC AUTOFREE CONTEXT\n"); + printf("success: autofree\n"); return true; } -- cgit From cd2bc5854ca4f5aefb80e3599c1639c2badc7da9 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 19 Oct 2006 00:59:33 +0000 Subject: r19405: the talloc speed test suite was not giving an accurate picture of the cost of talloc versus malloc. The size parameter in the test suite was constantly increasing, leading to a worst case for malloc. It is far more common to have talloc calls of 100 bytes or lower, so change the benchmark to reflect this. This makes talloc look much worse - on my laptop I now get: talloc: 5615164 ops/sec malloc: 14337130 ops/sec I'm working on improving that. (This used to be commit db273ef4dd6ab58da57bb4b59fb1fd5568585ed8) --- source4/lib/talloc/testsuite.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 0658a931d0..f51252e57b 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -791,6 +791,8 @@ static bool test_speed(void) { void *ctx = talloc_new(NULL); unsigned count; + const int loop = 1000; + int i; struct timeval tv; printf("test: speed [\nTALLOC VS MALLOC SPEED\n]\n"); @@ -799,11 +801,13 @@ static bool test_speed(void) count = 0; do { void *p1, *p2, *p3; - p1 = talloc_size(ctx, count); - p2 = talloc_strdup(p1, "foo bar"); - p3 = talloc_size(p1, 300); - talloc_free(p1); - count += 3; + for (i=0;i Date: Thu, 19 Oct 2006 10:02:26 +0000 Subject: r19412: some rather strange looking changes to talloc that gain us about 50% in the talloc benchmark. These changes were driven by some cachegrind profiles, with the biggest improvements coming from inlining some functions. I don't think it would be a good idea to start spreading inline and likely()/unlikely() in other parts of Samba, as the benefit in most code will be very small, but talloc() is such a speed critical part of Samba that I think these changes are worthwhile (This used to be commit 8644708c3f42d249b5d1fd2bde37aeb35288da13) --- source4/lib/talloc/talloc.c | 510 ++++++++++++++++++++++++++------------------ 1 file changed, 299 insertions(+), 211 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 87b4d51ba4..bae1942f43 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -77,6 +77,17 @@ #endif #endif +/* these macros gain us a few percent of speed on gcc */ +#if (__GNUC__ >= 3) +/* the strange !! is to ensure that __builtin_expect() takes either 0 or 1 + as its first argument */ +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) +#else +#define likely(x) x +#define unlikely(x) x +#endif + /* this null_context is only used if talloc_enable_leak_report() or talloc_enable_leak_report_full() is called, otherwise it remains NULL @@ -106,15 +117,16 @@ struct talloc_chunk { #define TC_PTR_FROM_CHUNK(tc) ((void *)(TC_HDR_SIZE + (char*)tc)) /* panic if we get a bad magic value */ -static struct talloc_chunk *talloc_chunk_from_ptr(const void *ptr) +static inline struct talloc_chunk *talloc_chunk_from_ptr(const void *ptr) { const char *pp = (const char *)ptr; struct talloc_chunk *tc = discard_const_p(struct talloc_chunk, pp - TC_HDR_SIZE); - if ((tc->flags & ~0xF) != TALLOC_MAGIC) { - TALLOC_ABORT("Bad talloc magic value - unknown value"); - } - if (tc->flags & TALLOC_FLAG_FREE) { - TALLOC_ABORT("Bad talloc magic value - double free"); + if (unlikely((tc->flags & (TALLOC_FLAG_FREE | ~0xF)) != TALLOC_MAGIC)) { + if (tc->flags & TALLOC_FLAG_FREE) { + TALLOC_ABORT("Bad talloc magic value - double free"); + } else { + TALLOC_ABORT("Bad talloc magic value - unknown value"); + } } return tc; } @@ -163,23 +175,43 @@ void *talloc_parent(const void *ptr) return tc? TC_PTR_FROM_CHUNK(tc) : NULL; } +/* + find parents name +*/ +const char *talloc_parent_name(const void *context) +{ + struct talloc_chunk *tc; + + if (unlikely(context == NULL)) { + return NULL; + } + + tc = talloc_chunk_from_ptr(context); + while (tc && tc->prev) tc = tc->prev; + if (tc) { + tc = tc->parent; + } + return tc->name; +} + + /* Allocate a bit of memory as a child of an existing pointer */ -void *_talloc(const void *context, size_t size) +static inline void *__talloc(const void *context, size_t size) { struct talloc_chunk *tc; - if (context == NULL) { + if (unlikely(context == NULL)) { context = null_context; } - if (size >= MAX_TALLOC_SIZE) { + if (unlikely(size >= MAX_TALLOC_SIZE)) { return NULL; } tc = (struct talloc_chunk *)malloc(TC_HDR_SIZE+size); - if (tc == NULL) return NULL; + if (unlikely(tc == NULL)) return NULL; tc->size = size; tc->flags = TALLOC_MAGIC; @@ -188,16 +220,19 @@ void *_talloc(const void *context, size_t size) tc->name = NULL; tc->refs = NULL; - if (context) { + if (likely(context)) { struct talloc_chunk *parent = talloc_chunk_from_ptr(context); - tc->parent = parent; - if (parent->child) { parent->child->parent = NULL; + tc->next = parent->child; + tc->next->prev = tc; + } else { + tc->next = NULL; } - - _TLIST_ADD(parent->child, tc); + tc->parent = parent; + tc->prev = NULL; + parent->child = tc; } else { tc->next = tc->prev = tc->parent = NULL; } @@ -205,7 +240,6 @@ void *_talloc(const void *context, size_t size) return TC_PTR_FROM_CHUNK(tc); } - /* setup a destructor to be called on free of a pointer the destructor should return 0 on success, or -1 on failure. @@ -223,7 +257,7 @@ void _talloc_set_destructor(const void *ptr, int (*destructor)(void *)) */ int talloc_increase_ref_count(const void *ptr) { - if (!talloc_reference(null_context, ptr)) { + if (unlikely(!talloc_reference(null_context, ptr))) { return -1; } return 0; @@ -239,6 +273,33 @@ static int talloc_reference_destructor(struct talloc_reference_handle *handle) return 0; } +/* + more efficient way to add a name to a pointer - the name must point to a + true string constant +*/ +static inline void _talloc_set_name_const(const void *ptr, const char *name) +{ + struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); + tc->name = name; +} + +/* + internal talloc_named_const() +*/ +static inline void *_talloc_named_const(const void *context, size_t size, const char *name) +{ + void *ptr; + + ptr = __talloc(context, size); + if (unlikely(ptr == NULL)) { + return NULL; + } + + _talloc_set_name_const(ptr, name); + + return ptr; +} + /* make a secondary reference to a pointer, hanging off the given context. the pointer remains valid until both the original caller and this given @@ -252,13 +313,13 @@ void *_talloc_reference(const void *context, const void *ptr) { struct talloc_chunk *tc; struct talloc_reference_handle *handle; - if (ptr == NULL) return NULL; + if (unlikely(ptr == NULL)) return NULL; tc = talloc_chunk_from_ptr(ptr); - handle = (struct talloc_reference_handle *)talloc_named_const(context, + handle = (struct talloc_reference_handle *)_talloc_named_const(context, sizeof(struct talloc_reference_handle), TALLOC_MAGIC_REFERENCE); - if (handle == NULL) return NULL; + if (unlikely(handle == NULL)) return NULL; /* note that we hang the destructor off the handle, not the main context as that allows the caller to still setup their @@ -269,6 +330,152 @@ void *_talloc_reference(const void *context, const void *ptr) return handle->ptr; } + +/* + internal talloc_free call +*/ +static inline int _talloc_free(void *ptr) +{ + struct talloc_chunk *tc; + + if (unlikely(ptr == NULL)) { + return -1; + } + + tc = talloc_chunk_from_ptr(ptr); + + if (unlikely(tc->refs)) { + int is_child; + /* check this is a reference from a child or grantchild + * back to it's parent or grantparent + * + * in that case we need to remove the reference and + * call another instance of talloc_free() on the current + * pointer. + */ + is_child = talloc_is_parent(tc->refs, ptr); + _talloc_free(tc->refs); + if (is_child) { + return _talloc_free(ptr); + } + return -1; + } + + if (unlikely(tc->flags & TALLOC_FLAG_LOOP)) { + /* we have a free loop - stop looping */ + return 0; + } + + if (unlikely(tc->destructor)) { + talloc_destructor_t d = tc->destructor; + if (d == (talloc_destructor_t)-1) { + return -1; + } + tc->destructor = (talloc_destructor_t)-1; + if (d(ptr) == -1) { + tc->destructor = d; + return -1; + } + tc->destructor = NULL; + } + + if (tc->parent) { + _TLIST_REMOVE(tc->parent->child, tc); + if (tc->parent->child) { + tc->parent->child->parent = tc->parent; + } + } else { + if (tc->prev) tc->prev->next = tc->next; + if (tc->next) tc->next->prev = tc->prev; + } + + tc->flags |= TALLOC_FLAG_LOOP; + + while (tc->child) { + /* we need to work out who will own an abandoned child + if it cannot be freed. In priority order, the first + choice is owner of any remaining reference to this + pointer, the second choice is our parent, and the + final choice is the null context. */ + void *child = TC_PTR_FROM_CHUNK(tc->child); + const void *new_parent = null_context; + if (unlikely(tc->child->refs)) { + struct talloc_chunk *p = talloc_parent_chunk(tc->child->refs); + if (p) new_parent = TC_PTR_FROM_CHUNK(p); + } + if (unlikely(_talloc_free(child) == -1)) { + if (new_parent == null_context) { + struct talloc_chunk *p = talloc_parent_chunk(ptr); + if (p) new_parent = TC_PTR_FROM_CHUNK(p); + } + talloc_steal(new_parent, child); + } + } + + tc->flags |= TALLOC_FLAG_FREE; + free(tc); + return 0; +} + +/* + move a lump of memory from one talloc context to another return the + ptr on success, or NULL if it could not be transferred. + passing NULL as ptr will always return NULL with no side effects. +*/ +void *_talloc_steal(const void *new_ctx, const void *ptr) +{ + struct talloc_chunk *tc, *new_tc; + + if (unlikely(!ptr)) { + return NULL; + } + + if (unlikely(new_ctx == NULL)) { + new_ctx = null_context; + } + + tc = talloc_chunk_from_ptr(ptr); + + if (unlikely(new_ctx == NULL)) { + if (tc->parent) { + _TLIST_REMOVE(tc->parent->child, tc); + if (tc->parent->child) { + tc->parent->child->parent = tc->parent; + } + } else { + if (tc->prev) tc->prev->next = tc->next; + if (tc->next) tc->next->prev = tc->prev; + } + + tc->parent = tc->next = tc->prev = NULL; + return discard_const_p(void, ptr); + } + + new_tc = talloc_chunk_from_ptr(new_ctx); + + if (unlikely(tc == new_tc || tc->parent == new_tc)) { + return discard_const_p(void, ptr); + } + + if (tc->parent) { + _TLIST_REMOVE(tc->parent->child, tc); + if (tc->parent->child) { + tc->parent->child->parent = tc->parent; + } + } else { + if (tc->prev) tc->prev->next = tc->next; + if (tc->next) tc->next->prev = tc->prev; + } + + tc->parent = new_tc; + if (new_tc->child) new_tc->child->parent = NULL; + _TLIST_ADD(new_tc->child, tc); + + return discard_const_p(void, ptr); +} + + + /* remove a secondary reference to a pointer. This undo's what talloc_reference() has done. The context and pointer arguments @@ -279,7 +486,7 @@ static int talloc_unreference(const void *context, const void *ptr) struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); struct talloc_reference_handle *h; - if (context == NULL) { + if (unlikely(context == NULL)) { context = null_context; } @@ -295,7 +502,7 @@ static int talloc_unreference(const void *context, const void *ptr) return -1; } - return talloc_free(h); + return _talloc_free(h); } /* @@ -332,7 +539,7 @@ int talloc_unlink(const void *context, void *ptr) tc_p = talloc_chunk_from_ptr(ptr); if (tc_p->refs == NULL) { - return talloc_free(ptr); + return _talloc_free(ptr); } new_p = talloc_parent_chunk(tc_p->refs); @@ -360,8 +567,8 @@ static const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list a { struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); tc->name = talloc_vasprintf(ptr, fmt, ap); - if (tc->name) { - talloc_set_name_const(tc->name, ".name"); + if (likely(tc->name)) { + _talloc_set_name_const(tc->name, ".name"); } return tc->name; } @@ -379,15 +586,6 @@ const char *talloc_set_name(const void *ptr, const char *fmt, ...) return name; } -/* - more efficient way to add a name to a pointer - the name must point to a - true string constant -*/ -void talloc_set_name_const(const void *ptr, const char *name) -{ - struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); - tc->name = name; -} /* create a named talloc pointer. Any talloc pointer can be named, and @@ -400,50 +598,31 @@ void *talloc_named(const void *context, size_t size, const char *fmt, ...) void *ptr; const char *name; - ptr = _talloc(context, size); - if (ptr == NULL) return NULL; + ptr = __talloc(context, size); + if (unlikely(ptr == NULL)) return NULL; va_start(ap, fmt); name = talloc_set_name_v(ptr, fmt, ap); va_end(ap); - if (name == NULL) { - talloc_free(ptr); + if (unlikely(name == NULL)) { + _talloc_free(ptr); return NULL; } return ptr; } -/* - create a named talloc pointer. Any talloc pointer can be named, and - talloc_named() operates just like talloc() except that it allows you - to name the pointer. -*/ -void *talloc_named_const(const void *context, size_t size, const char *name) -{ - void *ptr; - - ptr = _talloc(context, size); - if (ptr == NULL) { - return NULL; - } - - talloc_set_name_const(ptr, name); - - return ptr; -} - /* return the name of a talloc ptr, or "UNNAMED" */ const char *talloc_get_name(const void *ptr) { struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); - if (tc->name == TALLOC_MAGIC_REFERENCE) { + if (unlikely(tc->name == TALLOC_MAGIC_REFERENCE)) { return ".reference"; } - if (tc->name) { + if (likely(tc->name)) { return tc->name; } return "UNNAMED"; @@ -457,9 +636,9 @@ const char *talloc_get_name(const void *ptr) void *talloc_check_name(const void *ptr, const char *name) { const char *pname; - if (ptr == NULL) return NULL; + if (unlikely(ptr == NULL)) return NULL; pname = talloc_get_name(ptr); - if (pname == name || strcmp(pname, name) == 0) { + if (likely(pname == name || strcmp(pname, name) == 0)) { return discard_const_p(void, ptr); } return NULL; @@ -482,15 +661,15 @@ void *talloc_init(const char *fmt, ...) */ talloc_enable_null_tracking(); - ptr = _talloc(NULL, 0); - if (ptr == NULL) return NULL; + ptr = __talloc(NULL, 0); + if (unlikely(ptr == NULL)) return NULL; va_start(ap, fmt); name = talloc_set_name_v(ptr, fmt, ap); va_end(ap); - if (name == NULL) { - talloc_free(ptr); + if (unlikely(name == NULL)) { + _talloc_free(ptr); return NULL; } @@ -506,7 +685,7 @@ void talloc_free_children(void *ptr) { struct talloc_chunk *tc; - if (ptr == NULL) { + if (unlikely(ptr == NULL)) { return; } @@ -520,11 +699,11 @@ void talloc_free_children(void *ptr) final choice is the null context. */ void *child = TC_PTR_FROM_CHUNK(tc->child); const void *new_parent = null_context; - if (tc->child->refs) { + if (unlikely(tc->child->refs)) { struct talloc_chunk *p = talloc_parent_chunk(tc->child->refs); if (p) new_parent = TC_PTR_FROM_CHUNK(p); } - if (talloc_free(child) == -1) { + if (unlikely(_talloc_free(child) == -1)) { if (new_parent == null_context) { struct talloc_chunk *p = talloc_parent_chunk(ptr); if (p) new_parent = TC_PTR_FROM_CHUNK(p); @@ -534,6 +713,32 @@ void talloc_free_children(void *ptr) } } +/* + Allocate a bit of memory as a child of an existing pointer +*/ +void *_talloc(const void *context, size_t size) +{ + return __talloc(context, size); +} + +/* + externally callable talloc_set_name_const() +*/ +void talloc_set_name_const(const void *ptr, const char *name) +{ + _talloc_set_name_const(ptr, name); +} + +/* + create a named talloc pointer. Any talloc pointer can be named, and + talloc_named() operates just like talloc() except that it allows you + to name the pointer. +*/ +void *talloc_named_const(const void *context, size_t size, const char *name) +{ + return _talloc_named_const(context, size, name); +} + /* free a talloc pointer. This also frees all child pointers of this pointer recursively @@ -544,68 +749,7 @@ void talloc_free_children(void *ptr) */ int talloc_free(void *ptr) { - struct talloc_chunk *tc; - int old_errno; - - if (ptr == NULL) { - return -1; - } - - tc = talloc_chunk_from_ptr(ptr); - - if (tc->refs) { - int is_child; - /* check this is a reference from a child or grantchild - * back to it's parent or grantparent - * - * in that case we need to remove the reference and - * call another instance of talloc_free() on the current - * pointer. - */ - is_child = talloc_is_parent(tc->refs, ptr); - talloc_free(tc->refs); - if (is_child) { - return talloc_free(ptr); - } - return -1; - } - - if (tc->flags & TALLOC_FLAG_LOOP) { - /* we have a free loop - stop looping */ - return 0; - } - - if (tc->destructor) { - talloc_destructor_t d = tc->destructor; - if (d == (talloc_destructor_t)-1) { - return -1; - } - tc->destructor = (talloc_destructor_t)-1; - if (d(ptr) == -1) { - tc->destructor = d; - return -1; - } - tc->destructor = NULL; - } - - if (tc->parent) { - _TLIST_REMOVE(tc->parent->child, tc); - if (tc->parent->child) { - tc->parent->child->parent = tc->parent; - } - } else { - if (tc->prev) tc->prev->next = tc->next; - if (tc->next) tc->next->prev = tc->prev; - } - - tc->flags |= TALLOC_FLAG_LOOP; - talloc_free_children(ptr); - - tc->flags |= TALLOC_FLAG_FREE; - old_errno = errno; - free(tc); - errno = old_errno; - return 0; + return _talloc_free(ptr); } @@ -620,24 +764,24 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n void *new_ptr; /* size zero is equivalent to free() */ - if (size == 0) { - talloc_free(ptr); + if (unlikely(size == 0)) { + _talloc_free(ptr); return NULL; } - if (size >= MAX_TALLOC_SIZE) { + if (unlikely(size >= MAX_TALLOC_SIZE)) { return NULL; } /* realloc(NULL) is equavalent to malloc() */ if (ptr == NULL) { - return talloc_named_const(context, size, name); + return _talloc_named_const(context, size, name); } tc = talloc_chunk_from_ptr(ptr); /* don't allow realloc on referenced pointers */ - if (tc->refs) { + if (unlikely(tc->refs)) { return NULL; } @@ -653,7 +797,7 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n #else new_ptr = realloc(tc, size + TC_HDR_SIZE); #endif - if (!new_ptr) { + if (unlikely(!new_ptr)) { tc->flags &= ~TALLOC_FLAG_FREE; return NULL; } @@ -675,68 +819,11 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n } tc->size = size; - talloc_set_name_const(TC_PTR_FROM_CHUNK(tc), name); + _talloc_set_name_const(TC_PTR_FROM_CHUNK(tc), name); return TC_PTR_FROM_CHUNK(tc); } -/* - move a lump of memory from one talloc context to another return the - ptr on success, or NULL if it could not be transferred. - passing NULL as ptr will always return NULL with no side effects. -*/ -void *_talloc_steal(const void *new_ctx, const void *ptr) -{ - struct talloc_chunk *tc, *new_tc; - - if (!ptr) { - return NULL; - } - - if (new_ctx == NULL) { - new_ctx = null_context; - } - - tc = talloc_chunk_from_ptr(ptr); - - if (new_ctx == NULL) { - if (tc->parent) { - _TLIST_REMOVE(tc->parent->child, tc); - if (tc->parent->child) { - tc->parent->child->parent = tc->parent; - } - } else { - if (tc->prev) tc->prev->next = tc->next; - if (tc->next) tc->next->prev = tc->prev; - } - - tc->parent = tc->next = tc->prev = NULL; - return discard_const_p(void, ptr); - } - - new_tc = talloc_chunk_from_ptr(new_ctx); - - if (tc == new_tc || tc->parent == new_tc) { - return discard_const_p(void, ptr); - } - - if (tc->parent) { - _TLIST_REMOVE(tc->parent->child, tc); - if (tc->parent->child) { - tc->parent->child->parent = tc->parent; - } - } else { - if (tc->prev) tc->prev->next = tc->next; - if (tc->next) tc->next->prev = tc->prev; - } - - tc->parent = new_tc; - if (new_tc->child) new_tc->child->parent = NULL; - _TLIST_ADD(new_tc->child, tc); - - return discard_const_p(void, ptr); -} - /* a wrapper around talloc_steal() for situations where you are moving a pointer between two structures, and want the old pointer to be set to NULL @@ -880,12 +967,12 @@ static void talloc_report_depth_FILE_helper(const void *ptr, int depth, int max_ return; } - fprintf(f, "%*s%-30s contains %6lu bytes in %3lu blocks (ref %d)\n", + fprintf(f, "%*s%-30s contains %6lu bytes in %3lu blocks (ref %d) %p\n", depth*4, "", name, (unsigned long)talloc_total_size(ptr), (unsigned long)talloc_total_blocks(ptr), - (int)talloc_reference_count(ptr)); + (int)talloc_reference_count(ptr), ptr); #if 0 fprintf(f, "content: "); @@ -956,7 +1043,7 @@ static void talloc_report_null_full(void) void talloc_enable_null_tracking(void) { if (null_context == NULL) { - null_context = talloc_named_const(NULL, 0, "null_context"); + null_context = _talloc_named_const(NULL, 0, "null_context"); } } @@ -965,7 +1052,7 @@ void talloc_enable_null_tracking(void) */ void talloc_disable_null_tracking(void) { - talloc_free(null_context); + _talloc_free(null_context); null_context = NULL; } @@ -992,7 +1079,7 @@ void talloc_enable_leak_report_full(void) */ void *_talloc_zero(const void *ctx, size_t size, const char *name) { - void *p = talloc_named_const(ctx, size, name); + void *p = _talloc_named_const(ctx, size, name); if (p) { memset(p, '\0', size); @@ -1007,9 +1094,9 @@ void *_talloc_zero(const void *ctx, size_t size, const char *name) */ void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name) { - void *newp = talloc_named_const(t, size, name); + void *newp = _talloc_named_const(t, size, name); - if (newp) { + if (likely(newp)) { memcpy(newp, p, size); } @@ -1026,8 +1113,8 @@ char *talloc_strdup(const void *t, const char *p) return NULL; } ret = (char *)talloc_memdup(t, p, strlen(p) + 1); - if (ret) { - talloc_set_name_const(ret, ret); + if (likely(ret)) { + _talloc_set_name_const(ret, ret); } return ret; } @@ -1066,11 +1153,11 @@ char *talloc_strndup(const void *t, const char *p, size_t n) for (len=0; len= MAX_TALLOC_SIZE/el_size) { return NULL; } - return talloc_named_const(ctx, el_size * count, name); + return _talloc_named_const(ctx, el_size * count, name); } /* @@ -1233,7 +1320,7 @@ static int talloc_autofree_destructor(void *ptr) static void talloc_autofree(void) { - talloc_free(autofree_context); + _talloc_free(autofree_context); } /* @@ -1243,7 +1330,7 @@ static void talloc_autofree(void) void *talloc_autofree_context(void) { if (autofree_context == NULL) { - autofree_context = talloc_named_const(NULL, 0, "autofree_context"); + autofree_context = _talloc_named_const(NULL, 0, "autofree_context"); talloc_set_destructor(autofree_context, talloc_autofree_destructor); atexit(talloc_autofree); } @@ -1307,6 +1394,7 @@ void talloc_show_parents(const void *context, FILE *file) tc = tc->parent; } } + fflush(file); } /* -- cgit From 5ce18f91e0a2776299e5ebc411445c512887d74f Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 21 Oct 2006 06:40:39 +0000 Subject: r19434: we need to force line buffering as the new torture code doesn't create a pty in the piped_child() code Jelmer, if you want to fix this on platforms that support it, see the forkpty() call, or see http://junkcode.samba.org/ftp/unpacked/junkcode/rline/ (This used to be commit 35908a29922b93d133b19881dc8205a7116cae8e) --- source4/lib/talloc/testsuite.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index f51252e57b..4904b21f9b 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -1029,6 +1029,8 @@ int main(void) { bool ret = true; + setlinebuf(stdout); + talloc_disable_null_tracking(); talloc_enable_null_tracking(); -- cgit From bc596cf917a25569f71d7d2b72ba11f3cb34dd54 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 25 Oct 2006 14:58:05 +0000 Subject: r19495: Stop linking binaries twice (once before installation, once during build). Make TORTURE-TALLOC and TORTURE-REPLACE builtin again rather than separate binaries. (This used to be commit 8913d60c72a67b041b08d569c9bd048953106c85) --- source4/lib/talloc/config.mk | 5 ----- source4/lib/talloc/testsuite.c | 11 ++++++++++- 2 files changed, 10 insertions(+), 6 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 0b06687dab..714ad72d1c 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -11,8 +11,3 @@ DESCRIPTION = A hierarchical pool based memory system with destructors # # End LIBRARY LIBTALLOC ################################################ - -[BINARY::TALLOC] -OBJ_FILES = testsuite.o -PRIVATE_DEPENDENCIES = LIBTALLOC -INSTALLDIR = TORTUREDIR/LOCAL diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 4904b21f9b..8f2a211b47 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -1025,7 +1025,8 @@ static bool test_autofree(void) return true; } -int main(void) +struct torture_context; +bool torture_local_talloc(struct torture_context *tctx) { bool ret = true; @@ -1057,7 +1058,15 @@ int main(void) } ret &= test_autofree(); + return ret; +} + +#ifndef _SAMBA_BUILD_ +int main(void) +{ + bool ret = torture_local_talloc(NULL); if (!ret) return -1; return 0; } +#endif -- cgit From 5438fc6c6288f092f58932b44fa25cc517972517 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Thu, 26 Oct 2006 03:26:53 +0000 Subject: r19498: the autofree test cannot be run as part of smbtorture (This used to be commit ebf1d523da45fe19757bca45262f7514702ee108) --- source4/lib/talloc/testsuite.c | 3 +++ 1 file changed, 3 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 8f2a211b47..88ed638252 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -1012,6 +1012,8 @@ static bool test_talloc_ptrtype(void) static bool test_autofree(void) { +#ifndef _SAMBA_BUILD_ + /* autofree test would kill smbtorture */ void *p; printf("test: autofree [\nTALLOC AUTOFREE CONTEXT\n]\n"); @@ -1022,6 +1024,7 @@ static bool test_autofree(void) talloc_free(p); printf("success: autofree\n"); +#endif return true; } -- cgit From 8f89522a3fdb5160f7dc5748b8c10ca39c22d775 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 6 Nov 2006 13:14:21 +0000 Subject: r19570: Fix dependencies in pkg-config files. (This used to be commit 1b046698521f77b843f4a2fcf91230ee2917b569) --- source4/lib/talloc/talloc.pc.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.pc.in b/source4/lib/talloc/talloc.pc.in index 7f9ef754cb..2c2658ddfe 100644 --- a/source4/lib/talloc/talloc.pc.in +++ b/source4/lib/talloc/talloc.pc.in @@ -6,5 +6,5 @@ includedir=@includedir@ Name: talloc Description: A hierarchical pool based memory system with destructors Version: 4.0 -Libs: @LIBS@ -L${libdir} -ltalloc -Cflags: -I${includedir} @CFLAGS@ +Libs: -L${libdir} -ltalloc +Cflags: -I${includedir} -- cgit From dbe5084f8e21565168b83cef17a0dec9032a3f50 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 8 Nov 2006 14:36:30 +0000 Subject: r19636: Add URLs to ldb and talloc pkg-config files. Always build and install .pc files as they make sense for static libs as well. (This used to be commit 82cb91e2dd50899050066cccee82cb5be52ec3fe) --- source4/lib/talloc/talloc.pc.in | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.pc.in b/source4/lib/talloc/talloc.pc.in index 2c2658ddfe..f93036a33d 100644 --- a/source4/lib/talloc/talloc.pc.in +++ b/source4/lib/talloc/talloc.pc.in @@ -8,3 +8,4 @@ Description: A hierarchical pool based memory system with destructors Version: 4.0 Libs: -L${libdir} -ltalloc Cflags: -I${includedir} +URL: http://talloc.samba.org/ -- cgit From 57b482c04fc0a47269d3c17fc34673a9aa1f20f4 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Mon, 13 Nov 2006 09:18:36 +0000 Subject: r19684: Talloc_guide text on multithreading by Remi Turboult (This used to be commit 7b9b2e5358030aed5cb69dbc93d3175c9cac4455) --- source4/lib/talloc/talloc_guide.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index 83f524862f..8b252e4ab9 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -56,6 +56,22 @@ talloc API The following is a complete guide to the talloc API. Read it all at least twice. +Multi-threading +--------------- + +talloc itself does not deal with threads. It is thread-safe (assuming +the underlying "malloc" is), as long as each thread uses different +memory contexts. +If two threads uses the same context then they need to synchronize in +order to be safe. In particular: +- when using talloc_enable_leak_report(), giving directly NULL as a +parent context implicitly refers to a hidden "null context" global +variable, so this should not be used in a multi-threaded environment +without proper synchronization ; +- the context returned by talloc_autofree_context() is also global so +shouldn't be used by several threads simultaneously without +synchronization. + =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- (type *)talloc(const void *context, type); -- cgit From bfbf6d546bcea8ea3051a4ff93ed69f1dbf45ffe Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 15 Dec 2006 22:45:36 +0000 Subject: r20193: - let talloc_parent_chunk() handle a NULL pointer - use talloc_parent_chunk() in talloc_parent_name() - add prototype of talloc_parent_name() metze (This used to be commit 85fc18f047cd2132d0c455f739ee76ce5005d7ed) --- source4/lib/talloc/talloc.c | 26 +++++++++++--------------- source4/lib/talloc/talloc.h | 1 + 2 files changed, 12 insertions(+), 15 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index bae1942f43..dafb6d9075 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -164,8 +164,15 @@ do { \ */ static struct talloc_chunk *talloc_parent_chunk(const void *ptr) { - struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); + struct talloc_chunk *tc; + + if (unlikely(ptr == NULL)) { + return NULL; + } + + tc = talloc_chunk_from_ptr(ptr); while (tc->prev) tc=tc->prev; + return tc->parent; } @@ -178,23 +185,12 @@ void *talloc_parent(const void *ptr) /* find parents name */ -const char *talloc_parent_name(const void *context) +const char *talloc_parent_name(const void *ptr) { - struct talloc_chunk *tc; - - if (unlikely(context == NULL)) { - return NULL; - } - - tc = talloc_chunk_from_ptr(context); - while (tc && tc->prev) tc = tc->prev; - if (tc) { - tc = tc->parent; - } - return tc->name; + struct talloc_chunk *tc = talloc_parent_chunk(ptr); + return tc? tc->name : NULL; } - /* Allocate a bit of memory as a child of an existing pointer */ diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 8b17eec03a..75c130a275 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -123,6 +123,7 @@ void *talloc_named_const(const void *context, size_t size, const char *name); const char *talloc_get_name(const void *ptr); void *talloc_check_name(const void *ptr, const char *name); void *talloc_parent(const void *ptr); +const char *talloc_parent_name(const void *ptr); void *talloc_init(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2); int talloc_free(void *ptr); void talloc_free_children(void *ptr); -- cgit From 0d2bedbdd7c5ee5b955a28629ef838d1a35edc45 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 15 Dec 2006 22:47:50 +0000 Subject: r20194: inline all static talloc functions metze (This used to be commit ee47b404412299ac0e341f0d269adc21a7ebc603) --- source4/lib/talloc/talloc.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index dafb6d9075..a23de0c8a7 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -162,7 +162,7 @@ do { \ /* return the parent chunk of a pointer */ -static struct talloc_chunk *talloc_parent_chunk(const void *ptr) +static inline struct talloc_chunk *talloc_parent_chunk(const void *ptr) { struct talloc_chunk *tc; @@ -261,6 +261,8 @@ int talloc_increase_ref_count(const void *ptr) /* helper for talloc_reference() + + this is referenced by a function pointer and should not be inline */ static int talloc_reference_destructor(struct talloc_reference_handle *handle) { @@ -477,7 +479,7 @@ void *_talloc_steal(const void *new_ctx, const void *ptr) talloc_reference() has done. The context and pointer arguments must match those given to a talloc_reference() */ -static int talloc_unreference(const void *context, const void *ptr) +static inline int talloc_unreference(const void *context, const void *ptr) { struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); struct talloc_reference_handle *h; @@ -557,9 +559,9 @@ int talloc_unlink(const void *context, void *ptr) /* add a name to an existing pointer - va_list version */ -static const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); +static inline const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); -static const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) +static inline const char *talloc_set_name_v(const void *ptr, const char *fmt, va_list ap) { struct talloc_chunk *tc = talloc_chunk_from_ptr(ptr); tc->name = talloc_vasprintf(ptr, fmt, ap); -- cgit From 90d106de8a73d395689b39e3e2c6ada5cfd46f61 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 15 Dec 2006 22:51:31 +0000 Subject: r20195: fix typo metze (This used to be commit 9d06a4b6e22e18bdaa4383c7b9ab8af058c157c0) --- source4/lib/talloc/talloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index a23de0c8a7..15a44bd0d9 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -771,7 +771,7 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n return NULL; } - /* realloc(NULL) is equavalent to malloc() */ + /* realloc(NULL) is equivalent to malloc() */ if (ptr == NULL) { return _talloc_named_const(context, size, name); } -- cgit From f6274959ba381b6b5d025cb0cee78665107a72a6 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 10 Jan 2007 11:16:11 +0000 Subject: r20647: add cluster code (This used to be commit 5870830b99a8d76bda1ff5af3fcf8dda9aba50ec) --- source4/lib/talloc/testsuite.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 88ed638252..dbfe3e4417 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -1028,6 +1028,39 @@ static bool test_autofree(void) return true; } +static bool test_incref(void) +{ + void *top = talloc_new(NULL); + char *a = talloc_strdup(top, "/"); + char *b = talloc_strdup(a,"/b"); + char *c = talloc_strdup(b,"/b/a"); + + // Make a have some more children + talloc_strdup(a,"/c"); + talloc_strdup(a,"/d"); + talloc_strdup(a,"/e"); + + // Now b has some more other children. + talloc_strdup(b,"/b/b"); + + //Now we incref c presumably because we want to keep it valid: + talloc_increase_ref_count(c); + + // I am freeing a here, but I expect c to still be valid because I have + // increased reference for it just above. + talloc_free(a); + + talloc_report_full(NULL, stdout); + + // This is where talloc aborts, valgrind indicates a double free + talloc_free(c); + + CHECK_BLOCKS("top", top, 1); + + return true; +}; + + struct torture_context; bool torture_local_talloc(struct torture_context *tctx) { @@ -1044,6 +1077,7 @@ bool torture_local_talloc(struct torture_context *tctx) ret &= test_ref4(); ret &= test_unlink1(); ret &= test_misc(); + ret &= test_incref(); ret &= test_realloc(); ret &= test_realloc_child(); ret &= test_steal(); -- cgit From 1c211a2e43db46c649a963ec883481cc4321870a Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 10 Jan 2007 11:50:33 +0000 Subject: r20650: revert a bunch of code I didn't mean to commit yet (This used to be commit b3e2d4908781781a487eaeb683d22eb967e5597d) --- source4/lib/talloc/testsuite.c | 34 ---------------------------------- 1 file changed, 34 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index dbfe3e4417..88ed638252 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -1028,39 +1028,6 @@ static bool test_autofree(void) return true; } -static bool test_incref(void) -{ - void *top = talloc_new(NULL); - char *a = talloc_strdup(top, "/"); - char *b = talloc_strdup(a,"/b"); - char *c = talloc_strdup(b,"/b/a"); - - // Make a have some more children - talloc_strdup(a,"/c"); - talloc_strdup(a,"/d"); - talloc_strdup(a,"/e"); - - // Now b has some more other children. - talloc_strdup(b,"/b/b"); - - //Now we incref c presumably because we want to keep it valid: - talloc_increase_ref_count(c); - - // I am freeing a here, but I expect c to still be valid because I have - // increased reference for it just above. - talloc_free(a); - - talloc_report_full(NULL, stdout); - - // This is where talloc aborts, valgrind indicates a double free - talloc_free(c); - - CHECK_BLOCKS("top", top, 1); - - return true; -}; - - struct torture_context; bool torture_local_talloc(struct torture_context *tctx) { @@ -1077,7 +1044,6 @@ bool torture_local_talloc(struct torture_context *tctx) ret &= test_ref4(); ret &= test_unlink1(); ret &= test_misc(); - ret &= test_incref(); ret &= test_realloc(); ret &= test_realloc_child(); ret &= test_steal(); -- cgit From 8538af1107a6e894d4941708b77e79fac587e35d Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 6 Feb 2007 05:26:25 +0000 Subject: r21174: many thanks to Paul Wayper for pointing out that C99 requires a matching va_end() for each va_copy(). This doesn't matter for most architectures, but there could be some obscure ones where it does matter. some of this should be ported to Samba3 (This used to be commit 21eb316473486cb6b73bb3ff9c5f3a44ecd57e4a) --- source4/lib/talloc/talloc.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 15a44bd0d9..028b44a8c7 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1174,10 +1174,11 @@ char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) va_list ap2; char c; - va_copy(ap2, ap); - /* this call looks strange, but it makes it work on older solaris boxes */ - if ((len = vsnprintf(&c, 1, fmt, ap2)) < 0) { + va_copy(ap2, ap); + len = vsnprintf(&c, 1, fmt, ap2); + va_end(ap2); + if (len < 0) { return NULL; } @@ -1185,6 +1186,7 @@ char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) if (ret) { va_copy(ap2, ap); vsnprintf(ret, len+1, fmt, ap2); + va_end(ap2); _talloc_set_name_const(ret, ret); } @@ -1226,10 +1228,13 @@ char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) tc = talloc_chunk_from_ptr(s); + s_len = tc->size - 1; + va_copy(ap2, ap); + len = vsnprintf(&c, 1, fmt, ap2); + va_end(ap2); - s_len = tc->size - 1; - if ((len = vsnprintf(&c, 1, fmt, ap2)) <= 0) { + if (len <= 0) { /* Either the vsnprintf failed or the format resulted in * no characters being formatted. In the former case, we * ought to return NULL, in the latter we ought to return @@ -1243,8 +1248,8 @@ char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) if (!s) return NULL; va_copy(ap2, ap); - vsnprintf(s+s_len, len+1, fmt, ap2); + va_end(ap2); _talloc_set_name_const(s, s); return s; -- cgit From 97416e6b011a3c733d07f83073bf12796c7ecc6b Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 12 Feb 2007 12:12:12 +0000 Subject: r21297: Remove the GTK+ tools and library from the main repository. They are now maintained separately in bzr at http://people.samba.org/bzr/jelmer/samba-gtk This also adds some more headers to the list that is installed and a couple of extra #include lines so these headers can be used externally without problems. (This used to be commit 07652f65ce7a5b19130f1a27cbf0e1e5fae13454) --- source4/lib/talloc/talloc.h | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 75c130a275..628490faa6 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -26,6 +26,10 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include +#include +#include + /* this is only needed for compatibility with the old talloc */ typedef void TALLOC_CTX; -- cgit From 9f7406f7956ce396fb8a79603aa4f9518ca46afe Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Mon, 16 Apr 2007 19:14:55 +0000 Subject: r22267: protect #define __location__ with an #ifndef metze (This used to be commit 138ffd6d486bb315ee6933f25e693d4207d870d6) --- source4/lib/talloc/talloc.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 628490faa6..195c6c25b6 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -36,10 +36,12 @@ typedef void TALLOC_CTX; /* this uses a little trick to allow __LINE__ to be stringified */ -#define _STRING_LINE_(s) #s -#define _STRING_LINE2_(s) _STRING_LINE_(s) -#define __LINESTR__ _STRING_LINE2_(__LINE__) -#define __location__ __FILE__ ":" __LINESTR__ +#ifndef __location__ +#define __TALLOC_STRING_LINE1__(s) #s +#define __TALLOC_STRING_LINE2__(s) __TALLOC_STRING_LINE1__(s) +#define __TALLOC_STRING_LINE3__ __TALLOC_STRING_LINE2__(__LINE__) +#define __location__ __FILE__ ":" __TALLOC_STRING_LINE3__ +#endif #ifndef TALLOC_DEPRECATED #define TALLOC_DEPRECATED 0 -- cgit From 361e0b0bd7af14ca8e9c7fb442c90029e07b9ea2 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 19 Apr 2007 09:08:30 +0000 Subject: r22365: prepare merge to samba3 metze (This used to be commit 6780c234275b29192c49bf6d45204b0ac458faaf) --- source4/lib/talloc/testsuite.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 88ed638252..d122a5de0d 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -1012,7 +1012,7 @@ static bool test_talloc_ptrtype(void) static bool test_autofree(void) { -#ifndef _SAMBA_BUILD_ +#if _SAMBA_BUILD_ < 4 /* autofree test would kill smbtorture */ void *p; printf("test: autofree [\nTALLOC AUTOFREE CONTEXT\n]\n"); @@ -1064,7 +1064,7 @@ bool torture_local_talloc(struct torture_context *tctx) return ret; } -#ifndef _SAMBA_BUILD_ +#if _SAMBA_BUILD_ < 4 int main(void) { bool ret = torture_local_talloc(NULL); -- cgit From 4b0820f9adac8a579f763ee8caf60bff52f2b84d Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 25 Apr 2007 12:30:25 +0000 Subject: r22514: Add version numbers to tdb and talloc (required so they can be packaged independent of Samba for Debian). (This used to be commit 846cfcf44df07457d228c9a5afab743e071ab7aa) --- source4/lib/talloc/configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/configure.ac b/source4/lib/talloc/configure.ac index 51e7256bf8..5f465fe93a 100644 --- a/source4/lib/talloc/configure.ac +++ b/source4/lib/talloc/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ(2.50) -AC_INIT(talloc.h) +AC_INIT(talloc, 1.0) AC_CONFIG_SRCDIR([talloc.c]) AC_SUBST(datarootdir) AC_CONFIG_HEADER(config.h) -- cgit From 781575f5085ce7c4ccf05797103e54c2a8c8e6b9 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 25 Apr 2007 13:31:38 +0000 Subject: r22517: Use DESTDIR (This used to be commit 4614da125fe3ce87ab59bc583aa95fa73beebaab) --- source4/lib/talloc/Makefile.in | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index 14e8115692..0cf4354ba4 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -34,13 +34,13 @@ libtalloc.a: $(LIBOBJ) @-ranlib $@ install: all - ${INSTALLCMD} -d ${libdir} - ${INSTALLCMD} -m 755 libtalloc.a $(libdir) - ${INSTALLCMD} -d ${includedir} - ${INSTALLCMD} -m 644 $(srcdir)/talloc.h $(includedir) - ${INSTALLCMD} -m 644 talloc.pc $(libdir)/pkgconfig - if [ -f talloc.3 ];then ${INSTALLCMD} -d ${mandir}/man3; fi - if [ -f talloc.3 ];then ${INSTALLCMD} -m 644 talloc.3 $(mandir)/man3; fi + ${INSTALLCMD} -d $(DESTDIR)${libdir} + ${INSTALLCMD} -m 755 libtalloc.a $(DESTDIR)$(libdir) + ${INSTALLCMD} -d $(DESTDIR)${includedir} + ${INSTALLCMD} -m 644 $(srcdir)/talloc.h $(DESTDIR)$(includedir) + ${INSTALLCMD} -m 644 talloc.pc $(DESTDIR)$(libdir)/pkgconfig + if [ -f talloc.3 ];then ${INSTALLCMD} -d $(DESTDIR)${mandir}/man3; fi + if [ -f talloc.3 ];then ${INSTALLCMD} -m 644 talloc.3 $(DESTDIR)$(mandir)/man3; fi doc: talloc.3 talloc.3.html -- cgit From 4adf0b62a306db33867ce821084c249b8f77e950 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 25 Apr 2007 14:18:22 +0000 Subject: r22518: Create pkgconfig dir. (This used to be commit 17e9c56a75264e77a9cab130890ad97618442301) --- source4/lib/talloc/Makefile.in | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index 0cf4354ba4..e4737f0423 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -35,6 +35,7 @@ libtalloc.a: $(LIBOBJ) install: all ${INSTALLCMD} -d $(DESTDIR)${libdir} + ${INSTALLCMD} -d $(DESTDIR)${libdir}/pkgconfig ${INSTALLCMD} -m 755 libtalloc.a $(DESTDIR)$(libdir) ${INSTALLCMD} -d $(DESTDIR)${includedir} ${INSTALLCMD} -m 644 $(srcdir)/talloc.h $(DESTDIR)$(includedir) -- cgit From b06fc3b53c2f17cfa3f86ef1472a5778400c0fc9 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 27 Apr 2007 21:09:16 +0000 Subject: r22539: Added _strict varients of the talloc calls to return NULL on size == 0 varients. Jeremy. (This used to be commit 1ef269067ca501e2a4ded4ca8654c6a6cc26f385) --- source4/lib/talloc/talloc.c | 87 +++++++++++++++++++++++++++++++++++++++++++++ source4/lib/talloc/talloc.h | 10 +++++- 2 files changed, 96 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 028b44a8c7..8f7906d0d8 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1087,6 +1087,28 @@ void *_talloc_zero(const void *ctx, size_t size, const char *name) } +/* + talloc and zero memory. + Strict version - returns NULL if size is zero. +*/ +void *_talloc_zero_strict(const void *ctx, size_t size, const char *name) +{ + void *p; + + if (unlikely(size == 0)) { + return NULL; + } + + p = _talloc_named_const(ctx, size, name); + + if (p) { + memset(p, '\0', size); + } + + return p; +} + + /* memdup with a talloc. */ @@ -1101,6 +1123,26 @@ void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name return newp; } +/* + memdup with a talloc. + Strict version - returns NULL if size is zero. +*/ +void *_talloc_memdup_strict(const void *t, const void *p, size_t size, const char *name) +{ + void *newp; + + if (unlikely(size == 0)) { + return NULL; + } + + newp = _talloc_named_const(t, size, name); + if (likely(newp)) { + memcpy(newp, p, size); + } + + return newp; +} + /* strdup with a talloc */ @@ -1281,6 +1323,23 @@ void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char return _talloc_named_const(ctx, el_size * count, name); } +/* + alloc an array, checking for integer overflow in the array size. + Strict version - returns NULL if count or el_size are zero. +*/ +void *_talloc_array_strict(const void *ctx, size_t el_size, unsigned count, const char *name) +{ + if (count >= MAX_TALLOC_SIZE/el_size) { + return NULL; + } + + if (el_size == 0 || count == 0) { + return NULL; + } + + return _talloc_named_const(ctx, el_size * count, name); +} + /* alloc an zero array, checking for integer overflow in the array size */ @@ -1292,6 +1351,23 @@ void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const return _talloc_zero(ctx, el_size * count, name); } +/* + alloc an zero array, checking for integer overflow in the array size + Strict version - returns NULL if count or el_size are zero. +*/ +void *_talloc_zero_array_strict(const void *ctx, size_t el_size, unsigned count, const char *name) +{ + if (count >= MAX_TALLOC_SIZE/el_size) { + return NULL; + } + + if (el_size == 0 || count == 0) { + return NULL; + } + + return _talloc_zero(ctx, el_size * count, name); +} + /* realloc an array, checking for integer overflow in the array size @@ -1421,3 +1497,14 @@ int talloc_is_parent(const void *context, const void *ptr) } return 0; } + +/* + Talloc wrapper that returns NULL if size == 0. +*/ +void *talloc_strict(const void *context, size_t size, const char *name) +{ + if (unlikely(size == 0)) { + return NULL; + } + return _talloc_named_const(context, size, name); +} diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 195c6c25b6..fde2ddc0d8 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -89,10 +89,16 @@ typedef void TALLOC_CTX; #define talloc_new(ctx) talloc_named_const(ctx, 0, "talloc_new: " __location__) #define talloc_zero(ctx, type) (type *)_talloc_zero(ctx, sizeof(type), #type) +/* Varient of talloc_zero that returns NULL if size is zero. */ +#define talloc_zero_strict(ctx, type) (type *)_talloc_zero_strict(ctx, sizeof(type), #type) #define talloc_zero_size(ctx, size) _talloc_zero(ctx, size, __location__) #define talloc_zero_array(ctx, type, count) (type *)_talloc_zero_array(ctx, sizeof(type), count, #type) +/* Varient of talloc_zero_array that returns NULL if count is zero. */ +#define talloc_zero_array_strict(ctx, type, count) (type *)_talloc_zero_array_strict(ctx, sizeof(type), count, #type) #define talloc_array(ctx, type, count) (type *)_talloc_array(ctx, sizeof(type), count, #type) +/* Varient of talloc_array that returns NULL if count is zero. */ +#define talloc_array_strict(ctx, type, count) (type *)_talloc_array_strict(ctx, sizeof(type), count, #type) #define talloc_array_size(ctx, size, count) _talloc_array(ctx, size, count, __location__) #define talloc_array_ptrtype(ctx, ptr, count) (_TALLOC_TYPEOF(ptr))talloc_array_size(ctx, sizeof(*(ptr)), count) @@ -100,6 +106,8 @@ typedef void TALLOC_CTX; #define talloc_realloc_size(ctx, ptr, size) _talloc_realloc(ctx, ptr, size, __location__) #define talloc_memdup(t, p, size) _talloc_memdup(t, p, size, __location__) +/* Varient of talloc_memdup that returns NULL if count is zero. */ +#define talloc_memdup_strict(t, p, size) _talloc_memdup_strict(t, p, size, __location__) #define talloc_set_type(ptr, type) talloc_set_name_const(ptr, #type) #define talloc_get_type(ptr, type) (type *)talloc_check_name(ptr, #type) @@ -169,6 +177,6 @@ size_t talloc_get_size(const void *ctx); void *talloc_find_parent_byname(const void *ctx, const char *name); void talloc_show_parents(const void *context, FILE *file); int talloc_is_parent(const void *context, const void *ptr); +void *talloc_strict(const void *context, size_t size, const char *name); #endif - -- cgit From 3477721278b97212d47ddddde6f0ab060406aea3 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 27 Apr 2007 21:58:10 +0000 Subject: r22540: Added _strict varients of the macro calls - added prototypes. Jeremy. (This used to be commit ba1a66cc6febed8b9c809c59562414675df5f74e) --- source4/lib/talloc/talloc.h | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index fde2ddc0d8..357c9b5076 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -92,6 +92,7 @@ typedef void TALLOC_CTX; /* Varient of talloc_zero that returns NULL if size is zero. */ #define talloc_zero_strict(ctx, type) (type *)_talloc_zero_strict(ctx, sizeof(type), #type) #define talloc_zero_size(ctx, size) _talloc_zero(ctx, size, __location__) +#define talloc_zero_size_strict(ctx, size) _talloc_zero_strict(ctx, size, __location__) #define talloc_zero_array(ctx, type, count) (type *)_talloc_zero_array(ctx, sizeof(type), count, #type) /* Varient of talloc_zero_array that returns NULL if count is zero. */ @@ -100,6 +101,7 @@ typedef void TALLOC_CTX; /* Varient of talloc_array that returns NULL if count is zero. */ #define talloc_array_strict(ctx, type, count) (type *)_talloc_array_strict(ctx, sizeof(type), count, #type) #define talloc_array_size(ctx, size, count) _talloc_array(ctx, size, count, __location__) +#define talloc_array_size_strict(ctx, size, count) _talloc_array_strict(ctx, size, count, __location__) #define talloc_array_ptrtype(ctx, ptr, count) (_TALLOC_TYPEOF(ptr))talloc_array_size(ctx, sizeof(*(ptr)), count) #define talloc_realloc(ctx, p, type, count) (type *)_talloc_realloc_array(ctx, p, sizeof(type), count, #type) @@ -160,7 +162,9 @@ void talloc_disable_null_tracking(void); void talloc_enable_leak_report(void); void talloc_enable_leak_report_full(void); void *_talloc_zero(const void *ctx, size_t size, const char *name); +void *_talloc_zero_strict(const void *ctx, size_t size, const char *name); void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name); +void *_talloc_memdup_strict(const void *t, const void *p, size_t size, const char *name); char *talloc_strdup(const void *t, const char *p); char *talloc_strndup(const void *t, const char *p, size_t n); char *talloc_append_string(const void *t, char *orig, const char *append); @@ -169,7 +173,9 @@ char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) PRINTF_ATTRI char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); char *talloc_asprintf_append(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name); +void *_talloc_array_strict(const void *ctx, size_t el_size, unsigned count, const char *name); void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name); +void *_talloc_zero_array_strict(const void *ctx, size_t el_size, unsigned count, const char *name); void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name); void *talloc_realloc_fn(const void *context, void *ptr, size_t size); void *talloc_autofree_context(void); -- cgit From ca3a7a55789557331b7ffc810eae33a8f9859397 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 27 Apr 2007 22:04:27 +0000 Subject: r22541: Added talloc_size_strict macro. Jeremy. (This used to be commit 219e1cae7792a5da886212f335ed11a35f28b3eb) --- source4/lib/talloc/talloc.h | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 357c9b5076..48bf4303c6 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -84,6 +84,7 @@ typedef void TALLOC_CTX; /* useful macros for creating type checked pointers */ #define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) #define talloc_size(ctx, size) talloc_named_const(ctx, size, __location__) +#define talloc_size_strict(ctx, size) talloc_strict(ctx, size, __location__) #define talloc_ptrtype(ctx, ptr) (_TALLOC_TYPEOF(ptr))talloc_size(ctx, sizeof(*(ptr))) #define talloc_new(ctx) talloc_named_const(ctx, 0, "talloc_new: " __location__) -- cgit From 522f9ace1446e360ba84ed3cbe6cdb15946cc6c3 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Sat, 28 Apr 2007 23:23:24 +0000 Subject: r22563: As tridge requested remove the _strict calls - for Samba3 I'm moving to a separate file. Jeremy. (This used to be commit 80706cf98d31593a899652acb2cdedaa8bf3dfab) --- source4/lib/talloc/talloc.c | 89 --------------------------------------------- source4/lib/talloc/talloc.h | 16 -------- 2 files changed, 105 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 8f7906d0d8..b2b00d8c65 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1086,29 +1086,6 @@ void *_talloc_zero(const void *ctx, size_t size, const char *name) return p; } - -/* - talloc and zero memory. - Strict version - returns NULL if size is zero. -*/ -void *_talloc_zero_strict(const void *ctx, size_t size, const char *name) -{ - void *p; - - if (unlikely(size == 0)) { - return NULL; - } - - p = _talloc_named_const(ctx, size, name); - - if (p) { - memset(p, '\0', size); - } - - return p; -} - - /* memdup with a talloc. */ @@ -1123,26 +1100,6 @@ void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name return newp; } -/* - memdup with a talloc. - Strict version - returns NULL if size is zero. -*/ -void *_talloc_memdup_strict(const void *t, const void *p, size_t size, const char *name) -{ - void *newp; - - if (unlikely(size == 0)) { - return NULL; - } - - newp = _talloc_named_const(t, size, name); - if (likely(newp)) { - memcpy(newp, p, size); - } - - return newp; -} - /* strdup with a talloc */ @@ -1323,23 +1280,6 @@ void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char return _talloc_named_const(ctx, el_size * count, name); } -/* - alloc an array, checking for integer overflow in the array size. - Strict version - returns NULL if count or el_size are zero. -*/ -void *_talloc_array_strict(const void *ctx, size_t el_size, unsigned count, const char *name) -{ - if (count >= MAX_TALLOC_SIZE/el_size) { - return NULL; - } - - if (el_size == 0 || count == 0) { - return NULL; - } - - return _talloc_named_const(ctx, el_size * count, name); -} - /* alloc an zero array, checking for integer overflow in the array size */ @@ -1351,24 +1291,6 @@ void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const return _talloc_zero(ctx, el_size * count, name); } -/* - alloc an zero array, checking for integer overflow in the array size - Strict version - returns NULL if count or el_size are zero. -*/ -void *_talloc_zero_array_strict(const void *ctx, size_t el_size, unsigned count, const char *name) -{ - if (count >= MAX_TALLOC_SIZE/el_size) { - return NULL; - } - - if (el_size == 0 || count == 0) { - return NULL; - } - - return _talloc_zero(ctx, el_size * count, name); -} - - /* realloc an array, checking for integer overflow in the array size */ @@ -1497,14 +1419,3 @@ int talloc_is_parent(const void *context, const void *ptr) } return 0; } - -/* - Talloc wrapper that returns NULL if size == 0. -*/ -void *talloc_strict(const void *context, size_t size, const char *name) -{ - if (unlikely(size == 0)) { - return NULL; - } - return _talloc_named_const(context, size, name); -} diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 48bf4303c6..d9e7d94338 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -84,33 +84,22 @@ typedef void TALLOC_CTX; /* useful macros for creating type checked pointers */ #define talloc(ctx, type) (type *)talloc_named_const(ctx, sizeof(type), #type) #define talloc_size(ctx, size) talloc_named_const(ctx, size, __location__) -#define talloc_size_strict(ctx, size) talloc_strict(ctx, size, __location__) #define talloc_ptrtype(ctx, ptr) (_TALLOC_TYPEOF(ptr))talloc_size(ctx, sizeof(*(ptr))) #define talloc_new(ctx) talloc_named_const(ctx, 0, "talloc_new: " __location__) #define talloc_zero(ctx, type) (type *)_talloc_zero(ctx, sizeof(type), #type) -/* Varient of talloc_zero that returns NULL if size is zero. */ -#define talloc_zero_strict(ctx, type) (type *)_talloc_zero_strict(ctx, sizeof(type), #type) #define talloc_zero_size(ctx, size) _talloc_zero(ctx, size, __location__) -#define talloc_zero_size_strict(ctx, size) _talloc_zero_strict(ctx, size, __location__) #define talloc_zero_array(ctx, type, count) (type *)_talloc_zero_array(ctx, sizeof(type), count, #type) -/* Varient of talloc_zero_array that returns NULL if count is zero. */ -#define talloc_zero_array_strict(ctx, type, count) (type *)_talloc_zero_array_strict(ctx, sizeof(type), count, #type) #define talloc_array(ctx, type, count) (type *)_talloc_array(ctx, sizeof(type), count, #type) -/* Varient of talloc_array that returns NULL if count is zero. */ -#define talloc_array_strict(ctx, type, count) (type *)_talloc_array_strict(ctx, sizeof(type), count, #type) #define talloc_array_size(ctx, size, count) _talloc_array(ctx, size, count, __location__) -#define talloc_array_size_strict(ctx, size, count) _talloc_array_strict(ctx, size, count, __location__) #define talloc_array_ptrtype(ctx, ptr, count) (_TALLOC_TYPEOF(ptr))talloc_array_size(ctx, sizeof(*(ptr)), count) #define talloc_realloc(ctx, p, type, count) (type *)_talloc_realloc_array(ctx, p, sizeof(type), count, #type) #define talloc_realloc_size(ctx, ptr, size) _talloc_realloc(ctx, ptr, size, __location__) #define talloc_memdup(t, p, size) _talloc_memdup(t, p, size, __location__) -/* Varient of talloc_memdup that returns NULL if count is zero. */ -#define talloc_memdup_strict(t, p, size) _talloc_memdup_strict(t, p, size, __location__) #define talloc_set_type(ptr, type) talloc_set_name_const(ptr, #type) #define talloc_get_type(ptr, type) (type *)talloc_check_name(ptr, #type) @@ -163,9 +152,7 @@ void talloc_disable_null_tracking(void); void talloc_enable_leak_report(void); void talloc_enable_leak_report_full(void); void *_talloc_zero(const void *ctx, size_t size, const char *name); -void *_talloc_zero_strict(const void *ctx, size_t size, const char *name); void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name); -void *_talloc_memdup_strict(const void *t, const void *p, size_t size, const char *name); char *talloc_strdup(const void *t, const char *p); char *talloc_strndup(const void *t, const char *p, size_t n); char *talloc_append_string(const void *t, char *orig, const char *append); @@ -174,9 +161,7 @@ char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) PRINTF_ATTRI char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); char *talloc_asprintf_append(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name); -void *_talloc_array_strict(const void *ctx, size_t el_size, unsigned count, const char *name); void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name); -void *_talloc_zero_array_strict(const void *ctx, size_t el_size, unsigned count, const char *name); void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name); void *talloc_realloc_fn(const void *context, void *ptr, size_t size); void *talloc_autofree_context(void); @@ -184,6 +169,5 @@ size_t talloc_get_size(const void *ctx); void *talloc_find_parent_byname(const void *ctx, const char *name); void talloc_show_parents(const void *context, FILE *file); int talloc_is_parent(const void *context, const void *ptr); -void *talloc_strict(const void *context, size_t size, const char *name); #endif -- cgit From c9cf06b146c130b77a7fe2827b6e1b4c9d8f33d5 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 30 Apr 2007 08:53:56 +0000 Subject: r22596: Set _CFLAGS variables rather than putting knowledge in the ldb Makefile. This should make it easier to allow use of system tdb or talloc libs using pkg-config. (This used to be commit a3ec90a2635d47e5c073e873c15daab4a8ef5400) --- source4/lib/talloc/libtalloc.m4 | 3 +++ 1 file changed, 3 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/libtalloc.m4 b/source4/lib/talloc/libtalloc.m4 index 4a0ee3c8fc..d364729ec0 100644 --- a/source4/lib/talloc/libtalloc.m4 +++ b/source4/lib/talloc/libtalloc.m4 @@ -15,6 +15,9 @@ fi TALLOCOBJ="talloc.o" AC_SUBST(TALLOCOBJ) +TALLOC_CFLAGS="-I$tallocdir" +AC_SUBST(TALLOC_CFLAGS) + AC_CHECK_SIZEOF(size_t,cross) AC_CHECK_SIZEOF(void *,cross) -- cgit From 2ea189659172ef49684bcd0a716ae2fffcd538ef Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 30 Apr 2007 09:38:25 +0000 Subject: r22598: Simplify includes for replace. (This used to be commit e72cec408e832e0f6ce05c38febdd56de501dbf7) --- source4/lib/talloc/Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index e4737f0423..c6aa40cde2 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -12,7 +12,7 @@ builddir = @builddir@ XSLTPROC = @XSLTPROC@ INSTALLCMD = @INSTALL@ CC = @CC@ -CFLAGS = @CFLAGS@ -DHAVE_CONFIG_H= -I. -I@srcdir@ -I@libreplacedir@ +CFLAGS = @CFLAGS@ -DHAVE_CONFIG_H= -I. -I@srcdir@ EXTRA_TARGETS = @DOC_TARGET@ .SUFFIXES: .c .o .3 .3.xml .xml .html -- cgit From 42cf31f3c695913b68500302ebb2dc6cd0df4464 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 30 Apr 2007 10:49:42 +0000 Subject: r22600: Update bzr ignores, put right version in .pc files, prepare for support of system versions of tdb, talloc. (This used to be commit 9b991ce9ca28b3d88c778305ec5f681506162637) --- source4/lib/talloc/Makefile.in | 8 ++++---- source4/lib/talloc/libtalloc.m4 | 7 +++++-- source4/lib/talloc/talloc.pc.in | 2 +- source4/lib/talloc/talloc_guide.txt | 2 +- 4 files changed, 11 insertions(+), 8 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index c6aa40cde2..18b48c3459 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -17,7 +17,7 @@ EXTRA_TARGETS = @DOC_TARGET@ .SUFFIXES: .c .o .3 .3.xml .xml .html -LIBOBJ = @TALLOCOBJ@ @LIBREPLACEOBJ@ +LIBOBJ = @TALLOC_OBJ@ @LIBREPLACEOBJ@ all: showflags libtalloc.a testsuite $(EXTRA_TARGETS) @@ -34,13 +34,13 @@ libtalloc.a: $(LIBOBJ) @-ranlib $@ install: all - ${INSTALLCMD} -d $(DESTDIR)${libdir} - ${INSTALLCMD} -d $(DESTDIR)${libdir}/pkgconfig + ${INSTALLCMD} -d $(DESTDIR)$(libdir) + ${INSTALLCMD} -d $(DESTDIR)$(libdir)/pkgconfig ${INSTALLCMD} -m 755 libtalloc.a $(DESTDIR)$(libdir) ${INSTALLCMD} -d $(DESTDIR)${includedir} ${INSTALLCMD} -m 644 $(srcdir)/talloc.h $(DESTDIR)$(includedir) ${INSTALLCMD} -m 644 talloc.pc $(DESTDIR)$(libdir)/pkgconfig - if [ -f talloc.3 ];then ${INSTALLCMD} -d $(DESTDIR)${mandir}/man3; fi + if [ -f talloc.3 ];then ${INSTALLCMD} -d $(DESTDIR)$(mandir)/man3; fi if [ -f talloc.3 ];then ${INSTALLCMD} -m 644 talloc.3 $(DESTDIR)$(mandir)/man3; fi doc: talloc.3 talloc.3.html diff --git a/source4/lib/talloc/libtalloc.m4 b/source4/lib/talloc/libtalloc.m4 index d364729ec0..d2e8eba81a 100644 --- a/source4/lib/talloc/libtalloc.m4 +++ b/source4/lib/talloc/libtalloc.m4 @@ -12,12 +12,15 @@ done if test x"$tallocdir" = "x"; then AC_MSG_ERROR([cannot find talloc source in $tallocpaths]) fi -TALLOCOBJ="talloc.o" -AC_SUBST(TALLOCOBJ) +TALLOC_OBJ="talloc.o" +AC_SUBST(TALLOC_OBJ) TALLOC_CFLAGS="-I$tallocdir" AC_SUBST(TALLOC_CFLAGS) +TALLOC_LIBS="" +AC_SUBST(TALLOC_LIBS) + AC_CHECK_SIZEOF(size_t,cross) AC_CHECK_SIZEOF(void *,cross) diff --git a/source4/lib/talloc/talloc.pc.in b/source4/lib/talloc/talloc.pc.in index f93036a33d..459cce70b1 100644 --- a/source4/lib/talloc/talloc.pc.in +++ b/source4/lib/talloc/talloc.pc.in @@ -5,7 +5,7 @@ includedir=@includedir@ Name: talloc Description: A hierarchical pool based memory system with destructors -Version: 4.0 +Version: @PACKAGE_VERSION@ Libs: -L${libdir} -ltalloc Cflags: -I${includedir} URL: http://talloc.samba.org/ diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index 8b252e4ab9..6481b58611 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -12,7 +12,7 @@ this carefully, as talloc has changed a lot. With 3.0.20 (or 3.0.14?) the Samba4 talloc has been ported back to Samba3, so this guide applies to both. The new talloc is a hierarchical, reference counted memory pool system -with destructors. Quite a mounthful really, but not too bad once you +with destructors. Quite a mouthful really, but not too bad once you get used to it. Perhaps the biggest change from Samba3 is that there is no distinction -- cgit From aa4ab6d3c195ca5f0f53e5a25b0839ce8a0fa580 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 8 May 2007 08:49:52 +0000 Subject: r22757: test if calling talloc_free() works on parent elements from within a destrutor metze (This used to be commit 305117fae0b4692b27b9cc7204fc59fb1312eabb) --- source4/lib/talloc/testsuite.c | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index d122a5de0d..587f270553 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -993,7 +993,7 @@ static bool test_talloc_ptrtype(void) s4 = talloc_array_ptrtype(top, s4, 10);location4 = __location__; if (talloc_get_size(s4) != (sizeof(struct struct1 **) * 10)) { - printf("failure: TALLOC PTRTYPE [\n" + printf("failure: ptrtype [\n" "talloc_array_ptrtype() allocated the wrong size " "%lu (should be %lu)\n]\n", (unsigned long)talloc_get_size(s4), @@ -1010,6 +1010,45 @@ static bool test_talloc_ptrtype(void) return true; } +static int _test_talloc_free_in_destructor(void **ptr) +{ + talloc_free(*ptr); + return 0; +} + +static bool test_talloc_free_in_destructor(void) +{ + void *level0; + void *level1; + void *level2; + void *level3; + void *level4; + void **level5; + + printf("test: free_in_destructor [\nTALLOC FREE IN DESTRUCTOR\n]\n"); + + level0 = talloc_new(NULL); + level1 = talloc_new(level0); + level2 = talloc_new(level1); + level3 = talloc_new(level2); + level4 = talloc_new(level3); + level5 = talloc(level4, void *); + + *level5 = level3; + (void)talloc_reference(level0, level3); + (void)talloc_reference(level3, level3); + (void)talloc_reference(level5, level3); + + talloc_set_destructor(level5, _test_talloc_free_in_destructor); + + talloc_free(level1); + + talloc_free(level0); + + printf("success: free_in_destructor\n"); + return true; +} + static bool test_autofree(void) { #if _SAMBA_BUILD_ < 4 @@ -1055,6 +1094,7 @@ bool torture_local_talloc(struct torture_context *tctx) ret &= test_loop(); ret &= test_free_parent_deny_child(); ret &= test_talloc_ptrtype(); + ret &= test_talloc_free_in_destructor(); if (ret) { ret &= test_speed(); -- cgit From 7ef755d150af6ee730ecaa078307706ad753428d Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 8 May 2007 09:54:01 +0000 Subject: r22758: - add missing _talloc_set_name_const(ret, ret); to talloc_append_string() - update manpage and add comments about _talloc_set_name_const(ret, ret); in all places which use them metze (This used to be commit 5cd100de829b75b83e49bd572a33a267cf86f215) --- source4/lib/talloc/talloc.3.xml | 21 +++++++++++++++++++++ source4/lib/talloc/talloc.c | 2 ++ source4/lib/talloc/talloc_guide.txt | 19 ++++++++++++++++++- 3 files changed, 41 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.3.xml b/source4/lib/talloc/talloc.3.xml index 2400fef2dc..83ca67a495 100644 --- a/source4/lib/talloc/talloc.3.xml +++ b/source4/lib/talloc/talloc.3.xml @@ -583,11 +583,27 @@ if (ptr) memcpy(ptr, p, strlen(p)+1);
talloc_set_name_const(ptr, ptr)
+ char *talloc_append_string(const void *<emphasis role="italic">t</emphasis>, char *<emphasis role="italic">orig</emphasis>, const char *<emphasis role="italic">append</emphasis>); + + The talloc_append_string() function appends the given formatted + string to the given string. + + + This function sets the name of the new pointer to the new + string. This is equivalent to: + + talloc_set_name_const(ptr, ptr) + char *talloc_vasprintf(const void *<emphasis role="italic">t</emphasis>, const char *<emphasis role="italic">fmt</emphasis>, va_list <emphasis role="italic">ap</emphasis>); The talloc_vasprintf() function is the talloc equivalent of the C library function vasprintf(3). + + This function sets the name of the new pointer to the new + string. This is equivalent to: + + talloc_set_name_const(ptr, ptr) char *talloc_asprintf(const void *<emphasis role="italic">t</emphasis>, const char *<emphasis role="italic">fmt</emphasis>, ...); @@ -605,6 +621,11 @@ if (ptr) memcpy(ptr, p, strlen(p)+1); The talloc_asprintf_append() function appends the given formatted string to the given string. + + This function sets the name of the new pointer to the new + string. This is equivalent to: + + talloc_set_name_const(ptr, ptr) (type *)talloc_array(const void *ctx, type, uint_t count); diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index b2b00d8c65..abc1e9438e 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1137,6 +1137,8 @@ char *talloc_append_string(const void *t, char *orig, const char *append) /* append the string with the trailing \0 */ memcpy(&ret[olen], append, alenz); + _talloc_set_name_const(ret, ret); + return ret; } diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index 6481b58611..c4634ae19a 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -533,6 +533,15 @@ This functions sets the name of the new pointer to the passed string. This is equivalent to: talloc_set_name_const(ptr, ptr) +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +char *talloc_append_string(const void *t, char *orig, const char *append); + +The talloc_append_string() function appends the given formatted +string to the given string. + +This function sets the name of the new pointer to the new +string. This is equivalent to: + talloc_set_name_const(ptr, ptr) =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- char *talloc_vasprintf(const void *t, const char *fmt, va_list ap); @@ -540,6 +549,10 @@ char *talloc_vasprintf(const void *t, const char *fmt, va_list ap); The talloc_vasprintf() function is the talloc equivalent of the C library function vasprintf() +This functions sets the name of the new pointer to the new +string. This is equivalent to: + talloc_set_name_const(ptr, ptr) + =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- char *talloc_asprintf(const void *t, const char *fmt, ...); @@ -547,7 +560,7 @@ char *talloc_asprintf(const void *t, const char *fmt, ...); The talloc_asprintf() function is the talloc equivalent of the C library function asprintf() -This functions sets the name of the new pointer to the passed +This functions sets the name of the new pointer to the new string. This is equivalent to: talloc_set_name_const(ptr, ptr) @@ -558,6 +571,10 @@ char *talloc_asprintf_append(char *s, const char *fmt, ...); The talloc_asprintf_append() function appends the given formatted string to the given string. +This functions sets the name of the new pointer to the new +string. This is equivalent to: + talloc_set_name_const(ptr, ptr) + =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- (type *)talloc_array(const void *ctx, type, uint_t count); -- cgit From f862ee9db125fb56a1c3bc68139829ab56366775 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 26 May 2007 16:55:08 +0000 Subject: r23157: Add news file for talloc. (This used to be commit cb92da26799d27975dd27255007573cef6397d8a) --- source4/lib/talloc/NEWS | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 source4/lib/talloc/NEWS (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/NEWS b/source4/lib/talloc/NEWS new file mode 100644 index 0000000000..e5b3aa0731 --- /dev/null +++ b/source4/lib/talloc/NEWS @@ -0,0 +1,13 @@ +1.0.1 26 May 2007 + + BUGS + + * Set name of correctly when using talloc_append_string() (metze) + + LICENSE + + * Change license of files in lib/replace to LGPL (was GPL). (jelmer) + +1.0.0 30 April 2007 + + Initial release. -- cgit From e3af07d1b1756f3e723f276ff4362ec784680faf Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sat, 26 May 2007 16:56:54 +0000 Subject: r23158: Set version to 1.0.1. (This used to be commit db065db67a5edcefc6dbe2e504a4922b9b9f7f21) --- source4/lib/talloc/configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/configure.ac b/source4/lib/talloc/configure.ac index 5f465fe93a..e1e84b25c3 100644 --- a/source4/lib/talloc/configure.ac +++ b/source4/lib/talloc/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ(2.50) -AC_INIT(talloc, 1.0) +AC_INIT(talloc, 1.0.1) AC_CONFIG_SRCDIR([talloc.c]) AC_SUBST(datarootdir) AC_CONFIG_HEADER(config.h) -- cgit From b8d69a7ea2505b706ff7c74d7c97bc89d82dfa07 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 10 Jul 2007 02:46:15 +0000 Subject: r23795: more v2->v3 conversion (This used to be commit 84b468b2f8f2dffda89593f816e8bc6a8b6d42ac) --- source4/lib/talloc/config.guess | 2 +- source4/lib/talloc/config.sub | 2 +- source4/lib/talloc/talloc.c | 2 +- source4/lib/talloc/talloc.h | 2 +- source4/lib/talloc/testsuite.c | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.guess b/source4/lib/talloc/config.guess index ad5281e66e..30af5be004 100755 --- a/source4/lib/talloc/config.guess +++ b/source4/lib/talloc/config.guess @@ -7,7 +7,7 @@ timestamp='2005-08-03' # This file 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 +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but diff --git a/source4/lib/talloc/config.sub b/source4/lib/talloc/config.sub index 1c366dfde9..f0fcaf6361 100755 --- a/source4/lib/talloc/config.sub +++ b/source4/lib/talloc/config.sub @@ -11,7 +11,7 @@ timestamp='2005-07-08' # # This file 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 +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index abc1e9438e..a28e9defad 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -15,7 +15,7 @@ This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. + version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index d9e7d94338..6778825822 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -14,7 +14,7 @@ This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. + version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 587f270553..2e6f85370d 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -12,7 +12,7 @@ This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. + version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -- cgit From 4b71c210d5aa01fc5934ea1777a1c8a7ed1e1f37 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 10 Jul 2007 03:04:16 +0000 Subject: r23796: main COPYING file for samba4, plus some formatting varients (This used to be commit 76c6bfdeb51b5673bbabe0ca3d8bff3b74a327ee) --- source4/lib/talloc/talloc.3.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.3.xml b/source4/lib/talloc/talloc.3.xml index 83ca67a495..ed7466c9ee 100644 --- a/source4/lib/talloc/talloc.3.xml +++ b/source4/lib/talloc/talloc.3.xml @@ -721,7 +721,7 @@ if (ptr) memcpy(ptr, p, strlen(p)+1); 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 + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. -- cgit From 6c973f4e8ccbcb6c9275f8a54e26abb19df7e15a Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 10 Jul 2007 03:42:26 +0000 Subject: r23798: updated old Temple Place FSF addresses to new URL (This used to be commit 40c0919aaa9c1b14bbaebb95ecce53eb0380fdbb) --- source4/lib/talloc/talloc.c | 3 +-- source4/lib/talloc/talloc.h | 3 +-- source4/lib/talloc/testsuite.c | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index a28e9defad..6ebdada42f 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -23,8 +23,7 @@ Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + License along with this library; if not, see . */ /* diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 6778825822..15130d0d98 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -22,8 +22,7 @@ Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + License along with this library; if not, see . */ #include diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 2e6f85370d..2e3ae65082 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -20,8 +20,7 @@ Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + License along with this library; if not, see . */ #include "replace.h" -- cgit From e1c15c74af7366901eac9fb9a8e1e674928855ec Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 10 Jul 2007 03:52:17 +0000 Subject: r23799: updated old Franklin Street FSF addresses to new URL (This used to be commit db92b76a0034899f5f0dc2d012ee7709ff9a6132) --- source4/lib/talloc/config.guess | 4 +--- source4/lib/talloc/config.sub | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.guess b/source4/lib/talloc/config.guess index 30af5be004..354dbe175a 100755 --- a/source4/lib/talloc/config.guess +++ b/source4/lib/talloc/config.guess @@ -16,9 +16,7 @@ timestamp='2005-08-03' # 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., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a diff --git a/source4/lib/talloc/config.sub b/source4/lib/talloc/config.sub index f0fcaf6361..23cd6fd75c 100755 --- a/source4/lib/talloc/config.sub +++ b/source4/lib/talloc/config.sub @@ -20,9 +20,7 @@ timestamp='2005-07-08' # 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., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a -- cgit From cd1217ff5ff18e53c6c9fa3d4f4fd56193fe2a17 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 10 Jul 2007 05:23:25 +0000 Subject: r23801: The FSF has moved around a lot. This fixes their Mass Ave address. (This used to be commit 5c9b19271e0e3ad897499707003ce4703ffa4870) --- source4/lib/talloc/talloc.3.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.3.xml b/source4/lib/talloc/talloc.3.xml index ed7466c9ee..4f0f7234e2 100644 --- a/source4/lib/talloc/talloc.3.xml +++ b/source4/lib/talloc/talloc.3.xml @@ -732,8 +732,7 @@ if (ptr) memcpy(ptr, p, strlen(p)+1); 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. + along with this program; if not, see . -- cgit From 37363d45b771e70deeb207f71f948c06ee7d3b3b Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 10 Jul 2007 05:42:52 +0000 Subject: r23802: fixed URL in XML (This used to be commit c0111223e2201b2c62e25a4c88e1ee445fde5ab6) --- source4/lib/talloc/talloc.3.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.3.xml b/source4/lib/talloc/talloc.3.xml index 4f0f7234e2..67de15bfc8 100644 --- a/source4/lib/talloc/talloc.3.xml +++ b/source4/lib/talloc/talloc.3.xml @@ -732,7 +732,7 @@ if (ptr) memcpy(ptr, p, strlen(p)+1); You should have received a copy of the GNU General Public License - along with this program; if not, see . + along with this program; if not, see http://www.gnu.org/licenses/. -- cgit From 69de8f9ac8eaa9bb8ec12facb66fe3e26de5f47c Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 22 Aug 2007 12:44:22 +0000 Subject: r24626: as TALLOC_ABORT() is defined to abort() by default wrap it into a function so that the function name in the backtrace shows what happens. metze (This used to be commit 0216ff6daa276e413811ca32cca0a66b4b2abe55) --- source4/lib/talloc/talloc.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 6ebdada42f..c073a8c774 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -115,6 +115,16 @@ struct talloc_chunk { #define TC_HDR_SIZE ((sizeof(struct talloc_chunk)+15)&~15) #define TC_PTR_FROM_CHUNK(tc) ((void *)(TC_HDR_SIZE + (char*)tc)) +static void talloc_abort_double_free(void) +{ + TALLOC_ABORT("Bad talloc magic value - double free"); +} + +static void talloc_abort_unknown_value(void) +{ + TALLOC_ABORT("Bad talloc magic value - unknown value"); +} + /* panic if we get a bad magic value */ static inline struct talloc_chunk *talloc_chunk_from_ptr(const void *ptr) { @@ -122,9 +132,9 @@ static inline struct talloc_chunk *talloc_chunk_from_ptr(const void *ptr) struct talloc_chunk *tc = discard_const_p(struct talloc_chunk, pp - TC_HDR_SIZE); if (unlikely((tc->flags & (TALLOC_FLAG_FREE | ~0xF)) != TALLOC_MAGIC)) { if (tc->flags & TALLOC_FLAG_FREE) { - TALLOC_ABORT("Bad talloc magic value - double free"); + talloc_abort_double_free(); } else { - TALLOC_ABORT("Bad talloc magic value - unknown value"); + talloc_abort_unknown_value(); } } return tc; -- cgit From dfc0fd9eec32fbaada087531d36b9f13f316f2e4 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 27 Aug 2007 00:19:45 +0000 Subject: r24688: Make output subunit-parseable. (This used to be commit 2585c6feb22b4409a635017875a2e93fe7c436ba) --- source4/lib/talloc/testsuite.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index 2e3ae65082..ddf6865b1a 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -106,7 +106,7 @@ static bool test_ref1(void) { void *root, *p1, *p2, *ref, *r1; - printf("test: ref1 [\nSINGLE REFERENCE FREE\n]\n"); + printf("test: ref1\n# SINGLE REFERENCE FREE\n"); root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); @@ -162,7 +162,7 @@ static bool test_ref2(void) { void *root, *p1, *p2, *ref, *r1; - printf("test: ref2 [\nDOUBLE REFERENCE FREE\n]\n"); + printf("test: ref2\n# DOUBLE REFERENCE FREE\n"); root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); talloc_named_const(p1, 1, "x1"); @@ -217,7 +217,7 @@ static bool test_ref3(void) { void *root, *p1, *p2, *ref, *r1; - printf("test: ref3 [\nPARENT REFERENCE FREE\n]\n"); + printf("test: ref3\n# PARENT REFERENCE FREE\n"); root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); @@ -256,7 +256,7 @@ static bool test_ref4(void) { void *root, *p1, *p2, *ref, *r1; - printf("test: ref4 [\nREFERRER REFERENCE FREE\n]\n"); + printf("test: ref4\n# REFERRER REFERENCE FREE\n"); root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); @@ -306,7 +306,7 @@ static bool test_unlink1(void) { void *root, *p1, *p2, *ref, *r1; - printf("test: unlink [\nUNLINK\n]\n"); + printf("test: unlink\n# UNLINK\n"); root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "p1"); @@ -358,7 +358,7 @@ static bool test_misc(void) double *d; const char *name; - printf("test: misc [\nMISCELLANEOUS\n]\n"); + printf("test: misc\n# MISCELLANEOUS\n"); root = talloc_new(NULL); @@ -509,7 +509,7 @@ static bool test_realloc(void) { void *root, *p1, *p2; - printf("test: realloc [\nREALLOC\n]\n"); + printf("test: realloc\n# REALLOC\n"); root = talloc_new(NULL); @@ -553,7 +553,7 @@ static bool test_realloc(void) talloc_free(root); - printf("success: REALLOC\n"); + printf("success: realloc\n"); return true; } @@ -617,7 +617,7 @@ static bool test_type(void) }; struct el1 *el1; - printf("test: type [\ntalloc type checking\n]\n"); + printf("test: type\n# talloc type checking\n"); root = talloc_new(NULL); @@ -646,7 +646,7 @@ static bool test_steal(void) { void *root, *p1, *p2; - printf("test: steal [\nSTEAL\n]\n"); + printf("test: steal\n# STEAL\n"); root = talloc_new(NULL); @@ -702,7 +702,7 @@ static bool test_move(void) int *x; } *t1, *t2; - printf("test: move [\nMOVE\n]\n"); + printf("test: move\n# MOVE\n"); root = talloc_new(NULL); @@ -732,7 +732,7 @@ static bool test_realloc_fn(void) { void *root, *p1; - printf("test: realloc_fn [\ntalloc_realloc_fn\n]\n"); + printf("test: realloc_fn\n# talloc_realloc_fn\n"); root = talloc_new(NULL); @@ -757,7 +757,7 @@ static bool test_unref_reparent(void) { void *root, *p1, *p2, *c1; - printf("test: unref_reparent [\nUNREFERENCE AFTER PARENT FREED\n]\n"); + printf("test: unref_reparent\n# UNREFERENCE AFTER PARENT FREED\n"); root = talloc_named_const(NULL, 0, "root"); p1 = talloc_named_const(root, 1, "orig parent"); @@ -794,7 +794,7 @@ static bool test_speed(void) int i; struct timeval tv; - printf("test: speed [\nTALLOC VS MALLOC SPEED\n]\n"); + printf("test: speed\n# TALLOC VS MALLOC SPEED\n"); tv = timeval_current(); count = 0; @@ -840,7 +840,7 @@ static bool test_lifeless(void) char *parent, *child; void *child_owner = talloc_new(NULL); - printf("test: lifeless [\nTALLOC_UNLINK LOOP\n]\n"); + printf("test: lifeless\n# TALLOC_UNLINK LOOP\n"); parent = talloc_strdup(top, "parent"); child = talloc_strdup(parent, "child"); @@ -874,7 +874,7 @@ static bool test_loop(void) char *req2, *req3; } *req1; - printf("test: loop [\nTALLOC LOOP DESTRUCTION\n]\n"); + printf("test: loop\n# TALLOC LOOP DESTRUCTION\n"); parent = talloc_strdup(top, "parent"); req1 = talloc(parent, struct req1); @@ -908,7 +908,7 @@ static bool test_free_parent_deny_child(void) char *level2; char *level3; - printf("test: free_parent_deny_child [\nTALLOC FREE PARENT DENY CHILD\n]\n"); + printf("test: free_parent_deny_child\n# TALLOC FREE PARENT DENY CHILD\n"); level1 = talloc_strdup(top, "level1"); level2 = talloc_strdup(level1, "level2"); @@ -938,7 +938,7 @@ static bool test_talloc_ptrtype(void) const char *location3; const char *location4; - printf("test: ptrtype [\nTALLOC PTRTYPE\n]\n"); + printf("test: ptrtype\n# TALLOC PTRTYPE\n"); s1 = talloc_ptrtype(top, s1);location1 = __location__; @@ -1024,7 +1024,7 @@ static bool test_talloc_free_in_destructor(void) void *level4; void **level5; - printf("test: free_in_destructor [\nTALLOC FREE IN DESTRUCTOR\n]\n"); + printf("test: free_in_destructor\n# TALLOC FREE IN DESTRUCTOR\n"); level0 = talloc_new(NULL); level1 = talloc_new(level0); @@ -1053,7 +1053,7 @@ static bool test_autofree(void) #if _SAMBA_BUILD_ < 4 /* autofree test would kill smbtorture */ void *p; - printf("test: autofree [\nTALLOC AUTOFREE CONTEXT\n]\n"); + printf("test: autofree\n# TALLOC AUTOFREE CONTEXT\n"); p = talloc_autofree_context(); talloc_free(p); -- cgit From 82037a75eae9deaf6ec80b5ecc3bb89aab6e6dd8 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 30 Aug 2007 23:15:12 +0000 Subject: r24814: Fix headers, trim core.h even more. (This used to be commit 9647f860bdd5c0a74583e886182bd041a45e7655) --- source4/lib/talloc/config.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 714ad72d1c..0f138aafcd 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -5,7 +5,7 @@ VERSION = 0.0.1 SO_VERSION = 0 OBJ_FILES = talloc.o MANPAGE = talloc.3 -CFLAGS = -Ilib/talloc +CFLAGS = -I$(srcdir)/lib/talloc PUBLIC_HEADERS = talloc.h DESCRIPTION = A hierarchical pool based memory system with destructors # -- cgit From d8a5ed33b36d7666b04673298a9b67f06cc36687 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 12 Sep 2007 21:41:36 +0000 Subject: r25116: Fix talloc_asprintf_append to do the right thing with truncated strings. Jeremy. (This used to be commit 948d32bb62b0e8c68cc961a380eae602ffc71870) --- source4/lib/talloc/talloc.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index c073a8c774..c3e5d2c076 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1226,8 +1226,7 @@ char *talloc_asprintf(const void *t, const char *fmt, ...) * accumulating output into a string buffer. **/ char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) -{ - struct talloc_chunk *tc; +{ int len, s_len; va_list ap2; char c; @@ -1236,9 +1235,7 @@ char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) return talloc_vasprintf(NULL, fmt, ap); } - tc = talloc_chunk_from_ptr(s); - - s_len = tc->size - 1; + s_len = strlen(s); va_copy(ap2, ap); len = vsnprintf(&c, 1, fmt, ap2); -- cgit From 151f422247e4f9a9645baf639adaf2dbd9557f13 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 14 Sep 2007 17:40:58 +0000 Subject: r25164: Add talloc_asprintf_append_buffer() and the docs for it. Jeremy. (This used to be commit 5bb8613b86a6788efde840d5b50710f9afd22fed) --- source4/lib/talloc/talloc.c | 65 +++++++++++++++++++++++++++++++++++-- source4/lib/talloc/talloc.h | 2 ++ source4/lib/talloc/talloc_guide.txt | 19 +++++++++-- 3 files changed, 82 insertions(+), 4 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index c3e5d2c076..7920a66d64 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1223,7 +1223,8 @@ char *talloc_asprintf(const void *t, const char *fmt, ...) /** * Realloc @p s to append the formatted result of @p fmt and @p ap, * and return @p s, which may have moved. Good for gradually - * accumulating output into a string buffer. + * accumulating output into a string buffer. Appends at the end + * of the string. **/ char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) { @@ -1245,7 +1246,52 @@ char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) /* Either the vsnprintf failed or the format resulted in * no characters being formatted. In the former case, we * ought to return NULL, in the latter we ought to return - * the original string. Most current callers of this + * the original string. Most current callers of this + * function expect it to never return NULL. + */ + return s; + } + + s = talloc_realloc(NULL, s, char, s_len + len+1); + if (!s) return NULL; + + va_copy(ap2, ap); + vsnprintf(s+s_len, len+1, fmt, ap2); + va_end(ap2); + _talloc_set_name_const(s, s); + + return s; +} + +/** + * Realloc @p s to append the formatted result of @p fmt and @p ap, + * and return @p s, which may have moved. Always appends at the + * end of the talloc'ed buffer, not the end of the string. + **/ +char *talloc_vasprintf_append_buffer(char *s, const char *fmt, va_list ap) +{ + struct talloc_chunk *tc; + int len, s_len; + va_list ap2; + char c; + + if (s == NULL) { + return talloc_vasprintf(NULL, fmt, ap); + } + + tc = talloc_chunk_from_ptr(s); + + s_len = tc->size - 1; + + va_copy(ap2, ap); + len = vsnprintf(&c, 1, fmt, ap2); + va_end(ap2); + + if (len <= 0) { + /* Either the vsnprintf failed or the format resulted in + * no characters being formatted. In the former case, we + * ought to return NULL, in the latter we ought to return + * the original string. Most current callers of this * function expect it to never return NULL. */ return s; @@ -1277,6 +1323,21 @@ char *talloc_asprintf_append(char *s, const char *fmt, ...) return s; } +/* + Realloc @p s to append the formatted result of @p fmt and return @p + s, which may have moved. Good for gradually accumulating output + into a buffer. + */ +char *talloc_asprintf_append_buffer(char *s, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + s = talloc_vasprintf_append_buffer(s, fmt, ap); + va_end(ap); + return s; +} + /* alloc an array, checking for integer overflow in the array size */ diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 15130d0d98..95152a1416 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -157,8 +157,10 @@ char *talloc_strndup(const void *t, const char *p, size_t n); char *talloc_append_string(const void *t, char *orig, const char *append); char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); +char *talloc_vasprintf_append_buffer(char *s, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); char *talloc_asprintf_append(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); +char *talloc_asprintf_append_buffer(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name); void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name); void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name); diff --git a/source4/lib/talloc/talloc_guide.txt b/source4/lib/talloc/talloc_guide.txt index c4634ae19a..18663b370d 100644 --- a/source4/lib/talloc/talloc_guide.txt +++ b/source4/lib/talloc/talloc_guide.txt @@ -568,8 +568,23 @@ string. This is equivalent to: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- char *talloc_asprintf_append(char *s, const char *fmt, ...); +The talloc_asprintf_append() function appends the given formatted +string to the given string. +Use this varient when the string in the current talloc buffer may +have been truncated in length. + +This functions sets the name of the new pointer to the new +string. This is equivalent to: + talloc_set_name_const(ptr, ptr) + + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +char *talloc_asprintf_append_buffer(char *s, const char *fmt, ...); + The talloc_asprintf_append() function appends the given formatted -string to the given string. +string to the end of the currently allocated talloc buffer. +Use this varient when the string in the current talloc buffer has +not been changed. This functions sets the name of the new pointer to the new string. This is equivalent to: @@ -577,7 +592,7 @@ string. This is equivalent to: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -(type *)talloc_array(const void *ctx, type, uint_t count); +((type *)talloc_array(const void *ctx, type, uint_t count); The talloc_array() macro is equivalent to: -- cgit From 9a012df08ee829c1d40fc88ba12a0ea479f60be0 Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 14 Sep 2007 23:21:00 +0000 Subject: r25175: Change to talloc_asprintf_append_buffer(). Jeremy. (This used to be commit 0844dbf597191b3e4d35a696695b229e986daec4) --- source4/lib/talloc/testsuite.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index ddf6865b1a..e16c91f8b9 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -419,15 +419,15 @@ static bool test_misc(void) p2 = talloc_strndup(p1, "foo", 2); torture_assert("misc", strcmp("fo", p2) == 0, "strndup doesn't work\n"); - p2 = talloc_asprintf_append(p2, "o%c", 'd'); + p2 = talloc_asprintf_append_buffer(p2, "o%c", 'd'); torture_assert("misc", strcmp("food", p2) == 0, - "talloc_asprintf_append doesn't work\n"); + "talloc_asprintf_append_buffer doesn't work\n"); CHECK_BLOCKS("misc", p2, 1); CHECK_BLOCKS("misc", p1, 3); - p2 = talloc_asprintf_append(NULL, "hello %s", "world"); + p2 = talloc_asprintf_append_buffer(NULL, "hello %s", "world"); torture_assert("misc", strcmp("hello world", p2) == 0, - "talloc_asprintf_append doesn't work\n"); + "talloc_asprintf_append_buffer doesn't work\n"); CHECK_BLOCKS("misc", p2, 1); CHECK_BLOCKS("misc", p1, 3); talloc_free(p2); -- cgit From 122888052f1b1e230c12d8eedde931ea1c897261 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sun, 16 Sep 2007 14:34:33 +0000 Subject: r25190: Update talloc version to 1.1.0 after API-incompatible changes. (This used to be commit 66000a1fa2365cd8a08e3ecaaa116b27eb74e8b8) --- source4/lib/talloc/configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/configure.ac b/source4/lib/talloc/configure.ac index e1e84b25c3..afc2a944f0 100644 --- a/source4/lib/talloc/configure.ac +++ b/source4/lib/talloc/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ(2.50) -AC_INIT(talloc, 1.0.1) +AC_INIT(talloc, 1.1.0) AC_CONFIG_SRCDIR([talloc.c]) AC_SUBST(datarootdir) AC_CONFIG_HEADER(config.h) -- cgit From 063daf6ab58dfe5f2d01da0f566a58c0cc77cde0 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 18 Sep 2007 11:50:39 +0000 Subject: r25205: $(srcdir) isn't expanded here... metze (This used to be commit 4bce808917e296a0d50f39516da06bfb12418cf8) --- source4/lib/talloc/config.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 0f138aafcd..714ad72d1c 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -5,7 +5,7 @@ VERSION = 0.0.1 SO_VERSION = 0 OBJ_FILES = talloc.o MANPAGE = talloc.3 -CFLAGS = -I$(srcdir)/lib/talloc +CFLAGS = -Ilib/talloc PUBLIC_HEADERS = talloc.h DESCRIPTION = A hierarchical pool based memory system with destructors # -- cgit From 3e58b6fd46518abfd6b6b86623448cae63606bc0 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 18 Sep 2007 11:51:41 +0000 Subject: r25206: unify logic of talloc_strdup() and talloc_strndup(), only strlen() vs. strnlen() is the difference now. metze (This used to be commit 92106e6b7e4ed3b6e1aa942b6dc8ae52fdf5805b) --- source4/lib/talloc/talloc.c | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 7920a66d64..d4c845fa88 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1109,20 +1109,27 @@ void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name return newp; } +static inline char *__talloc_strlendup(const void *t, const char *p, size_t len) +{ + char *ret; + + ret = (char *)__talloc(t, len + 1); + if (unlikely(!ret)) return NULL; + + memcpy(ret, p, len); + ret[len] = 0; + + _talloc_set_name_const(ret, ret); + return ret; +} + /* - strdup with a talloc + strdup with a talloc */ char *talloc_strdup(const void *t, const char *p) { - char *ret; - if (!p) { - return NULL; - } - ret = (char *)talloc_memdup(t, p, strlen(p) + 1); - if (likely(ret)) { - _talloc_set_name_const(ret, ret); - } - return ret; + if (unlikely(!p)) return NULL; + return __talloc_strlendup(t, p, strlen(p)); } /* @@ -1152,21 +1159,12 @@ char *talloc_append_string(const void *t, char *orig, const char *append) } /* - strndup with a talloc + strndup with a talloc */ char *talloc_strndup(const void *t, const char *p, size_t n) { - size_t len; - char *ret; - - for (len=0; len Date: Tue, 18 Sep 2007 11:52:35 +0000 Subject: r25207: remove one nesting level and use unlikely() metze (This used to be commit c2931540bc6e2d7665ef46a123f1c0618c3b55b7) --- source4/lib/talloc/talloc.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index d4c845fa88..92970426e8 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1186,18 +1186,18 @@ char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) va_copy(ap2, ap); len = vsnprintf(&c, 1, fmt, ap2); va_end(ap2); - if (len < 0) { + if (unlikely(len < 0)) { return NULL; } ret = (char *)__talloc(t, len+1); - if (ret) { - va_copy(ap2, ap); - vsnprintf(ret, len+1, fmt, ap2); - va_end(ap2); - _talloc_set_name_const(ret, ret); - } + if (unlikely(!ret)) return NULL; + + va_copy(ap2, ap); + vsnprintf(ret, len+1, fmt, ap2); + va_end(ap2); + _talloc_set_name_const(ret, ret); return ret; } -- cgit From 46d369b0f0ad9213e461457ec960cb43ec918ebe Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 18 Sep 2007 11:54:10 +0000 Subject: r25208: add talloc_str[n]dup_append[_buffer]() functions metze (This used to be commit 8532076720ddaf3409db1196550cd7c6884380fc) --- source4/lib/talloc/talloc.c | 96 +++++++++++++++++++++++++++++++++++++++++++++ source4/lib/talloc/talloc.h | 27 ++++++++----- 2 files changed, 114 insertions(+), 9 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 92970426e8..0b4d977aa7 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1167,6 +1167,102 @@ char *talloc_strndup(const void *t, const char *p, size_t n) return __talloc_strlendup(t, p, strnlen(p, n)); } +static inline char *__talloc_strlendup_append(char *s, size_t slen, + const char *a, size_t alen) +{ + char *ret; + + ret = talloc_realloc(NULL, s, char, slen + alen + 1); + if (unlikely(!ret)) return NULL; + + /* append the string and the trailing \0 */ + memcpy(&ret[slen], a, alen); + ret[slen+alen] = 0; + + _talloc_set_name_const(ret, ret); + return ret; +} + +/* + * Appends at the end of the string. + */ +char *talloc_strdup_append(char *s, const char *a) +{ + if (unlikely(!s)) { + return talloc_strdup(NULL, a); + } + + if (unlikely(!a)) { + return s; + } + + return __talloc_strlendup_append(s, strlen(s), a, strlen(a)); +} + +/* + * Appends at the end of the talloc'ed buffer, + * not the end of the string. + */ +char *talloc_strdup_append_buffer(char *s, const char *a) +{ + size_t slen; + + if (unlikely(!s)) { + return talloc_strdup(NULL, a); + } + + if (unlikely(!a)) { + return s; + } + + slen = talloc_get_size(s); + if (likely(slen > 0)) { + slen--; + } + + return __talloc_strlendup_append(s, slen, a, strlen(a)); +} + +/* + * Appends at the end of the string. + */ +char *talloc_strndup_append(char *s, const char *a, size_t n) +{ + if (unlikely(!s)) { + return talloc_strdup(NULL, a); + } + + if (unlikely(!a)) { + return s; + } + + return __talloc_strlendup_append(s, strlen(s), a, strnlen(a, n)); +} + +/* + * Appends at the end of the talloc'ed buffer, + * not the end of the string. + */ +char *talloc_strndup_append_buffer(char *s, const char *a, size_t n) +{ + size_t slen; + + if (unlikely(!s)) { + return talloc_strdup(NULL, a); + } + + if (unlikely(!a)) { + return s; + } + + slen = talloc_get_size(s); + if (likely(slen > 0)) { + slen--; + } + + return __talloc_strlendup_append(s, slen, a, strnlen(a, n)); +} + #ifndef HAVE_VA_COPY #ifdef HAVE___VA_COPY #define va_copy(dest, src) __va_copy(dest, src) diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 95152a1416..72af4dbfa8 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -152,15 +152,6 @@ void talloc_enable_leak_report(void); void talloc_enable_leak_report_full(void); void *_talloc_zero(const void *ctx, size_t size, const char *name); void *_talloc_memdup(const void *t, const void *p, size_t size, const char *name); -char *talloc_strdup(const void *t, const char *p); -char *talloc_strndup(const void *t, const char *p, size_t n); -char *talloc_append_string(const void *t, char *orig, const char *append); -char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); -char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); -char *talloc_vasprintf_append_buffer(char *s, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); -char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); -char *talloc_asprintf_append(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); -char *talloc_asprintf_append_buffer(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); void *_talloc_array(const void *ctx, size_t el_size, unsigned count, const char *name); void *_talloc_zero_array(const void *ctx, size_t el_size, unsigned count, const char *name); void *_talloc_realloc_array(const void *ctx, void *ptr, size_t el_size, unsigned count, const char *name); @@ -171,4 +162,22 @@ void *talloc_find_parent_byname(const void *ctx, const char *name); void talloc_show_parents(const void *context, FILE *file); int talloc_is_parent(const void *context, const void *ptr); +char *talloc_strdup(const void *t, const char *p); +char *talloc_strdup_append(char *s, const char *a); +char *talloc_strdup_append_buffer(char *s, const char *a); + +char *talloc_strndup(const void *t, const char *p, size_t n); +char *talloc_strndup_append(char *s, const char *a, size_t n); +char *talloc_strndup_append_buffer(char *s, const char *a, size_t n); + +char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); +char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); +char *talloc_vasprintf_append_buffer(char *s, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); + +char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); +char *talloc_asprintf_append(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); +char *talloc_asprintf_append_buffer(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); + +char *talloc_append_string(const void *t, char *orig, const char *append); + #endif -- cgit From 4a40dd266991b051dbcc4a7eb87123d58b6d5ea5 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 18 Sep 2007 11:56:24 +0000 Subject: r25209: unify logic of talloc_vasprintf_append() and talloc_vasprintf_append_buffer() metze (This used to be commit 780c1c776e15f7224256a0ba0bda3e9f04702abe) --- source4/lib/talloc/talloc.c | 79 +++++++++++++++++---------------------------- 1 file changed, 29 insertions(+), 50 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 0b4d977aa7..033e70d2f9 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1313,30 +1313,18 @@ char *talloc_asprintf(const void *t, const char *fmt, ...) return ret; } - -/** - * Realloc @p s to append the formatted result of @p fmt and @p ap, - * and return @p s, which may have moved. Good for gradually - * accumulating output into a string buffer. Appends at the end - * of the string. - **/ -char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) +static inline char *__talloc_vaslenprintf_append(char *s, size_t slen, + const char *fmt, va_list ap) { - int len, s_len; + ssize_t alen; va_list ap2; char c; - if (s == NULL) { - return talloc_vasprintf(NULL, fmt, ap); - } - - s_len = strlen(s); - va_copy(ap2, ap); - len = vsnprintf(&c, 1, fmt, ap2); + alen = vsnprintf(&c, 1, fmt, ap2); va_end(ap2); - if (len <= 0) { + if (alen <= 0) { /* Either the vsnprintf failed or the format resulted in * no characters being formatted. In the former case, we * ought to return NULL, in the latter we ought to return @@ -1346,17 +1334,32 @@ char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) return s; } - s = talloc_realloc(NULL, s, char, s_len + len+1); + s = talloc_realloc(NULL, s, char, slen + alen + 1); if (!s) return NULL; va_copy(ap2, ap); - vsnprintf(s+s_len, len+1, fmt, ap2); + vsnprintf(s + slen, alen + 1, fmt, ap2); va_end(ap2); - _talloc_set_name_const(s, s); + _talloc_set_name_const(s, s); return s; } +/** + * Realloc @p s to append the formatted result of @p fmt and @p ap, + * and return @p s, which may have moved. Good for gradually + * accumulating output into a string buffer. Appends at the end + * of the string. + **/ +char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) +{ + if (unlikely(!s)) { + return talloc_vasprintf(NULL, fmt, ap); + } + + return __talloc_vaslenprintf_append(s, strlen(s), fmt, ap); +} + /** * Realloc @p s to append the formatted result of @p fmt and @p ap, * and return @p s, which may have moved. Always appends at the @@ -1364,42 +1367,18 @@ char *talloc_vasprintf_append(char *s, const char *fmt, va_list ap) **/ char *talloc_vasprintf_append_buffer(char *s, const char *fmt, va_list ap) { - struct talloc_chunk *tc; - int len, s_len; - va_list ap2; - char c; + size_t slen; - if (s == NULL) { + if (unlikely(!s)) { return talloc_vasprintf(NULL, fmt, ap); } - tc = talloc_chunk_from_ptr(s); - - s_len = tc->size - 1; - - va_copy(ap2, ap); - len = vsnprintf(&c, 1, fmt, ap2); - va_end(ap2); - - if (len <= 0) { - /* Either the vsnprintf failed or the format resulted in - * no characters being formatted. In the former case, we - * ought to return NULL, in the latter we ought to return - * the original string. Most current callers of this - * function expect it to never return NULL. - */ - return s; + slen = talloc_get_size(s); + if (likely(slen > 0)) { + slen--; } - s = talloc_realloc(NULL, s, char, s_len + len+1); - if (!s) return NULL; - - va_copy(ap2, ap); - vsnprintf(s+s_len, len+1, fmt, ap2); - va_end(ap2); - _talloc_set_name_const(s, s); - - return s; + return __talloc_vaslenprintf_append(s, slen, fmt, ap); } /* -- cgit From 3864520c9aacafb992f49bd4d3d2cf81f4b6256f Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 18 Sep 2007 13:25:48 +0000 Subject: r25211: fix compiler warning metze (This used to be commit c0d095c8c9c1f9a7a96771e20680c105f0cce308) --- source4/lib/talloc/talloc.c | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 033e70d2f9..ea32b3273a 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1313,6 +1313,10 @@ char *talloc_asprintf(const void *t, const char *fmt, ...) return ret; } +static inline char *__talloc_vaslenprintf_append(char *s, size_t slen, + const char *fmt, va_list ap) + PRINTF_ATTRIBUTE(3,0); + static inline char *__talloc_vaslenprintf_append(char *s, size_t slen, const char *fmt, va_list ap) { -- cgit From bc94aa19f30574dffcc56c98307dfab9772e6057 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 18 Sep 2007 13:45:43 +0000 Subject: r25216: make talloc_append_string() a deprecated macro instead of having it as a real function. metze (This used to be commit 2b2e8414650f4793e7fd6e7fb368383ee268948f) --- source4/lib/talloc/talloc.c | 26 -------------------------- source4/lib/talloc/talloc.h | 3 +-- 2 files changed, 1 insertion(+), 28 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index ea32b3273a..4d72c0e871 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1132,32 +1132,6 @@ char *talloc_strdup(const void *t, const char *p) return __talloc_strlendup(t, p, strlen(p)); } -/* - append to a talloced string -*/ -char *talloc_append_string(const void *t, char *orig, const char *append) -{ - char *ret; - size_t olen = strlen(orig); - size_t alenz; - - if (!append) - return orig; - - alenz = strlen(append) + 1; - - ret = talloc_realloc(t, orig, char, olen + alenz); - if (!ret) - return NULL; - - /* append the string with the trailing \0 */ - memcpy(&ret[olen], append, alenz); - - _talloc_set_name_const(ret, ret); - - return ret; -} - /* strndup with a talloc */ diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index 72af4dbfa8..e103391681 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -111,6 +111,7 @@ typedef void TALLOC_CTX; #define talloc_array_p(ctx, type, count) talloc_array(ctx, type, count) #define talloc_realloc_p(ctx, p, type, count) talloc_realloc(ctx, p, type, count) #define talloc_destroy(ctx) talloc_free(ctx) +#define talloc_append_string(c, s, a) (s?talloc_strdup_append(s,a):talloc_strdup(c, a)) #endif /* The following definitions come from talloc.c */ @@ -178,6 +179,4 @@ char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3) char *talloc_asprintf_append(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); char *talloc_asprintf_append_buffer(char *s, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); -char *talloc_append_string(const void *t, char *orig, const char *append); - #endif -- cgit From 4347f8fc37d5dd7315113ff4b8ce80a5427b53b9 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 6 Nov 2007 19:24:12 +0100 Subject: r25882: Build shared library of talloc as well. (This used to be commit 3692ba8299d4177289ca401fa467143ad14ccad4) --- source4/lib/talloc/Makefile.in | 19 +++++++++++++++++-- source4/lib/talloc/configure.ac | 5 +++++ 2 files changed, 22 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index 18b48c3459..c9fcddf35c 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -14,12 +14,23 @@ INSTALLCMD = @INSTALL@ CC = @CC@ CFLAGS = @CFLAGS@ -DHAVE_CONFIG_H= -I. -I@srcdir@ EXTRA_TARGETS = @DOC_TARGET@ +PICFLAG = @PICFLAG@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +SHLIBEXT = @SHLIBEXT@ +SHLD_FLAGS = @SHLD_FLAGS@ +SONAMEFLAG = @SONAMEFLAG@ .SUFFIXES: .c .o .3 .3.xml .xml .html LIBOBJ = @TALLOC_OBJ@ @LIBREPLACEOBJ@ -all: showflags libtalloc.a testsuite $(EXTRA_TARGETS) +SOLIB = libtalloc.$(SHLIBEXT).$(PACKAGE_VERSION) +SONAME = libtalloc.$(SHLIBEXT).1 + +.c.o: + $(CC) $(PICFLAG) -o $@ -c $< $(CFLAGS) + +all: showflags libtalloc.a $(SOLIB) testsuite $(EXTRA_TARGETS) showflags: @echo 'talloc will be compiled with flags:' @@ -33,10 +44,14 @@ libtalloc.a: $(LIBOBJ) ar -rv $@ $(LIBOBJ) @-ranlib $@ +$(SOLIB): $(LIBOBJ) + $(CC) $(SONAMEFLAG)$(SONAME) $(SHLD_FLAGS) -o $@ $^ + install: all ${INSTALLCMD} -d $(DESTDIR)$(libdir) ${INSTALLCMD} -d $(DESTDIR)$(libdir)/pkgconfig ${INSTALLCMD} -m 755 libtalloc.a $(DESTDIR)$(libdir) + ${INSTALLCMD} -m 755 $(SOLIB) $(DESTDIR)$(libdir) ${INSTALLCMD} -d $(DESTDIR)${includedir} ${INSTALLCMD} -m 644 $(srcdir)/talloc.h $(DESTDIR)$(includedir) ${INSTALLCMD} -m 644 talloc.pc $(DESTDIR)$(libdir)/pkgconfig @@ -52,7 +67,7 @@ doc: talloc.3 talloc.3.html -test -z "$(XSLTPROC)" || $(XSLTPROC) --nonet -o $@ http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl $< clean: - rm -f *~ $(LIBOBJ) libtalloc.a testsuite testsuite.o *.gc?? talloc.3 talloc.3.html + rm -f *~ $(LIBOBJ) $(SOLIB) libtalloc.a testsuite testsuite.o *.gc?? talloc.3 talloc.3.html test: testsuite ./testsuite diff --git a/source4/lib/talloc/configure.ac b/source4/lib/talloc/configure.ac index afc2a944f0..d76052007c 100644 --- a/source4/lib/talloc/configure.ac +++ b/source4/lib/talloc/configure.ac @@ -15,4 +15,9 @@ if test -n "$XSLTPROC"; then fi AC_SUBST(DOC_TARGET) +AC_LD_PICFLAG +AC_LD_SHLIBEXT +AC_LD_SONAMEFLAG +AC_LD_SHLDFLAGS + AC_OUTPUT(Makefile talloc.pc) -- cgit From 575678557b11d2ac344eaee6319b975d010de157 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 6 Nov 2007 19:53:33 +0100 Subject: r25884: Specify shldflags first, as required by some compilers. (This used to be commit 40a8cd0d2fd4d10110243ee75ff92bef73bb06b9) --- source4/lib/talloc/Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index c9fcddf35c..3da96cd457 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -45,7 +45,7 @@ libtalloc.a: $(LIBOBJ) @-ranlib $@ $(SOLIB): $(LIBOBJ) - $(CC) $(SONAMEFLAG)$(SONAME) $(SHLD_FLAGS) -o $@ $^ + $(CC) $(SHLD_FLAGS) $(SONAMEFLAG)$(SONAME) -o $@ $^ install: all ${INSTALLCMD} -d $(DESTDIR)$(libdir) -- cgit From 0969ac9e6189d1b990ca86b7611341fe6a404b5e Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 14 Nov 2007 01:01:31 +0100 Subject: r25944: Fix handling of sonameflag on AIX, which doesn't have anything like that. (This used to be commit 228dd6830eb9c91287bb3e0233d8b3a404ff3676) --- source4/lib/talloc/Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index 3da96cd457..619a8d008d 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -45,7 +45,7 @@ libtalloc.a: $(LIBOBJ) @-ranlib $@ $(SOLIB): $(LIBOBJ) - $(CC) $(SHLD_FLAGS) $(SONAMEFLAG)$(SONAME) -o $@ $^ + $(CC) $(SHLD_FLAGS) -o $@ $^ $(SONAMEFLAG)$(SONAME) install: all ${INSTALLCMD} -d $(DESTDIR)$(libdir) -- cgit From 35efbc84c73a2c9f9bdbdfb0faf624721505fe9e Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 14 Nov 2007 10:51:32 +0100 Subject: r25953: AIX make doesn't support $^. (This used to be commit 91133d27110ee6447dbc64f1c8d52cb90ca1a86c) --- source4/lib/talloc/Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index 619a8d008d..74c9557925 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -45,7 +45,7 @@ libtalloc.a: $(LIBOBJ) @-ranlib $@ $(SOLIB): $(LIBOBJ) - $(CC) $(SHLD_FLAGS) -o $@ $^ $(SONAMEFLAG)$(SONAME) + $(CC) $(SHLD_FLAGS) -o $@ $(LIBOBJ) $(SONAMEFLAG)$(SONAME) install: all ${INSTALLCMD} -d $(DESTDIR)$(libdir) -- cgit From 911fbed635d268495887f5c7f8727b8de6db67fc Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 15 Nov 2007 15:41:03 +0100 Subject: r25973: talloc: fix usage of SONAMEFLAG metze (This used to be commit 7fecb8f3cd9f5f69dce7b9e566011e5de1e01a4a) --- source4/lib/talloc/Makefile.in | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index 74c9557925..6eee227f7a 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -18,7 +18,6 @@ PICFLAG = @PICFLAG@ PACKAGE_VERSION = @PACKAGE_VERSION@ SHLIBEXT = @SHLIBEXT@ SHLD_FLAGS = @SHLD_FLAGS@ -SONAMEFLAG = @SONAMEFLAG@ .SUFFIXES: .c .o .3 .3.xml .xml .html @@ -45,7 +44,7 @@ libtalloc.a: $(LIBOBJ) @-ranlib $@ $(SOLIB): $(LIBOBJ) - $(CC) $(SHLD_FLAGS) -o $@ $(LIBOBJ) $(SONAMEFLAG)$(SONAME) + $(CC) $(SHLD_FLAGS) -o $@ $(LIBOBJ) @SONAMEFLAG@$(SONAME) install: all ${INSTALLCMD} -d $(DESTDIR)$(libdir) -- cgit From 676bb230fcb310e56ef6cc9f15e257ffca4304ba Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 16 Nov 2007 10:10:58 +0100 Subject: r25987: libreplace: rename AC_LD_SHLDFLAGS into AC_LIBREPLACE_SHLD_FLAGS metze (This used to be commit 410cdf789a72209f9e10321519fe18ab40a43f95) --- source4/lib/talloc/configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/configure.ac b/source4/lib/talloc/configure.ac index d76052007c..e5f9575f22 100644 --- a/source4/lib/talloc/configure.ac +++ b/source4/lib/talloc/configure.ac @@ -18,6 +18,6 @@ AC_SUBST(DOC_TARGET) AC_LD_PICFLAG AC_LD_SHLIBEXT AC_LD_SONAMEFLAG -AC_LD_SHLDFLAGS +AC_LIBREPLACE_SHLD_FLAGS AC_OUTPUT(Makefile talloc.pc) -- cgit From 08d4a44f927b52bcb16c8cc81cf849dcffa01061 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 16 Nov 2007 10:17:26 +0100 Subject: r25990: talloc: use AC_LIBREPLACE_SHLD and use it for linking the shared library metze (This used to be commit c179807165b84dd832ab64f794034960668e5957) --- source4/lib/talloc/Makefile.in | 3 ++- source4/lib/talloc/configure.ac | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index 6eee227f7a..7110b04e12 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -17,6 +17,7 @@ EXTRA_TARGETS = @DOC_TARGET@ PICFLAG = @PICFLAG@ PACKAGE_VERSION = @PACKAGE_VERSION@ SHLIBEXT = @SHLIBEXT@ +SHLD = @SHLD@ SHLD_FLAGS = @SHLD_FLAGS@ .SUFFIXES: .c .o .3 .3.xml .xml .html @@ -44,7 +45,7 @@ libtalloc.a: $(LIBOBJ) @-ranlib $@ $(SOLIB): $(LIBOBJ) - $(CC) $(SHLD_FLAGS) -o $@ $(LIBOBJ) @SONAMEFLAG@$(SONAME) + $(SHLD) $(SHLD_FLAGS) -o $@ $(LIBOBJ) @SONAMEFLAG@$(SONAME) install: all ${INSTALLCMD} -d $(DESTDIR)$(libdir) diff --git a/source4/lib/talloc/configure.ac b/source4/lib/talloc/configure.ac index e5f9575f22..7878d59300 100644 --- a/source4/lib/talloc/configure.ac +++ b/source4/lib/talloc/configure.ac @@ -18,6 +18,7 @@ AC_SUBST(DOC_TARGET) AC_LD_PICFLAG AC_LD_SHLIBEXT AC_LD_SONAMEFLAG +AC_LIBREPLACE_SHLD AC_LIBREPLACE_SHLD_FLAGS AC_OUTPUT(Makefile talloc.pc) -- cgit From c027a0d111bf52716de073e456f0a93d909e870c Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 21 Nov 2007 12:31:23 +0100 Subject: r26072: Import trivial SWIG wrapper for talloc. (This used to be commit 02d259c2c45c03dbfcd16173df93d7ba96ed1419) --- source4/lib/talloc/talloc.i | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 source4/lib/talloc/talloc.i (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.i b/source4/lib/talloc/talloc.i new file mode 100644 index 0000000000..c35d5d2411 --- /dev/null +++ b/source4/lib/talloc/talloc.i @@ -0,0 +1,24 @@ +/* + Unix SMB/CIFS implementation. + Copyright (C) Jelmer Vernooij 2007 + + 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 3 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, see . +*/ + +/* Don't expose talloc contexts in Python code. Python does reference + counting for us, so just create a new top-level talloc context. + */ +%typemap(in, numinputs=0) TALLOC_CTX * { + $1 = NULL; +} -- cgit From f023784d066f25135c2e54e91475418e80070873 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 28 Nov 2007 22:41:34 +0100 Subject: r26187: Fix module name, indentation. (This used to be commit ef790ebf3a712dbbb85d6af65c804199c2c084fc) --- source4/lib/talloc/talloc.i | 2 ++ 1 file changed, 2 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.i b/source4/lib/talloc/talloc.i index c35d5d2411..593c20465e 100644 --- a/source4/lib/talloc/talloc.i +++ b/source4/lib/talloc/talloc.i @@ -19,6 +19,8 @@ /* Don't expose talloc contexts in Python code. Python does reference counting for us, so just create a new top-level talloc context. */ +%module talloc; + %typemap(in, numinputs=0) TALLOC_CTX * { $1 = NULL; } -- cgit From f2f16b45b58c2bbf3053ff55e7a290fc069e0efd Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Thu, 29 Nov 2007 14:49:47 +0100 Subject: r26197: Add bindings for libsecurity. (This used to be commit 8625cd403ba3a7d2b1b1fccfeb5efd7e21de0135) --- source4/lib/talloc/config.mk | 9 ++------- source4/lib/talloc/talloc.i | 2 -- 2 files changed, 2 insertions(+), 9 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 714ad72d1c..942ced6b86 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -1,13 +1,8 @@ -################################################ -# Start LIBRARY LIBTALLOC [LIBRARY::LIBTALLOC] -VERSION = 0.0.1 -SO_VERSION = 0 +VERSION = 1.0.0 +SO_VERSION = 1 OBJ_FILES = talloc.o MANPAGE = talloc.3 CFLAGS = -Ilib/talloc PUBLIC_HEADERS = talloc.h DESCRIPTION = A hierarchical pool based memory system with destructors -# -# End LIBRARY LIBTALLOC -################################################ diff --git a/source4/lib/talloc/talloc.i b/source4/lib/talloc/talloc.i index 593c20465e..c35d5d2411 100644 --- a/source4/lib/talloc/talloc.i +++ b/source4/lib/talloc/talloc.i @@ -19,8 +19,6 @@ /* Don't expose talloc contexts in Python code. Python does reference counting for us, so just create a new top-level talloc context. */ -%module talloc; - %typemap(in, numinputs=0) TALLOC_CTX * { $1 = NULL; } -- cgit From 71ae20df2c7e346c4b115bbed7c579c881369fdb Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 4 Dec 2007 01:37:28 +0100 Subject: r26276: Install SWIG files if swig is present. (This used to be commit dfd5b456f932268e2b1a82e2775037d356b9483e) --- source4/lib/talloc/Makefile.in | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index 7110b04e12..e872ec42cf 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -57,6 +57,7 @@ install: all ${INSTALLCMD} -m 644 talloc.pc $(DESTDIR)$(libdir)/pkgconfig if [ -f talloc.3 ];then ${INSTALLCMD} -d $(DESTDIR)$(mandir)/man3; fi if [ -f talloc.3 ];then ${INSTALLCMD} -m 644 talloc.3 $(DESTDIR)$(mandir)/man3; fi + which swig >/dev/null 2>&1 && ${INSTALLCMD} -m 644 talloc.i $(DESTDIR)`swig -swiglib` doc: talloc.3 talloc.3.html -- cgit From 74384590f31b7df27c13a988f5642801592a4a72 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 4 Dec 2007 02:04:25 +0100 Subject: r26280: Fix installation if swig is not available. (This used to be commit 3320bd401f7b669bd62f83bf16a1c16ad0543a5c) --- source4/lib/talloc/Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index e872ec42cf..1aa35bdb39 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -57,7 +57,7 @@ install: all ${INSTALLCMD} -m 644 talloc.pc $(DESTDIR)$(libdir)/pkgconfig if [ -f talloc.3 ];then ${INSTALLCMD} -d $(DESTDIR)$(mandir)/man3; fi if [ -f talloc.3 ];then ${INSTALLCMD} -m 644 talloc.3 $(DESTDIR)$(mandir)/man3; fi - which swig >/dev/null 2>&1 && ${INSTALLCMD} -m 644 talloc.i $(DESTDIR)`swig -swiglib` + which swig >/dev/null 2>&1 && ${INSTALLCMD} -m 644 talloc.i $(DESTDIR)`swig -swiglib` || true doc: talloc.3 talloc.3.html -- cgit From 6525b064730346f21eb007d79fe23c72a0033854 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 4 Dec 2007 18:24:16 +0100 Subject: r26292: Make sure swig directory exists. (This used to be commit 7962d221fcb877c9fd3bbc890827338de54ca94a) --- source4/lib/talloc/Makefile.in | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index 1aa35bdb39..a33085f95b 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -57,6 +57,7 @@ install: all ${INSTALLCMD} -m 644 talloc.pc $(DESTDIR)$(libdir)/pkgconfig if [ -f talloc.3 ];then ${INSTALLCMD} -d $(DESTDIR)$(mandir)/man3; fi if [ -f talloc.3 ];then ${INSTALLCMD} -m 644 talloc.3 $(DESTDIR)$(mandir)/man3; fi + which swig >/dev/null 2>&1 && ${INSTALLCMD} -d $(DESTDIR)`swig -swiglib` || true which swig >/dev/null 2>&1 && ${INSTALLCMD} -m 644 talloc.i $(DESTDIR)`swig -swiglib` || true doc: talloc.3 talloc.3.html -- cgit From df8c7da800f75ff45fb48de59d7ce3f0667d375f Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 14 Dec 2007 14:28:07 +0100 Subject: r26454: Add simple SWIG macro for wrapping talloced types. (This used to be commit 760fcc8bfa2a7cd7641465cb3bae889e9e0fbc75) --- source4/lib/talloc/talloc.i | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.i b/source4/lib/talloc/talloc.i index c35d5d2411..c852ae8f9f 100644 --- a/source4/lib/talloc/talloc.i +++ b/source4/lib/talloc/talloc.i @@ -22,3 +22,10 @@ %typemap(in, numinputs=0) TALLOC_CTX * { $1 = NULL; } + +%define %talloctype(TYPE) +%nodefaultctor TYPE; +%extend TYPE { + ~TYPE() { talloc_free($self); } +} +%enddef -- cgit From ac4237e9971bd50ef194f2166365ff91af4dbfaa Mon Sep 17 00:00:00 2001 From: Kai Blin Date: Mon, 17 Dec 2007 18:31:16 +0100 Subject: r26511: Janitorial: Fix a warning for the 'printf' attribute on gendb_search_v While at it, also add a PRINTF_ATTRIBUTE for talloc_vasprintf. (This used to be commit 5b3a8c8ae195e6a98357a407a0699493f54a8b79) --- source4/lib/talloc/talloc.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 4d72c0e871..6661c10bb5 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1245,13 +1245,15 @@ char *talloc_strndup_append_buffer(char *s, const char *a, size_t n) #endif #endif +char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); + char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) -{ +{ int len; char *ret; va_list ap2; char c; - + /* this call looks strange, but it makes it work on older solaris boxes */ va_copy(ap2, ap); len = vsnprintf(&c, 1, fmt, ap2); @@ -1276,6 +1278,7 @@ char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) Perform string formatting, and return a pointer to newly allocated memory holding the result, inside a memory pool. */ +char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); char *talloc_asprintf(const void *t, const char *fmt, ...) { va_list ap; -- cgit From f6c80d0d9cdc24694174c31c51ecaa563f3e6e8c Mon Sep 17 00:00:00 2001 From: Kai Blin Date: Mon, 17 Dec 2007 20:18:02 +0100 Subject: r26514: Revert the talloc.c part of r26511, as talloc.h already takes care of thois. Thanks to metze for pointing this out (This used to be commit 4a5e1047fff0620aa534b147ac7e0bd0416a8fe7) --- source4/lib/talloc/talloc.c | 3 --- 1 file changed, 3 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 6661c10bb5..f9aefcd6de 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -1245,8 +1245,6 @@ char *talloc_strndup_append_buffer(char *s, const char *a, size_t n) #endif #endif -char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(2,0); - char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) { int len; @@ -1278,7 +1276,6 @@ char *talloc_vasprintf(const void *t, const char *fmt, va_list ap) Perform string formatting, and return a pointer to newly allocated memory holding the result, inside a memory pool. */ -char *talloc_asprintf(const void *t, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); char *talloc_asprintf(const void *t, const char *fmt, ...) { va_list ap; -- cgit From aa0a06f13c44e0eca0b3f2f0c34f0f7995b87159 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Sun, 23 Dec 2007 19:19:41 -0600 Subject: r26570: - Trim size of the swig-generated Python bindings by removing a bunch of {}'s. - Start working on Python equivalents for various EJS tests. - Fix regression in argument order for reg_diff_apply() in EJS bindings. (This used to be commit c550c03372cb260b78f6a6c132e70571bc4cb852) --- source4/lib/talloc/talloc.i | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.i b/source4/lib/talloc/talloc.i index c852ae8f9f..a9afb97ed7 100644 --- a/source4/lib/talloc/talloc.i +++ b/source4/lib/talloc/talloc.i @@ -19,7 +19,7 @@ /* Don't expose talloc contexts in Python code. Python does reference counting for us, so just create a new top-level talloc context. */ -%typemap(in, numinputs=0) TALLOC_CTX * { +%typemap(in, numinputs=0, noblock=1) TALLOC_CTX * { $1 = NULL; } -- cgit From cc984e4046726696a0e71a0fda488e947ccd05eb Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 22 Jan 2008 18:24:00 +0100 Subject: ldb/talloc/tdb: Use manually written pc file. (This used to be commit c8947fda23eb874a7694bdee1b4de605744c2769) --- source4/lib/talloc/config.mk | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 942ced6b86..c31f9a7515 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -2,6 +2,7 @@ VERSION = 1.0.0 SO_VERSION = 1 OBJ_FILES = talloc.o +PC_FILE = talloc.pc MANPAGE = talloc.3 CFLAGS = -Ilib/talloc PUBLIC_HEADERS = talloc.h -- cgit From a2595477869d5fee2f916bc857ca028e3b2fc677 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 22 Jan 2008 18:49:51 +0100 Subject: build: Remove support for DESCRIPTION setting that is now unused. (This used to be commit 91d7ba5202e6c375456a42c2c6861f63c7fcfc20) --- source4/lib/talloc/config.mk | 1 - 1 file changed, 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index c31f9a7515..16b5063f87 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -6,4 +6,3 @@ PC_FILE = talloc.pc MANPAGE = talloc.3 CFLAGS = -Ilib/talloc PUBLIC_HEADERS = talloc.h -DESCRIPTION = A hierarchical pool based memory system with destructors -- cgit From 44cb6a81f26aed44a5bdc383ad59c5fbd2789262 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 8 Jan 2008 22:42:27 +0100 Subject: Don't shrink a talloc area if we have less than 1k to gain (This used to be commit 0c829e6ee6f43299cc5889c2af3d0402256da0d0) --- source4/lib/talloc/talloc.c | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index f9aefcd6de..7aad42ce8c 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -787,6 +787,11 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n tc = talloc_chunk_from_ptr(ptr); + if ((size < tc->size) && ((tc->size - size) < 1024)) { + tc->size = size; + return ptr; + } + /* don't allow realloc on referenced pointers */ if (unlikely(tc->refs)) { return NULL; -- cgit From af406133c1aa736d6c2c8327cdc0f39b7592df92 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Wed, 9 Jan 2008 01:34:21 +0100 Subject: Fix talloctort: move size check after referenced ptr check. Michael (This used to be commit a0caedb94f6f7c62ae706e35a4c0b2876f74978d) --- source4/lib/talloc/talloc.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 7aad42ce8c..9e141ab5fd 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -787,16 +787,16 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n tc = talloc_chunk_from_ptr(ptr); - if ((size < tc->size) && ((tc->size - size) < 1024)) { - tc->size = size; - return ptr; - } - /* don't allow realloc on referenced pointers */ if (unlikely(tc->refs)) { return NULL; } + if ((size < tc->size) && ((tc->size - size) < 1024)) { + tc->size = size; + return ptr; + } + /* by resetting magic we catch users of the old memory */ tc->flags |= TALLOC_FLAG_FREE; -- cgit From 81abb395e02116eda0f0f3d00843e27fc158e1c0 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Wed, 9 Jan 2008 01:35:43 +0100 Subject: Add a comment. Michael (This used to be commit 2a2c28584cdb65fcea8563eb3bf21fea497fdff3) --- source4/lib/talloc/talloc.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 9e141ab5fd..0df00ed971 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -792,6 +792,7 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n return NULL; } + /* don't shrink if we have less than 1k to gain */ if ((size < tc->size) && ((tc->size - size) < 1024)) { tc->size = size; return ptr; -- cgit From 7a9033fb2d2057dc8104d9b6f22c94e83e36f8ce Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sat, 5 Jan 2008 18:26:54 +0100 Subject: Implement talloc_pool() A talloc pool is a chunk of memory that can be used as a context for further talloc calls. Allocations with the pool as the parent just chew from that memory by incrementing a pointer. If the talloc pool is full, then we fall back to the normal system-level malloc(3) to get memory. The use case for talloc pools is the transient memory that is used for handling a single SMB request. Incrementing a pointer will be way faster than any malloc implementation. There is a downside of this: If you use talloc_steal() to move something out of the pool, the whole pool memory is kept around until the last object inside the pool is freed. So if you talloc_free() the pool, it might happen that the memory is freed later. So don't hang anything off a talloc pool that should live long. Volker (This used to be commit 60ef9a84f0bd18d48e453c08aa420d17275e0881) --- source4/lib/talloc/talloc.c | 176 +++++++++++++++++++++++++++++++++++++++-- source4/lib/talloc/talloc.h | 1 + source4/lib/talloc/testsuite.c | 37 +++++++++ 3 files changed, 207 insertions(+), 7 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 0df00ed971..e38a4d6275 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -60,6 +60,8 @@ #define TALLOC_MAGIC 0xe814ec70 #define TALLOC_FLAG_FREE 0x01 #define TALLOC_FLAG_LOOP 0x02 +#define TALLOC_FLAG_POOL 0x04 /* This is a talloc pool */ +#define TALLOC_FLAG_POOLMEM 0x08 /* This is allocated in a pool */ #define TALLOC_MAGIC_REFERENCE ((const char *)1) /* by default we abort when given a bad pointer (such as when talloc_free() is called @@ -109,6 +111,19 @@ struct talloc_chunk { const char *name; size_t size; unsigned flags; + + /* + * "pool" has dual use: + * + * For the talloc pool itself (i.e. TALLOC_FLAG_POOL is set), "pool" + * marks the end of the currently allocated area. + * + * For members of the pool (i.e. TALLOC_FLAG_POOLMEM is set), "pool" + * is a pointer to the struct talloc_chunk of the pool that it was + * allocated from. This way children can quickly find the pool to chew + * from. + */ + void *pool; }; /* 16 byte alignment seems to keep everyone happy */ @@ -200,12 +215,82 @@ const char *talloc_parent_name(const void *ptr) return tc? tc->name : NULL; } +/* + A pool carries an in-pool object count count in the first 16 bytes. + bytes. This is done to support talloc_steal() to a parent outside of the + pool. The count includes the pool itself, so a talloc_free() on a pool will + only destroy the pool if the count has dropped to zero. A talloc_free() of a + pool member will reduce the count, and eventually also call free(3) on the + pool memory. + + The object count is not put into "struct talloc_chunk" because it is only + relevant for talloc pools and the alignment to 16 bytes would increase the + memory footprint of each talloc chunk by those 16 bytes. +*/ + +#define TALLOC_POOL_HDR_SIZE 16 + +static unsigned int *talloc_pool_objectcount(struct talloc_chunk *tc) +{ + return (unsigned int *)((char *)tc + sizeof(struct talloc_chunk)); +} + +/* + Allocate from a pool +*/ + +static struct talloc_chunk *talloc_alloc_pool(struct talloc_chunk *parent, + size_t size) +{ + struct talloc_chunk *pool_ctx = NULL; + size_t space_left; + struct talloc_chunk *result; + + if (parent == NULL) { + return NULL; + } + + if (parent->flags & TALLOC_FLAG_POOL) { + pool_ctx = parent; + } + else if (parent->flags & TALLOC_FLAG_POOLMEM) { + pool_ctx = (struct talloc_chunk *)parent->pool; + } + + if (pool_ctx == NULL) { + return NULL; + } + + space_left = ((char *)pool_ctx + TC_HDR_SIZE + pool_ctx->size) + - ((char *)pool_ctx->pool); + + /* + * Align size to 16 bytes + */ + size = ((size + 15) & ~15); + + if (space_left < size) { + return NULL; + } + + result = (struct talloc_chunk *)pool_ctx->pool; + + pool_ctx->pool = (void *)((char *)result + size); + + result->flags = TALLOC_MAGIC | TALLOC_FLAG_POOLMEM; + result->pool = pool_ctx; + + *talloc_pool_objectcount(pool_ctx) += 1; + + return result; +} + /* Allocate a bit of memory as a child of an existing pointer */ static inline void *__talloc(const void *context, size_t size) { - struct talloc_chunk *tc; + struct talloc_chunk *tc = NULL; if (unlikely(context == NULL)) { context = null_context; @@ -215,11 +300,19 @@ static inline void *__talloc(const void *context, size_t size) return NULL; } - tc = (struct talloc_chunk *)malloc(TC_HDR_SIZE+size); - if (unlikely(tc == NULL)) return NULL; + if (context != NULL) { + tc = talloc_alloc_pool(talloc_chunk_from_ptr(context), + TC_HDR_SIZE+size); + } + + if (tc == NULL) { + tc = (struct talloc_chunk *)malloc(TC_HDR_SIZE+size); + if (unlikely(tc == NULL)) return NULL; + tc->flags = TALLOC_MAGIC; + tc->pool = NULL; + } tc->size = size; - tc->flags = TALLOC_MAGIC; tc->destructor = NULL; tc->child = NULL; tc->name = NULL; @@ -245,6 +338,29 @@ static inline void *__talloc(const void *context, size_t size) return TC_PTR_FROM_CHUNK(tc); } +/* + * Create a talloc pool + */ + +void *talloc_pool(const void *context, size_t size) +{ + void *result = __talloc(context, size + TALLOC_POOL_HDR_SIZE); + struct talloc_chunk *tc; + + if (unlikely(result == NULL)) { + return NULL; + } + + tc = talloc_chunk_from_ptr(result); + + tc->flags |= TALLOC_FLAG_POOL; + tc->pool = (char *)result + TALLOC_POOL_HDR_SIZE; + + *talloc_pool_objectcount(tc) = 1; + + return result; +} + /* setup a destructor to be called on free of a pointer the destructor should return 0 on success, or -1 on failure. @@ -420,7 +536,29 @@ static inline int _talloc_free(void *ptr) } tc->flags |= TALLOC_FLAG_FREE; - free(tc); + + if (tc->flags & (TALLOC_FLAG_POOL|TALLOC_FLAG_POOLMEM)) { + struct talloc_chunk *pool; + unsigned int *pool_object_count; + + pool = (tc->flags & TALLOC_FLAG_POOL) + ? tc : (struct talloc_chunk *)tc->pool; + + pool_object_count = talloc_pool_objectcount(pool); + + if (*pool_object_count == 0) { + TALLOC_ABORT("Pool object count zero!"); + } + + *pool_object_count -= 1; + + if (*pool_object_count == 0) { + free(pool); + } + } + else { + free(tc); + } return 0; } @@ -718,6 +856,10 @@ void talloc_free_children(void *ptr) talloc_steal(new_parent, child); } } + + if (tc->flags & TALLOC_FLAG_POOL) { + tc->pool = ((char *)tc + TC_HDR_SIZE + TALLOC_POOL_HDR_SIZE); + } } /* @@ -769,6 +911,7 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n { struct talloc_chunk *tc; void *new_ptr; + bool malloced = false; /* size zero is equivalent to free() */ if (unlikely(size == 0)) { @@ -808,7 +951,23 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n free(tc); } #else - new_ptr = realloc(tc, size + TC_HDR_SIZE); + if (tc->flags & TALLOC_FLAG_POOLMEM) { + + new_ptr = talloc_alloc_pool(tc, size + TC_HDR_SIZE); + *talloc_pool_objectcount(tc->pool) -= 1; + + if (new_ptr == NULL) { + new_ptr = malloc(TC_HDR_SIZE+size); + malloced = true; + } + + if (new_ptr) { + memcpy(new_ptr, tc, MIN(tc->size,size) + TC_HDR_SIZE); + } + } + else { + new_ptr = realloc(tc, size + TC_HDR_SIZE); + } #endif if (unlikely(!new_ptr)) { tc->flags &= ~TALLOC_FLAG_FREE; @@ -816,7 +975,10 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n } tc = (struct talloc_chunk *)new_ptr; - tc->flags &= ~TALLOC_FLAG_FREE; + tc->flags &= ~TALLOC_FLAG_FREE; + if (malloced) { + tc->flags &= ~TALLOC_FLAG_POOLMEM; + } if (tc->parent) { tc->parent->child = tc; } diff --git a/source4/lib/talloc/talloc.h b/source4/lib/talloc/talloc.h index e103391681..5431971655 100644 --- a/source4/lib/talloc/talloc.h +++ b/source4/lib/talloc/talloc.h @@ -116,6 +116,7 @@ typedef void TALLOC_CTX; /* The following definitions come from talloc.c */ void *_talloc(const void *context, size_t size); +void *talloc_pool(const void *context, size_t size); void _talloc_set_destructor(const void *ptr, int (*destructor)(void *)); int talloc_increase_ref_count(const void *ptr); size_t talloc_reference_count(const void *ptr); diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index e16c91f8b9..fedbda95aa 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -813,6 +813,25 @@ static bool test_speed(void) talloc_free(ctx); + ctx = talloc_pool(NULL, 1024); + + tv = timeval_current(); + count = 0; + do { + void *p1, *p2, *p3; + for (i=0;i Date: Thu, 10 Jan 2008 11:34:07 +0100 Subject: Mark talloc_pool memory for valgrind (This used to be commit 6deca23b6c66616fbf5ba004e9b778aa68790df6) --- source4/lib/talloc/talloc.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index e38a4d6275..9e935b892c 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -245,6 +245,7 @@ static struct talloc_chunk *talloc_alloc_pool(struct talloc_chunk *parent, struct talloc_chunk *pool_ctx = NULL; size_t space_left; struct talloc_chunk *result; + size_t chunk_size; if (parent == NULL) { return NULL; @@ -267,15 +268,19 @@ static struct talloc_chunk *talloc_alloc_pool(struct talloc_chunk *parent, /* * Align size to 16 bytes */ - size = ((size + 15) & ~15); + chunk_size = ((size + 15) & ~15); - if (space_left < size) { + if (space_left < chunk_size) { return NULL; } result = (struct talloc_chunk *)pool_ctx->pool; - pool_ctx->pool = (void *)((char *)result + size); +#if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_UNDEFINED) + VALGRIND_MAKE_MEM_UNDEFINED(result, size); +#endif + + pool_ctx->pool = (void *)((char *)result + chunk_size); result->flags = TALLOC_MAGIC | TALLOC_FLAG_POOLMEM; result->pool = pool_ctx; @@ -358,6 +363,10 @@ void *talloc_pool(const void *context, size_t size) *talloc_pool_objectcount(tc) = 1; +#if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_NOACCESS) + VALGRIND_MAKE_MEM_NOACCESS(tc->pool, size); +#endif + return result; } @@ -859,6 +868,10 @@ void talloc_free_children(void *ptr) if (tc->flags & TALLOC_FLAG_POOL) { tc->pool = ((char *)tc + TC_HDR_SIZE + TALLOC_POOL_HDR_SIZE); +#if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_NOACCESS) + VALGRIND_MAKE_MEM_NOACCESS( + tc->pool, tc->size - TALLOC_POOL_HDR_SIZE); +#endif } } -- cgit From 59820dcb43bcb2cbb5aad9d2a4dbeed90cc61d98 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 10 Jan 2008 11:35:17 +0100 Subject: talloc_free_children can only reset pool if it's empty (This used to be commit 5cc7a638e93e5f3540755b441a99d4fd3c9c7134) --- source4/lib/talloc/talloc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 9e935b892c..35ed447e45 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -866,7 +866,8 @@ void talloc_free_children(void *ptr) } } - if (tc->flags & TALLOC_FLAG_POOL) { + if ((tc->flags & TALLOC_FLAG_POOL) + && (*talloc_pool_objectcount(tc) == 1)) { tc->pool = ((char *)tc + TC_HDR_SIZE + TALLOC_POOL_HDR_SIZE); #if defined(DEVELOPER) && defined(VALGRIND_MAKE_MEM_NOACCESS) VALGRIND_MAKE_MEM_NOACCESS( -- cgit From a275310bcba62343a759ee7578929eca866fc759 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 10 Jan 2008 11:35:40 +0100 Subject: Fix a c++ warning (This used to be commit 9f402c607f44663cab91cc7d2139f62b84c99cc0) --- source4/lib/talloc/talloc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 35ed447e45..12b85f5a65 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -968,7 +968,8 @@ void *_talloc_realloc(const void *context, void *ptr, size_t size, const char *n if (tc->flags & TALLOC_FLAG_POOLMEM) { new_ptr = talloc_alloc_pool(tc, size + TC_HDR_SIZE); - *talloc_pool_objectcount(tc->pool) -= 1; + *talloc_pool_objectcount((struct talloc_chunk *) + (tc->pool)) -= 1; if (new_ptr == NULL) { new_ptr = malloc(TC_HDR_SIZE+size); -- cgit From fee4ba14c04e25f459723d87114cd9779f9c2f11 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Mon, 11 Feb 2008 12:50:03 +0100 Subject: Make versions in lib/talloc/config.mk and lib/talloc/configure.ac the same. Not sure if we can produce one from the other, so I manually made them equal for now. Michael (This used to be commit 1c14c457bea75fb3055712547cca501e8ef3fc20) --- source4/lib/talloc/config.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 16b5063f87..9e949f900f 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -1,5 +1,5 @@ [LIBRARY::LIBTALLOC] -VERSION = 1.0.0 +VERSION = 1.1.0 SO_VERSION = 1 OBJ_FILES = talloc.o PC_FILE = talloc.pc -- cgit From 94decfc49fa58d756558c09c79482aa459db00b3 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 11 Feb 2008 22:05:52 +0100 Subject: Split rules.mk out of Makefile. (This used to be commit 75ffc2c50d70e6f4108c3e6843c8d2bb212f6d9e) --- source4/lib/talloc/Makefile.in | 40 +++++++++++++--------------------------- source4/lib/talloc/rules.mk | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+), 27 deletions(-) create mode 100644 source4/lib/talloc/rules.mk (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index a33085f95b..4c178045f1 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -20,24 +20,16 @@ SHLIBEXT = @SHLIBEXT@ SHLD = @SHLD@ SHLD_FLAGS = @SHLD_FLAGS@ -.SUFFIXES: .c .o .3 .3.xml .xml .html - LIBOBJ = @TALLOC_OBJ@ @LIBREPLACEOBJ@ SOLIB = libtalloc.$(SHLIBEXT).$(PACKAGE_VERSION) SONAME = libtalloc.$(SHLIBEXT).1 -.c.o: - $(CC) $(PICFLAG) -o $@ -c $< $(CFLAGS) - -all: showflags libtalloc.a $(SOLIB) testsuite $(EXTRA_TARGETS) +all:: showflags libtalloc.a $(SOLIB) testsuite $(EXTRA_TARGETS) -showflags: - @echo 'talloc will be compiled with flags:' - @echo ' CFLAGS = $(CFLAGS)' - @echo ' LIBS = $(LIBS)' +include rules.mk -testsuite: $(LIBOBJ) testsuite.o +testsuite:: $(LIBOBJ) testsuite.o $(CC) $(CFLAGS) -o testsuite testsuite.o $(LIBOBJ) $(LIBS) libtalloc.a: $(LIBOBJ) @@ -47,7 +39,7 @@ libtalloc.a: $(LIBOBJ) $(SOLIB): $(LIBOBJ) $(SHLD) $(SHLD_FLAGS) -o $@ $(LIBOBJ) @SONAMEFLAG@$(SONAME) -install: all +install:: all ${INSTALLCMD} -d $(DESTDIR)$(libdir) ${INSTALLCMD} -d $(DESTDIR)$(libdir)/pkgconfig ${INSTALLCMD} -m 755 libtalloc.a $(DESTDIR)$(libdir) @@ -60,30 +52,24 @@ install: all which swig >/dev/null 2>&1 && ${INSTALLCMD} -d $(DESTDIR)`swig -swiglib` || true which swig >/dev/null 2>&1 && ${INSTALLCMD} -m 644 talloc.i $(DESTDIR)`swig -swiglib` || true -doc: talloc.3 talloc.3.html - -.3.xml.3: - -test -z "$(XSLTPROC)" || $(XSLTPROC) --nonet -o $@ http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< +doc:: talloc.3 talloc.3.html -.xml.html: - -test -z "$(XSLTPROC)" || $(XSLTPROC) --nonet -o $@ http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl $< - -clean: +clean:: rm -f *~ $(LIBOBJ) $(SOLIB) libtalloc.a testsuite testsuite.o *.gc?? talloc.3 talloc.3.html -test: testsuite +check: test + +test:: testsuite ./testsuite -gcov: +gcov:: gcov talloc.c -installcheck: - $(MAKE) test +installcheck:: test -distclean: clean - rm -f *~ */*~ +distclean:: clean rm -f Makefile rm -f config.log config.status config.h config.cache -realdistclean: distclean +realdistclean:: distclean rm -f configure config.h.in diff --git a/source4/lib/talloc/rules.mk b/source4/lib/talloc/rules.mk new file mode 100644 index 0000000000..6cee126529 --- /dev/null +++ b/source4/lib/talloc/rules.mk @@ -0,0 +1,18 @@ +.SUFFIXES: .c .o .3 .3.xml .xml .html + +showflags:: + @echo 'talloc will be compiled with flags:' + @echo ' CFLAGS = $(CFLAGS)' + @echo ' LIBS = $(LIBS)' + +.c.o: + $(CC) $(PICFLAG) -o $@ -c $< $(CFLAGS) + +.3.xml.3: + -test -z "$(XSLTPROC)" || $(XSLTPROC) --nonet -o $@ http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< + +.xml.html: + -test -z "$(XSLTPROC)" || $(XSLTPROC) --nonet -o $@ http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl $< + +distclean:: + rm -f *~ */*~ -- cgit From c3d7f14350c74141185460604a3e1bd57b9ffac9 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 11 Feb 2008 22:52:42 +0100 Subject: Split actual content out of talloc Makefile into talloc.mk. (This used to be commit 2b8939975267fc4774bccd2a35ea9a35129d0a2b) --- source4/lib/talloc/Makefile.in | 42 +++++------------------------------------- source4/lib/talloc/talloc.mk | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 37 deletions(-) create mode 100644 source4/lib/talloc/talloc.mk (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index 4c178045f1..855c708f71 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -19,53 +19,21 @@ PACKAGE_VERSION = @PACKAGE_VERSION@ SHLIBEXT = @SHLIBEXT@ SHLD = @SHLD@ SHLD_FLAGS = @SHLD_FLAGS@ +tallocdir = @tallocdir@ -LIBOBJ = @TALLOC_OBJ@ @LIBREPLACEOBJ@ +LIBOBJ = $(TALLOC_OBJ) @LIBREPLACEOBJ@ -SOLIB = libtalloc.$(SHLIBEXT).$(PACKAGE_VERSION) -SONAME = libtalloc.$(SHLIBEXT).1 - -all:: showflags libtalloc.a $(SOLIB) testsuite $(EXTRA_TARGETS) +all:: showflags $(EXTRA_TARGETS) include rules.mk - -testsuite:: $(LIBOBJ) testsuite.o - $(CC) $(CFLAGS) -o testsuite testsuite.o $(LIBOBJ) $(LIBS) - -libtalloc.a: $(LIBOBJ) - ar -rv $@ $(LIBOBJ) - @-ranlib $@ +include talloc.mk $(SOLIB): $(LIBOBJ) $(SHLD) $(SHLD_FLAGS) -o $@ $(LIBOBJ) @SONAMEFLAG@$(SONAME) -install:: all - ${INSTALLCMD} -d $(DESTDIR)$(libdir) - ${INSTALLCMD} -d $(DESTDIR)$(libdir)/pkgconfig - ${INSTALLCMD} -m 755 libtalloc.a $(DESTDIR)$(libdir) - ${INSTALLCMD} -m 755 $(SOLIB) $(DESTDIR)$(libdir) - ${INSTALLCMD} -d $(DESTDIR)${includedir} - ${INSTALLCMD} -m 644 $(srcdir)/talloc.h $(DESTDIR)$(includedir) - ${INSTALLCMD} -m 644 talloc.pc $(DESTDIR)$(libdir)/pkgconfig - if [ -f talloc.3 ];then ${INSTALLCMD} -d $(DESTDIR)$(mandir)/man3; fi - if [ -f talloc.3 ];then ${INSTALLCMD} -m 644 talloc.3 $(DESTDIR)$(mandir)/man3; fi - which swig >/dev/null 2>&1 && ${INSTALLCMD} -d $(DESTDIR)`swig -swiglib` || true - which swig >/dev/null 2>&1 && ${INSTALLCMD} -m 644 talloc.i $(DESTDIR)`swig -swiglib` || true - -doc:: talloc.3 talloc.3.html - -clean:: - rm -f *~ $(LIBOBJ) $(SOLIB) libtalloc.a testsuite testsuite.o *.gc?? talloc.3 talloc.3.html - check: test -test:: testsuite - ./testsuite - -gcov:: - gcov talloc.c - -installcheck:: test +installcheck:: test install distclean:: clean rm -f Makefile diff --git a/source4/lib/talloc/talloc.mk b/source4/lib/talloc/talloc.mk new file mode 100644 index 0000000000..2dc75dd716 --- /dev/null +++ b/source4/lib/talloc/talloc.mk @@ -0,0 +1,37 @@ +all:: libtalloc.a $(SOLIB) testsuite + +TALLOC_OBJ = $(tallocdir)/talloc.o + +SOLIB = libtalloc.$(SHLIBEXT).$(PACKAGE_VERSION) +SONAME = libtalloc.$(SHLIBEXT).1 + +testsuite:: $(LIBOBJ) testsuite.o + $(CC) $(CFLAGS) -o testsuite testsuite.o $(LIBOBJ) $(LIBS) + +libtalloc.a: $(LIBOBJ) + ar -rv $@ $(LIBOBJ) + @-ranlib $@ + +install:: all + ${INSTALLCMD} -d $(DESTDIR)$(libdir) + ${INSTALLCMD} -d $(DESTDIR)$(libdir)/pkgconfig + ${INSTALLCMD} -m 755 libtalloc.a $(DESTDIR)$(libdir) + ${INSTALLCMD} -m 755 $(SOLIB) $(DESTDIR)$(libdir) + ${INSTALLCMD} -d $(DESTDIR)${includedir} + ${INSTALLCMD} -m 644 $(srcdir)/talloc.h $(DESTDIR)$(includedir) + ${INSTALLCMD} -m 644 talloc.pc $(DESTDIR)$(libdir)/pkgconfig + if [ -f talloc.3 ];then ${INSTALLCMD} -d $(DESTDIR)$(mandir)/man3; fi + if [ -f talloc.3 ];then ${INSTALLCMD} -m 644 talloc.3 $(DESTDIR)$(mandir)/man3; fi + which swig >/dev/null 2>&1 && ${INSTALLCMD} -d $(DESTDIR)`swig -swiglib` || true + which swig >/dev/null 2>&1 && ${INSTALLCMD} -m 644 talloc.i $(DESTDIR)`swig -swiglib` || true + +doc:: talloc.3 talloc.3.html + +clean:: + rm -f *~ $(LIBOBJ) $(SOLIB) libtalloc.a testsuite testsuite.o *.gc?? talloc.3 talloc.3.html + +test:: testsuite + ./testsuite + +gcov:: + gcov talloc.c -- cgit From ecb987c97c98d7374a0e703c56f2a71f8514ece8 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 11 Feb 2008 23:51:59 +0100 Subject: Fix out of tree builds. (This used to be commit 35c8ebdca2612b52cd3eb2aafd35041d17173722) --- source4/lib/talloc/Makefile.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index 855c708f71..f5d1cd109c 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -25,8 +25,8 @@ LIBOBJ = $(TALLOC_OBJ) @LIBREPLACEOBJ@ all:: showflags $(EXTRA_TARGETS) -include rules.mk -include talloc.mk +include $(tallocdir)/rules.mk +include $(tallocdir)/talloc.mk $(SOLIB): $(LIBOBJ) $(SHLD) $(SHLD_FLAGS) -o $@ $(LIBOBJ) @SONAMEFLAG@$(SONAME) -- cgit From 69d6dd1923a511a883e9f562b8ffa2762a671fe0 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 12 Feb 2008 12:46:33 +0100 Subject: Make sure talloc.so is build before installing. (This used to be commit 51769f5cfc0f3a9f85ea533598a1f769e108d075) --- source4/lib/talloc/talloc.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.mk b/source4/lib/talloc/talloc.mk index 2dc75dd716..590adc74f2 100644 --- a/source4/lib/talloc/talloc.mk +++ b/source4/lib/talloc/talloc.mk @@ -1,10 +1,10 @@ -all:: libtalloc.a $(SOLIB) testsuite - TALLOC_OBJ = $(tallocdir)/talloc.o SOLIB = libtalloc.$(SHLIBEXT).$(PACKAGE_VERSION) SONAME = libtalloc.$(SHLIBEXT).1 +all:: libtalloc.a $(SOLIB) testsuite + testsuite:: $(LIBOBJ) testsuite.o $(CC) $(CFLAGS) -o testsuite testsuite.o $(LIBOBJ) $(LIBS) -- cgit From 3cfac63d165f072464e93a12f7ad48450c66477b Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Tue, 12 Feb 2008 22:52:58 +0100 Subject: Raise version of talloc from 1.1.0 to 1.2.0 after adding talloc pools. Michael (This used to be commit 38855a9f145b54d05f4a508562fc1a6595e0d895) --- source4/lib/talloc/config.mk | 2 +- source4/lib/talloc/configure.ac | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 9e949f900f..540a05d100 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -1,5 +1,5 @@ [LIBRARY::LIBTALLOC] -VERSION = 1.1.0 +VERSION = 1.2.0 SO_VERSION = 1 OBJ_FILES = talloc.o PC_FILE = talloc.pc diff --git a/source4/lib/talloc/configure.ac b/source4/lib/talloc/configure.ac index 7878d59300..4719aa04b5 100644 --- a/source4/lib/talloc/configure.ac +++ b/source4/lib/talloc/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ(2.50) -AC_INIT(talloc, 1.1.0) +AC_INIT(talloc, 1.2.0) AC_CONFIG_SRCDIR([talloc.c]) AC_SUBST(datarootdir) AC_CONFIG_HEADER(config.h) -- cgit From 11bc6056ea2eec9eb9a206fa5ae2a2b6b3efe21a Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 13 Feb 2008 17:01:37 +0100 Subject: Never build .so versions of tdb/talloc from Samba 4 itself. Rather, use shared library versions if they are provided by the system. This puts talloc and tdb in a similar situation as popt: the system version is used if provided but if it's not there or if it is too old, we use our internal version statically. (This used to be commit 86f88eb7b51377344eebf0b6fabad0f5459b3f45) --- source4/lib/talloc/config.mk | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 540a05d100..af1b590c98 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -1,8 +1,6 @@ [LIBRARY::LIBTALLOC] -VERSION = 1.2.0 -SO_VERSION = 1 +OUTPUT_TYPE = STATIC_LIBRARY OBJ_FILES = talloc.o -PC_FILE = talloc.pc MANPAGE = talloc.3 CFLAGS = -Ilib/talloc PUBLIC_HEADERS = talloc.h -- cgit From 8a3f8dc646585c1861ac7322ad67a93353fa0c71 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 13 Feb 2008 17:42:10 +0100 Subject: Allow tdb.mk and talloc.mk to be included at the same time. (This used to be commit af9e0421529104d2583c58f7723abe8612e78f53) --- source4/lib/talloc/Makefile.in | 4 ++-- source4/lib/talloc/talloc.mk | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/Makefile.in b/source4/lib/talloc/Makefile.in index f5d1cd109c..07b8fd4ff0 100644 --- a/source4/lib/talloc/Makefile.in +++ b/source4/lib/talloc/Makefile.in @@ -28,8 +28,8 @@ all:: showflags $(EXTRA_TARGETS) include $(tallocdir)/rules.mk include $(tallocdir)/talloc.mk -$(SOLIB): $(LIBOBJ) - $(SHLD) $(SHLD_FLAGS) -o $@ $(LIBOBJ) @SONAMEFLAG@$(SONAME) +$(TALLOC_SOLIB): $(LIBOBJ) + $(SHLD) $(SHLD_FLAGS) -o $@ $(LIBOBJ) @SONAMEFLAG@$(TALLOC_SONAME) check: test diff --git a/source4/lib/talloc/talloc.mk b/source4/lib/talloc/talloc.mk index 590adc74f2..d7a0e0d83e 100644 --- a/source4/lib/talloc/talloc.mk +++ b/source4/lib/talloc/talloc.mk @@ -1,9 +1,9 @@ TALLOC_OBJ = $(tallocdir)/talloc.o -SOLIB = libtalloc.$(SHLIBEXT).$(PACKAGE_VERSION) -SONAME = libtalloc.$(SHLIBEXT).1 +TALLOC_SOLIB = libtalloc.$(SHLIBEXT).$(PACKAGE_VERSION) +TALLOC_SONAME = libtalloc.$(SHLIBEXT).1 -all:: libtalloc.a $(SOLIB) testsuite +all:: libtalloc.a $(TALLOC_SOLIB) testsuite testsuite:: $(LIBOBJ) testsuite.o $(CC) $(CFLAGS) -o testsuite testsuite.o $(LIBOBJ) $(LIBS) @@ -28,7 +28,7 @@ install:: all doc:: talloc.3 talloc.3.html clean:: - rm -f *~ $(LIBOBJ) $(SOLIB) libtalloc.a testsuite testsuite.o *.gc?? talloc.3 talloc.3.html + rm -f *~ $(LIBOBJ) $(TALLOC_SOLIB) libtalloc.a testsuite testsuite.o *.gc?? talloc.3 talloc.3.html test:: testsuite ./testsuite -- cgit From cf2df1ebd5fb3956001576ddc800ea2c217f82ec Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 13 Feb 2008 21:09:21 +0100 Subject: Fix talloc .so installation. (This used to be commit ae522f907ed1b7533d0824224d692c64c7169057) --- source4/lib/talloc/talloc.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.mk b/source4/lib/talloc/talloc.mk index d7a0e0d83e..e1fe88c84b 100644 --- a/source4/lib/talloc/talloc.mk +++ b/source4/lib/talloc/talloc.mk @@ -16,7 +16,7 @@ install:: all ${INSTALLCMD} -d $(DESTDIR)$(libdir) ${INSTALLCMD} -d $(DESTDIR)$(libdir)/pkgconfig ${INSTALLCMD} -m 755 libtalloc.a $(DESTDIR)$(libdir) - ${INSTALLCMD} -m 755 $(SOLIB) $(DESTDIR)$(libdir) + ${INSTALLCMD} -m 755 $(TALLOC_SOLIB) $(DESTDIR)$(libdir) ${INSTALLCMD} -d $(DESTDIR)${includedir} ${INSTALLCMD} -m 644 $(srcdir)/talloc.h $(DESTDIR)$(includedir) ${INSTALLCMD} -m 644 talloc.pc $(DESTDIR)$(libdir)/pkgconfig -- cgit From f3bbe1516c95ac29b3ff51a2b5a91105d315524b Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Thu, 14 Feb 2008 23:10:00 +0100 Subject: Fix path to talloc guide. Noted by "teferi" on irc. Michael (This used to be commit bc4e03f2ddb669758e27e2a5c32e15c7d6c5257d) --- source4/lib/talloc/web/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/web/index.html b/source4/lib/talloc/web/index.html index 106920e8a5..e53e8960a8 100644 --- a/source4/lib/talloc/web/index.html +++ b/source4/lib/talloc/web/index.html @@ -12,7 +12,7 @@ destructors. It is the core memory allocator used in Samba4, and has made a huge difference in many aspects of Samba4 development.

To get started with talloc, I would recommend you read the talloc guide. +href="http://samba.org/ftp/unpacked/samba_4_0_test/source/lib/talloc/talloc_guide.txt">talloc guide.

Discussion and bug reports

-- cgit From dd4ffd868b59f12a190af49eadfece34a395b34d Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Sun, 17 Feb 2008 22:57:04 +0100 Subject: Fix paths for talloc into unpacked directory (rsync commands). Michael (This used to be commit 2839d7f67a0d3ed5b4841bf3c12ce73972636b88) --- source4/lib/talloc/web/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/web/index.html b/source4/lib/talloc/web/index.html index e53e8960a8..90f6577b2d 100644 --- a/source4/lib/talloc/web/index.html +++ b/source4/lib/talloc/web/index.html @@ -35,8 +35,8 @@ svn. To fetch via svn use the following command: To fetch via rsync use this command:
-  rsync -Pavz samba.org::ftp/unpacked/samba4/source/lib/talloc .
-  rsync -Pavz samba.org::ftp/unpacked/samba4/source/lib/libreplace .
+  rsync -Pavz samba.org::ftp/unpacked/samba_4_0_test/source/lib/talloc .
+  rsync -Pavz samba.org::ftp/unpacked/samba_4_0_test/source/lib/libreplace .
 

-- cgit From c65cded541ff123ee6d126f757f541961e9ad717 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Mon, 18 Feb 2008 22:49:32 +0100 Subject: Adapt source code checkout information to git repo in talloc website. Michael (This used to be commit 254be79799acc69db88a5500a2f755c84553f8ef) --- source4/lib/talloc/web/index.html | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/web/index.html b/source4/lib/talloc/web/index.html index 90f6577b2d..628030ad4c 100644 --- a/source4/lib/talloc/web/index.html +++ b/source4/lib/talloc/web/index.html @@ -24,12 +24,13 @@ bugzilla bug tracking system.

Download

-You can download the latest release either via rsync or anonymous -svn. To fetch via svn use the following command: +You can download the latest release either via rsync or git. +To fetch via git use the following command:
-  svn co svn://svnanon.samba.org/samba/branches/SAMBA_4_0/source/lib/talloc talloc
-  svn co svn://svnanon.samba.org/samba/branches/SAMBA_4_0/source/lib/replace libreplace
+  git-clone git://git.samba.org/samba.git samba
+  cd samba
+  git checkout -b samba4 origin/v4-0-test
 
To fetch via rsync use this command: -- cgit From 0a8b1fd092c9a64c04f6f05d41b3d7ecec7ccc6f Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Mon, 25 Feb 2008 14:03:07 -0500 Subject: Update homepages for talloc, tdb and ldb subprojects (This used to be commit 8cb07814bc6627fc8eba228eafd13336e3ca3758) --- source4/lib/talloc/web/index.html | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/web/index.html b/source4/lib/talloc/web/index.html index 628030ad4c..5deab93665 100644 --- a/source4/lib/talloc/web/index.html +++ b/source4/lib/talloc/web/index.html @@ -12,7 +12,7 @@ destructors. It is the core memory allocator used in Samba4, and has made a huge difference in many aspects of Samba4 development.

To get started with talloc, I would recommend you read the talloc guide. +href="http://samba.org/ftp/unpacked/talloc/talloc_guide.txt">talloc guide.

Discussion and bug reports

@@ -24,20 +24,16 @@ bugzilla bug tracking system.

Download

-You can download the latest release either via rsync or git. -To fetch via git use the following command: - -
-  git-clone git://git.samba.org/samba.git samba
-  cd samba
-  git checkout -b samba4 origin/v4-0-test
-
- +You can download the latest release either via rsync or git.
+
+To fetch via git see the following guide:
+Using Git for Samba Development
+Once you have cloned the tree switch to the v4-0-test branch and cd into the source/lib/talloc directory.
+
To fetch via rsync use this command:
-  rsync -Pavz samba.org::ftp/unpacked/samba_4_0_test/source/lib/talloc .
-  rsync -Pavz samba.org::ftp/unpacked/samba_4_0_test/source/lib/libreplace .
+  rsync -Pavz samba.org::ftp/unpacked/talloc .
 

-- cgit From d8d9a6ef040b6c3e7946e6ae2cba2b28234c8baf Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 26 Feb 2008 15:11:47 +0100 Subject: Move manpage management out of the perl build system. (This used to be commit 1dd6bea507f1f5e26cccf89148280721260a4673) --- source4/lib/talloc/config.mk | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index af1b590c98..abbad2e613 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -1,6 +1,8 @@ [LIBRARY::LIBTALLOC] OUTPUT_TYPE = STATIC_LIBRARY OBJ_FILES = talloc.o -MANPAGE = talloc.3 CFLAGS = -Ilib/talloc PUBLIC_HEADERS = talloc.h + + +MANPAGES += $(tallocdir)/talloc.3 -- cgit From 1ada7108408f567f61cfbf2b625730ba898452db Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 29 Feb 2008 14:23:38 +0100 Subject: Move public header accumulation out of the perl code. Never install generated prototype files. It's easier to break the API when using them and they're not easily readable for 3rd party users. Conflicts: source/auth/config.mk source/auth/credentials/config.mk source/auth/gensec/config.mk source/build/smb_build/config_mk.pm source/build/smb_build/main.pl source/build/smb_build/makefile.pm source/dsdb/config.mk source/lib/charset/config.mk source/lib/tdr/config.mk source/lib/util/config.mk source/libcli/config.mk source/libcli/ldap/config.mk source/librpc/config.mk source/param/config.mk source/rpc_server/config.mk source/torture/config.mk (This used to be commit 6c659689ed4081f1d7a6253c538c7f01784197ba) --- source4/lib/talloc/config.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index abbad2e613..33241ffac7 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -2,7 +2,7 @@ OUTPUT_TYPE = STATIC_LIBRARY OBJ_FILES = talloc.o CFLAGS = -Ilib/talloc -PUBLIC_HEADERS = talloc.h MANPAGES += $(tallocdir)/talloc.3 +PUBLIC_HEADERS += $(tallocdir)/talloc.h -- cgit From afe3e8172ddaa5e4aa811faceecda4f943d6e2ef Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 2 Apr 2008 04:53:27 +0200 Subject: Install public header files again and include required prototypes. (This used to be commit 47ffbbf67435904754469544390b67d34c958343) --- source4/lib/talloc/config.mk | 1 - 1 file changed, 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 33241ffac7..3eab90b9ae 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -5,4 +5,3 @@ CFLAGS = -Ilib/talloc MANPAGES += $(tallocdir)/talloc.3 -PUBLIC_HEADERS += $(tallocdir)/talloc.h -- cgit From 184c53d180fac49e572f1ad86ce2adf6ca3a5247 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 4 Apr 2008 17:20:32 +0200 Subject: Don't install talloc manpage from samba, it's already installed from the standalone talloc build. (This used to be commit 7bfda828952eab7f165190cbfd804e28780406c9) --- source4/lib/talloc/config.mk | 3 --- 1 file changed, 3 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 3eab90b9ae..42f8b38815 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -2,6 +2,3 @@ OUTPUT_TYPE = STATIC_LIBRARY OBJ_FILES = talloc.o CFLAGS = -Ilib/talloc - - -MANPAGES += $(tallocdir)/talloc.3 -- cgit From e9017ba418202b4b191c5a9ad4a96857558ce606 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Mon, 14 Apr 2008 17:22:58 +0200 Subject: Use _OBJ_FILES variables in a couple more places. (This used to be commit 92856d5054106894b65cd1a1b5119c0facfc4cff) --- source4/lib/talloc/config.mk | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 42f8b38815..84848ae77a 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -1,4 +1,7 @@ [LIBRARY::LIBTALLOC] OUTPUT_TYPE = STATIC_LIBRARY -OBJ_FILES = talloc.o CFLAGS = -Ilib/talloc + +LIBTALLOC_OBJ_FILES = lib/talloc/talloc.o + +MANPAGES += $(tallocdir)/talloc.3 -- cgit From 0236a50c114bdd53527b7dc0acd81925607621c2 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Thu, 17 Apr 2008 11:22:23 +0200 Subject: Skip strcmp() on 2 NULL pointers. Andrew Bartlett (This used to be commit 7b9a647ebbbe9ec9e1b82b42e3a8916396f91273) --- source4/lib/talloc/testsuite.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/testsuite.c b/source4/lib/talloc/testsuite.c index fedbda95aa..3f06eee566 100644 --- a/source4/lib/talloc/testsuite.c +++ b/source4/lib/talloc/testsuite.c @@ -48,7 +48,8 @@ static double timeval_elapsed(struct timeval *tv) } #define torture_assert_str_equal(test, arg1, arg2, desc) \ - if (strcmp(arg1, arg2)) { \ + if (arg1 == NULL && arg2 == NULL) { \ + } else if (strcmp(arg1, arg2)) { \ printf("failure: %s [\n%s: Expected %s, got %s: %s\n]\n", \ test, __location__, arg1, arg2, desc); \ return false; \ -- cgit From 780fa9f9e677ded006dd54e2ec7bdbcd10348b72 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sat, 28 Jun 2008 11:01:20 +0200 Subject: lib/talloc: build as MERGED_OBJ instead of STATIC_LIBRARY metze (This used to be commit 5bf414efbdf279fd1b85eb47e7b47656bc435f11) --- source4/lib/talloc/config.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/config.mk b/source4/lib/talloc/config.mk index 84848ae77a..c13e1b79ab 100644 --- a/source4/lib/talloc/config.mk +++ b/source4/lib/talloc/config.mk @@ -1,5 +1,5 @@ [LIBRARY::LIBTALLOC] -OUTPUT_TYPE = STATIC_LIBRARY +OUTPUT_TYPE = MERGED_OBJ CFLAGS = -Ilib/talloc LIBTALLOC_OBJ_FILES = lib/talloc/talloc.o -- cgit From 121bcbdb7fdfb11e4864eb79cc1bd6d726a7c307 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sun, 14 Sep 2008 18:46:34 +0200 Subject: Fix out of tree build. Remove the embedded srcdir path from talloc and tdb. (partialy cherry picked from commit 359921acd436684a0b4cf76ba15f82a224d2c337) metze (This used to be commit d89b8fee5210c7b4d8fad24edea34f9732aec708) --- source4/lib/talloc/libtalloc.m4 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/libtalloc.m4 b/source4/lib/talloc/libtalloc.m4 index d2e8eba81a..fd2b4b22cd 100644 --- a/source4/lib/talloc/libtalloc.m4 +++ b/source4/lib/talloc/libtalloc.m4 @@ -1,10 +1,10 @@ dnl find the talloc sources. This is meant to work both for dnl talloc standalone builds, and builds of packages using talloc tallocdir="" -tallocpaths="$srcdir $srcdir/lib/talloc $srcdir/talloc $srcdir/../talloc" +tallocpaths=". lib/talloc talloc ../talloc" for d in $tallocpaths; do - if test -f "$d/talloc.c"; then - tallocdir="$d" + if test -f "$srcdir/$d/talloc.c"; then + tallocdir="$d" AC_SUBST(tallocdir) break; fi @@ -15,7 +15,7 @@ fi TALLOC_OBJ="talloc.o" AC_SUBST(TALLOC_OBJ) -TALLOC_CFLAGS="-I$tallocdir" +TALLOC_CFLAGS="-I$srcdir/$tallocdir" AC_SUBST(TALLOC_CFLAGS) TALLOC_LIBS="" -- cgit From f5d90683596e02023d0a81d7d7e4a1458dd28278 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sat, 19 Apr 2008 16:56:44 +0200 Subject: Fix bug 5400 Thanks to Jason Mader! Volker (cherry picked from commit 87d8a63ce4e6dd91ea3193d0a2574520a5857be2) (This used to be commit 34ab9e5a23458c9f9845d1ff808c142cb2f1f2a4) --- source4/lib/talloc/talloc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index 12b85f5a65..baf88fe754 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -85,8 +85,8 @@ #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else -#define likely(x) x -#define unlikely(x) x +#define likely(x) (x) +#define unlikely(x) (x) #endif /* this null_context is only used if talloc_enable_leak_report() or -- cgit From 9d6e473c22baba10e8ad5f9423c6798e1d070d23 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sun, 14 Sep 2008 18:50:13 +0200 Subject: Fix warnings on SuSE 9.0. The macros "[un]likely" are already defined on SuSE 9.0. Patch from Volker. (partialy cherry-picked 30d181c92463aecd6e649330d3645d86d5a17e43) metze (This used to be commit ad7ed33f786124e4afbba4330201a3a6463c6f73) --- source4/lib/talloc/talloc.c | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'source4/lib/talloc') diff --git a/source4/lib/talloc/talloc.c b/source4/lib/talloc/talloc.c index baf88fe754..1f7e52439f 100644 --- a/source4/lib/talloc/talloc.c +++ b/source4/lib/talloc/talloc.c @@ -82,12 +82,20 @@ #if (__GNUC__ >= 3) /* the strange !! is to ensure that __builtin_expect() takes either 0 or 1 as its first argument */ +#ifndef likely #define likely(x) __builtin_expect(!!(x), 1) +#endif +#ifndef unlikely #define unlikely(x) __builtin_expect(!!(x), 0) +#endif #else +#ifndef likely #define likely(x) (x) +#endif +#ifndef unlikely #define unlikely(x) (x) #endif +#endif /* this null_context is only used if talloc_enable_leak_report() or talloc_enable_leak_report_full() is called, otherwise it remains -- cgit