diff options
Diffstat (limited to 'lib/memory.h')
-rw-r--r-- | lib/memory.h | 193 |
1 files changed, 131 insertions, 62 deletions
diff --git a/lib/memory.h b/lib/memory.h index 6c95d73a..5e5af698 100644 --- a/lib/memory.h +++ b/lib/memory.h @@ -21,101 +21,170 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA #ifndef _ZEBRA_MEMORY_H #define _ZEBRA_MEMORY_H -#include <stddef.h> - -/* For pretty printing of memory allocate information. */ -struct memory_list +#include "misc.h" + +/*------------------------------------------------------------------------------ + * The file "lib/memtypes.h is created automatically (in the make) from + * memtypes.c, and contains a large enum which defines all the memory type + * names. + * + * The file memtypes.c contains a number of arrays of struct memory_list, which + * map memory type names to a string, for printing. Those arrays are + * collected together in an array of struct mlist. + */ +struct memory_list /* one per memory type */ { int index; const char *format; }; -struct mlist { +struct mlist { /* one per class of memory types */ struct memory_list *list; const char *name; }; -extern struct mlist mlists[]; +extern struct mlist mlists[]; /* all classes of memory */ #include "lib/memtypes.h" -/* #define MEMORY_LOG */ -#ifdef MEMORY_LOG -#define XMALLOC(mtype, size) \ - mtype_zmalloc (__FILE__, __LINE__, (mtype), (size)) -#define XCALLOC(mtype, size) \ - mtype_zcalloc (__FILE__, __LINE__, (mtype), (size)) -#define XREALLOC(mtype, ptr, size) \ - mtype_zrealloc (__FILE__, __LINE__, (mtype), (ptr), (size)) -#define XFREE(mtype, ptr) \ - do { \ - mtype_zfree (__FILE__, __LINE__, (mtype), (ptr)); \ - ptr = NULL; } \ - while (0) -#define XSTRDUP(mtype, str) \ - mtype_zstrdup (__FILE__, __LINE__, (mtype), (str)) +typedef enum MTYPE mtype_t ; + +/*------------------------------------------------------------------------------ + * Basic counting -- count of allocated objects of each type of memory + * + */ +struct mem_stats /* wrap in struct so can copy trivially */ +{ + ulong alloc[MTYPE_MAX] ; +} ; + +typedef struct mem_stats mem_stats_t ; + +/*------------------------------------------------------------------------------ + * Option for logging memory operations. + */ +#ifdef MEMORY_LOGGER /* Takes precedence over MEMORY_TRACKER */ + +#undef MEMORY_LOGGER +#define MEMORY_LOGGER 1 + +#undef MEMORY_TRACKER +#define MEMORY_TRACKER 0 + #else -#ifdef QDEBUG -#define MEMORY_TRACKER 1 +#define MEMORY_LOGGER 0 + +#endif + +/*------------------------------------------------------------------------------ + * Sort out MEMORY_TRACKER -- option to keep track of memory allocation. + * + * Set to 1 if defined, but blank. + * Set to QDEBUG if not defined. + * + * Force to 0 if NO_MEMORY_TRACKER is defined and not zero. + * + * So: defaults to same as QDEBUG, but no matter what QDEBUG is set to: + * + * * can set MEMORY_TRACKER == 0 to turn off debug + * * or set MEMORY_TRACKER != 0 to turn on debug + * * or set VTY_NO_DEBUG != to force debug off + */ +#ifdef MEMORY_TRACKER /* If defined, make it 1 or 0 */ +# if IS_BLANK_OPTION(MEMORY_TRACKER) +# undef MEMORY_TRACKER +# define MEMORY_TRACKER 1 +# endif +#else /* If not defined, follow QDEBUG */ +# define MEMORY_TRACKER QDEBUG +#endif + +#ifdef NO_MEMORY_TRACKER /* Override, if defined. */ +# if IS_NOT_ZERO_OPTION(VTY_NO_DEBUG) +# undef MEMORY_TRACKER +# define MEMORY_TRACKER 0 +# endif #endif -#ifdef MEMORY_TRACKER -#define MEMORY_TRACKER_NAME , const char* name -#define MEMORY_TRACKER_FUNC , __func__ +/*------------------------------------------------------------------------------ + * Argument macros to make everything look much the same + */ + +#if MEMORY_LOGGER +#define MEMORY_EXTRA_DATA , __FILE__, __LINE__ +#define MEMORY_EXTRA_ARGS , const char* file, int line +#define MEMORY_LOGGING_ARGS file, line +#elif MEMORY_TRACKER +#define MEMORY_EXTRA_DATA , __func__ +#define MEMORY_EXTRA_ARGS , const char* func +#define MEMORY_TRACKER_ARG func #else -#define MEMORY_TRACKER_NAME -#define MEMORY_TRACKER_FUNC +#define MEMORY_EXTRA_DATA +#define MEMORY_EXTRA_ARGS #endif +#ifndef MEMORY_LOGGING_ARGS +#define MEMORY_LOGGING_ARGS "*dummy*", -1 +#endif +#ifndef MEMORY_TRACKER_ARG +#define MEMORY_TRACKER_ARG "*dummy*" +#endif + +enum +{ + memory_logger = MEMORY_LOGGER, + memory_tracker = MEMORY_TRACKER, +} ; + +/*------------------------------------------------------------------------------ + * The macros used for all Quagga dynamic memory. + */ + #define XMALLOC(mtype, size) zmalloc ((mtype), (size) \ - MEMORY_TRACKER_FUNC) + MEMORY_EXTRA_DATA) #define XCALLOC(mtype, size) zcalloc ((mtype), (size) \ - MEMORY_TRACKER_FUNC) + MEMORY_EXTRA_DATA) #define XREALLOC(mtype, ptr, size) zrealloc ((mtype), (ptr), (size) \ - MEMORY_TRACKER_FUNC) -#define XFREE(mtype, ptr) do { \ - zfree ((mtype), (ptr)); \ - ptr = NULL; } \ - while (0) + MEMORY_EXTRA_DATA) +#define XFREE(mtype, ptr) do { zfree ((mtype), (ptr) \ + MEMORY_EXTRA_DATA); \ + ptr = NULL; } while (0) #define XSTRDUP(mtype, str) zstrdup ((mtype), (str) \ - MEMORY_TRACKER_FUNC) - -#endif /* MEMORY_LOG */ + MEMORY_EXTRA_DATA) #define SIZE(t,n) (sizeof(t) * (n)) -/* Prototypes of memory function. */ -extern void *zmalloc (enum MTYPE type, size_t size MEMORY_TRACKER_NAME); -extern void *zcalloc (enum MTYPE type, size_t size MEMORY_TRACKER_NAME); -extern void *zrealloc (enum MTYPE type, void *ptr, size_t size - MEMORY_TRACKER_NAME); -extern void zfree (enum MTYPE type, void *ptr); -extern char *zstrdup (enum MTYPE type, const char *str MEMORY_TRACKER_NAME); +/*------------------------------------------------------------------------------ + * Prototypes of memory functions + */ +extern void *zmalloc (mtype_t mtype, size_t size MEMORY_EXTRA_ARGS) ; +extern void *zcalloc (mtype_t mtype, size_t size MEMORY_EXTRA_ARGS) ; +extern void *zrealloc (mtype_t mtype, void *ptr, size_t size + MEMORY_EXTRA_ARGS) ; +extern void zfree (mtype_t mtype, void *ptr MEMORY_EXTRA_ARGS) ; +extern char *zstrdup (mtype_t mtype, const char *str MEMORY_EXTRA_ARGS) ; -extern void *mtype_zmalloc (const char *file, int line, enum MTYPE type, - size_t size); +extern void* mem_mmap(size_t size) ; +extern void mem_munmap(void* p, size_t size) ; -extern void *mtype_zcalloc (const char *file, int line, enum MTYPE type, - size_t size); - -extern void *mtype_zrealloc (const char *file, int line, enum MTYPE type, - void *ptr, size_t size); - -extern void mtype_zfree (const char *file, int line, enum MTYPE type, - void *ptr); - -extern char *mtype_zstrdup (const char *file, int line, enum MTYPE type, - const char *str); +extern void memory_start(void) ; extern void memory_init (void); extern void memory_init_r (void); extern void memory_finish (void); extern void log_memstats_stderr (const char *); -/* return number of allocations outstanding for the type */ -extern unsigned long mtype_stats_alloc (enum MTYPE); +/* Return number of allocations outstanding for all memory types */ +extern void mem_get_stats(mem_stats_t* mst) ; -/* Human friendly string for given byte count */ +/* Return number of allocations outstanding for the given memory type */ +extern ulong mem_get_alloc(mem_stats_t* mst, mtype_t mtype) ; + +/* Return number of allocations outstanding for the given memory type */ +extern ulong mtype_stats_alloc(mtype_t mtype) ; + +/* Human friendly string for given byte count */ #define MTYPE_MEMSTR_LEN 20 -extern const char *mtype_memstr (char *, size_t, unsigned long); +extern const char *mtype_memstr (char *, size_t, ulong); + #endif /* _ZEBRA_MEMORY_H */ |