]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/memory.h
[lib] Experimental: have XFREE NULL out the freed pointer
[mirror_frr.git] / lib / memory.h
index c2d595a47967f267b1894f9ea63df56fd8ea2523..a23c27875e436c027ea6a5fdc4e06a362b86c12e 100644 (file)
@@ -21,197 +21,23 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 #ifndef _ZEBRA_MEMORY_H
 #define _ZEBRA_MEMORY_H
 
-/* #define MEMORY_LOG */
-
-/* For tagging memory, below is the type of the memory. */
-enum
+/* For pretty printing of memory allocate information. */
+struct memory_list
 {
-  MTYPE_TMP = 1,
-  MTYPE_STRVEC,
-  MTYPE_VECTOR,
-  MTYPE_VECTOR_INDEX,
-  MTYPE_LINK_LIST,
-  MTYPE_LINK_NODE,
-  MTYPE_THREAD,
-  MTYPE_THREAD_MASTER,
-  MTYPE_VTY,
-  MTYPE_VTY_HIST,
-  MTYPE_VTY_OUT_BUF,
-  MTYPE_IF,
-  MTYPE_IF_IRDP,
-  MTYPE_CONNECTED,
-  MTYPE_AS_SEG,
-  MTYPE_AS_STR,
-  MTYPE_AS_PATH,
-  MTYPE_CLUSTER,
-  MTYPE_CLUSTER_VAL,
-  MTYPE_ATTR,
-  MTYPE_TRANSIT,
-  MTYPE_TRANSIT_VAL,
-  MTYPE_BUFFER,
-  MTYPE_BUFFER_DATA,
-  MTYPE_STREAM,
-  MTYPE_STREAM_DATA,
-  MTYPE_STREAM_FIFO,
-  MTYPE_PREFIX,
-  MTYPE_PREFIX_IPV4,
-  MTYPE_PREFIX_IPV6,
-  MTYPE_HASH,
-  MTYPE_HASH_INDEX,
-  MTYPE_HASH_BACKET,
-  MTYPE_ROUTE_TABLE,
-  MTYPE_ROUTE_NODE,
-  MTYPE_ACCESS_LIST,
-  MTYPE_ACCESS_LIST_STR,
-  MTYPE_ACCESS_FILTER,
-  MTYPE_PREFIX_LIST,
-  MTYPE_PREFIX_LIST_STR,
-  MTYPE_PREFIX_LIST_ENTRY,
-  MTYPE_ROUTE_MAP,
-  MTYPE_ROUTE_MAP_NAME,
-  MTYPE_ROUTE_MAP_INDEX,
-  MTYPE_ROUTE_MAP_RULE,
-  MTYPE_ROUTE_MAP_RULE_STR,
-  MTYPE_ROUTE_MAP_COMPILED,
-
-  MTYPE_RIB,
-  MTYPE_DISTRIBUTE,
-  MTYPE_ZLOG,
-  MTYPE_ZCLIENT,
-  MTYPE_NEXTHOP,
-  MTYPE_RTADV_PREFIX,
-  MTYPE_IF_RMAP,
-  MTYPE_SOCKUNION,
-  MTYPE_STATIC_IPV4,
-  MTYPE_STATIC_IPV6,
-
-  MTYPE_DESC,
-  MTYPE_OSPF_TOP,
-  MTYPE_OSPF_AREA,
-  MTYPE_OSPF_AREA_RANGE,
-  MTYPE_OSPF_NETWORK,
-  MTYPE_OSPF_NEIGHBOR_STATIC,
-  MTYPE_OSPF_IF,
-  MTYPE_OSPF_NEIGHBOR,
-  MTYPE_OSPF_ROUTE,
-  MTYPE_OSPF_TMP,
-  MTYPE_OSPF_LSA,
-  MTYPE_OSPF_LSA_DATA,
-  MTYPE_OSPF_LSDB,
-  MTYPE_OSPF_PACKET,
-  MTYPE_OSPF_FIFO,
-  MTYPE_OSPF_VERTEX,
-  MTYPE_OSPF_NEXTHOP,
-  MTYPE_OSPF_PATH,
-  MTYPE_OSPF_VL_DATA,
-  MTYPE_OSPF_CRYPT_KEY,
-  MTYPE_OSPF_EXTERNAL_INFO,
-  MTYPE_OSPF_MESSAGE,
-  MTYPE_OSPF_DISTANCE,
-  MTYPE_OSPF_IF_INFO,
-  MTYPE_OSPF_IF_PARAMS,
-
-  MTYPE_OSPF6_TOP,
-  MTYPE_OSPF6_AREA,
-  MTYPE_OSPF6_IF,
-  MTYPE_OSPF6_NEIGHBOR,
-  MTYPE_OSPF6_ROUTE,
-  MTYPE_OSPF6_PREFIX,
-  MTYPE_OSPF6_MESSAGE,
-  MTYPE_OSPF6_LSA,
-  MTYPE_OSPF6_LSA_SUMMARY,
-  MTYPE_OSPF6_LSDB,
-  MTYPE_OSPF6_VERTEX,
-  MTYPE_OSPF6_SPFTREE,
-  MTYPE_OSPF6_NEXTHOP,
-  MTYPE_OSPF6_EXTERNAL_INFO,
-  MTYPE_OSPF6_OTHER,
-
-  
-  MTYPE_ISIS,
-  MTYPE_ISIS_TMP,
-  MTYPE_ISIS_CIRCUIT,
-  MTYPE_ISIS_LSP,
-  MTYPE_ISIS_ADJACENCY,
-  MTYPE_ISIS_AREA,
-  MTYPE_ISIS_AREA_ADDR,
-  MTYPE_ISIS_TLV,
-  MTYPE_ISIS_DYNHN,
-  MTYPE_ISIS_SPFTREE,
-  MTYPE_ISIS_VERTEX,
-  MTYPE_ISIS_ROUTE_INFO,
-  MTYPE_ISIS_NEXTHOP,
-  MTYPE_ISIS_NEXTHOP6,
-
-  MTYPE_BGP,
-  MTYPE_BGP_PEER,
-  MTYPE_PEER_GROUP,
-  MTYPE_PEER_DESC,
-  MTYPE_PEER_UPDATE_SOURCE,
-  MTYPE_BGP_STATIC,
-  MTYPE_BGP_AGGREGATE,
-  MTYPE_BGP_CONFED_LIST,
-  MTYPE_BGP_NEXTHOP_CACHE,
-  MTYPE_BGP_DAMP_INFO,
-  MTYPE_BGP_DAMP_ARRAY,
-  MTYPE_BGP_ANNOUNCE,
-  MTYPE_BGP_ATTR_QUEUE,
-  MTYPE_BGP_ROUTE_QUEUE,
-  MTYPE_BGP_DISTANCE,
-  MTYPE_BGP_ROUTE,
-  MTYPE_BGP_TABLE,
-  MTYPE_BGP_NODE,
-  MTYPE_BGP_ADVERTISE_ATTR,
-  MTYPE_BGP_ADVERTISE,
-  MTYPE_BGP_ADJ_IN,
-  MTYPE_BGP_ADJ_OUT,
-  MTYPE_BGP_REGEXP,
-  MTYPE_AS_FILTER,
-  MTYPE_AS_FILTER_STR,
-  MTYPE_AS_LIST,
-
-  MTYPE_COMMUNITY,
-  MTYPE_COMMUNITY_VAL,
-  MTYPE_COMMUNITY_STR,
-
-  MTYPE_ECOMMUNITY,
-  MTYPE_ECOMMUNITY_VAL,
-  MTYPE_ECOMMUNITY_STR,
-
-  /* community-list and extcommunity-list.  */
-  MTYPE_COMMUNITY_LIST_HANDLER,
-  MTYPE_COMMUNITY_LIST,
-  MTYPE_COMMUNITY_LIST_NAME,
-  MTYPE_COMMUNITY_LIST_ENTRY,
-  MTYPE_COMMUNITY_LIST_CONFIG,
-
-  MTYPE_RIP,
-  MTYPE_RIP_INTERFACE,
-  MTYPE_RIP_DISTANCE,
-  MTYPE_RIP_OFFSET_LIST,
-  MTYPE_RIP_INFO,
-  MTYPE_RIP_PEER,
-  MTYPE_KEYCHAIN,
-  MTYPE_KEY,
-
-  MTYPE_RIPNG,
-  MTYPE_RIPNG_ROUTE,
-  MTYPE_RIPNG_AGGREGATE,
-  MTYPE_RIPNG_PEER,
-  MTYPE_RIPNG_OFFSET_LIST,
-  MTYPE_RIPNG_RTE_DATA,
-
-  MTYPE_VTYSH_CONFIG,
-  MTYPE_VTYSH_CONFIG_LINE,
-
-  MTYPE_VRF,
-  MTYPE_VRF_NAME,
-  
-  MTYPE_PRIVS,
+  int index;
+  const char *format;
+};
 
