diff options
Diffstat (limited to 'include/sm/heap.h')
-rw-r--r-- | include/sm/heap.h | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/include/sm/heap.h b/include/sm/heap.h new file mode 100644 index 000000000000..cd346b3553d5 --- /dev/null +++ b/include/sm/heap.h @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2000-2001, 2006 Sendmail, Inc. and its suppliers. + * All rights reserved. + * + * By using this file, you agree to the terms and conditions set + * forth in the LICENSE file which can be found at the top level of + * the sendmail distribution. + * + * $Id: heap.h,v 1.23 2006/08/15 00:53:46 ca Exp $ + */ + +/* +** Sendmail debugging memory allocation package. +** See libsm/heap.html for documentation. +*/ + +#ifndef SM_HEAP_H +# define SM_HEAP_H + +# include <sm/io.h> +# include <stdlib.h> +# include <sm/debug.h> +# include <sm/exc.h> + +/* change default to 0 for production? */ +# ifndef SM_HEAP_CHECK +# define SM_HEAP_CHECK 1 +# endif /* ! SM_HEAP_CHECK */ + +# if SM_HEAP_CHECK +# define sm_malloc_x(sz) sm_malloc_tagged_x(sz, __FILE__, __LINE__, SmHeapGroup) +# define sm_malloc(size) sm_malloc_tagged(size, __FILE__, __LINE__, SmHeapGroup) +# define sm_free(ptr) sm_free_tagged(ptr, __FILE__, __LINE__) + +extern void *sm_malloc_tagged __P((size_t, char *, int, int)); +extern void *sm_malloc_tagged_x __P((size_t, char *, int, int)); +extern void sm_free_tagged __P((void *, char *, int)); +extern void *sm_realloc_x __P((void *, size_t)); +extern bool sm_heap_register __P((void *, size_t, char *, int, int)); +extern void sm_heap_checkptr_tagged __P((void *, char *, int)); +extern void sm_heap_report __P((SM_FILE_T *, int)); + +# else /* SM_HEAP_CHECK */ +# define sm_malloc_tagged(size, file, line, grp) sm_malloc(size) +# define sm_malloc_tagged_x(size, file, line, grp) sm_malloc_x(size) +# define sm_free_tagged(ptr, file, line) sm_free(ptr) +# define sm_heap_register(ptr, size, file, line, grp) (true) +# define sm_heap_checkptr_tagged(ptr, tag, num) ((void)0) +# define sm_heap_report(file, verbose) ((void)0) + +extern void *sm_malloc __P((size_t)); +extern void *sm_malloc_x __P((size_t)); +extern void *sm_realloc_x __P((void *, size_t)); +extern void sm_free __P((void *)); +# endif /* SM_HEAP_CHECK */ + +extern void *sm_realloc __P((void *, size_t)); + +# define sm_heap_checkptr(ptr) sm_heap_checkptr_tagged(ptr, __FILE__, __LINE__) + +#if 0 +/* +** sm_f[mc]alloc are plug in replacements for malloc and calloc +** which can be used in a context requiring a function pointer, +** and which are compatible with sm_free. Warning: sm_heap_report +** cannot report where storage leaked by sm_f[mc]alloc was allocated. +*/ + +/* XXX unused right now */ + +extern void * +sm_fmalloc __P(( + size_t)); + +extern void * +sm_fcalloc __P(( + size_t, + size_t)); +#endif /* 0 */ + +/* +** Allocate 'permanent' storage that can be freed but may still be +** allocated when the process exits. sm_heap_report will not complain +** about a storage leak originating from a call to sm_pmalloc. +*/ + +# define sm_pmalloc(size) sm_malloc_tagged(size, __FILE__, __LINE__, 0) +# define sm_pmalloc_x(size) sm_malloc_tagged_x(size, __FILE__, __LINE__, 0) + +# define sm_heap_group() SmHeapGroup +# define sm_heap_setgroup(g) (SmHeapGroup = (g)) +# define sm_heap_newgroup() (SmHeapGroup = ++SmHeapMaxGroup) + +#define SM_FREE(ptr) \ + do \ + { \ + if ((ptr) != NULL) \ + { \ + sm_free(ptr); \ + (ptr) = NULL; \ + } \ + } while (0) + +extern int SmHeapGroup; +extern int SmHeapMaxGroup; + +extern SM_DEBUG_T SmHeapTrace; +extern SM_DEBUG_T SmHeapCheck; +extern SM_EXC_T SmHeapOutOfMemory; + +#endif /* ! SM_HEAP_H */ |