-  MTYPE_MAX
+struct mlist {
+  struct memory_list *list;
+  const char *name;
 };
+#include "lib/memtypes.h"
+
+extern struct mlist mlists[];
 
+/* #define MEMORY_LOG */
 #ifdef MEMORY_LOG
 #define XMALLOC(mtype, size) \
   mtype_zmalloc (__FILE__, __LINE__, (mtype), (size))
@@ -227,43 +53,39 @@ enum
 #define XMALLOC(mtype, size)       zmalloc ((mtype), (size))
 #define XCALLOC(mtype, size)       zcalloc ((mtype), (size))
 #define XREALLOC(mtype, ptr, size) zrealloc ((mtype), (ptr), (size))
-#define XFREE(mtype, ptr)          zfree ((mtype), (ptr))
+#define XFREE(mtype, ptr)          do { \
+                                     zfree ((mtype), (ptr)); \
+                                     ptr = NULL; } \
+                                   while (0)
 #define XSTRDUP(mtype, str)        zstrdup ((mtype), (str))
 #endif /* MEMORY_LOG */
 
 /* Prototypes of memory function. */
-void *zmalloc (int type, size_t size);
-void *zcalloc (int type, size_t size);
-void *zrealloc (int type, void *ptr, size_t size);
-void  zfree (int type, void *ptr);
-char *zstrdup (int type, const char *str);
+extern void *zmalloc (int type, size_t size);
+extern void *zcalloc (int type, size_t size);
+extern void *zrealloc (int type, void *ptr, size_t size);
+extern void  zfree (int type, void *ptr);
+extern char *zstrdup (int type, const char *str);
+
+extern void *mtype_zmalloc (const char *file, int line, int type, size_t size);
 
-void *mtype_zmalloc (const char *file,
-                    int line,
-                    int type,
-                    size_t size);
+extern void *mtype_zcalloc (const char *file, int line, int type, 
+                            size_t num, size_t size);
 
-void *mtype_zcalloc (const char *file,
-                    int line,
-                    int type,
-                    size_t num,
-                    size_t size);
+extern void *mtype_zrealloc (const char *file, int line, int type, void *ptr,
+                            size_t size);
 
-void *mtype_zrealloc (const char *file,
-                    int line,
-                    int type, 
-                    void *ptr,
-                    size_t size);
+extern void mtype_zfree (const char *file, int line, int type,
+                        void *ptr);
 
-void mtype_zfree (const char *file,
-                 int line,
-                 int type,
-                 void *ptr);
+extern char *mtype_zstrdup (const char *file, int line, int type,
+                           const char *str);
+extern void memory_init (void);
 
-char *mtype_zstrdup (const char *file,
-                    int line,
-                    int type,
-                    const char *str);
-void memory_init ();
+/* return number of allocations outstanding for the type */
+extern unsigned long mtype_stats_alloc (int);
 
+/* Human friendly string for given byte count */
+#define MTYPE_MEMSTR_LEN 20
+extern const char *mtype_memstr (char *, size_t, unsigned long);
 #endif /* _ZEBRA_MEMORY_H */