From 1726475a54f93ffbf0c5da329957326a2b5f3034 Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Mon, 4 May 2009 16:24:16 +0000 Subject: Ensure that astobj2 memory allocations are properly accounted for when MALLOC_DEBUG is used This commit ensures that all astobj2 allocated objects are properly accounted for in MALLOC_DEBUG mode by passing down the file/function/line information from the module/function that actually called the astobj2 allocation function. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@192059 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- include/asterisk/astobj2.h | 81 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 62 insertions(+), 19 deletions(-) (limited to 'include') diff --git a/include/asterisk/astobj2.h b/include/asterisk/astobj2.h index ecff72742..ce8ed4a88 100644 --- a/include/asterisk/astobj2.h +++ b/include/asterisk/astobj2.h @@ -402,8 +402,7 @@ typedef void (*ao2_destructor_fn)(void *); * @{ */ -#ifdef REF_DEBUG - +#if defined(REF_DEBUG) || defined(__AST_DEBUG_MALLOC) #define ao2_t_alloc(data_size, destructor_fn, debug_msg) __ao2_alloc_debug((data_size), (destructor_fn), (debug_msg), __FILE__, __LINE__, __PRETTY_FUNCTION__) #define ao2_alloc(data_size, destructor_fn) __ao2_alloc_debug((data_size), (destructor_fn), "", __FILE__, __LINE__, __PRETTY_FUNCTION__) @@ -414,8 +413,10 @@ typedef void (*ao2_destructor_fn)(void *); #define ao2_alloc(data_size, destructor_fn) __ao2_alloc((data_size), (destructor_fn)) #endif + void *__ao2_alloc_debug(const size_t data_size, ao2_destructor_fn destructor_fn, char *tag, char *file, int line, const char *funcname); void *__ao2_alloc(const size_t data_size, ao2_destructor_fn destructor_fn); + /*! @} */ /*! \brief @@ -442,14 +443,20 @@ void *__ao2_alloc(const size_t data_size, ao2_destructor_fn destructor_fn); */ #ifdef REF_DEBUG + #define ao2_t_ref(o,delta,tag) __ao2_ref_debug((o), (delta), (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__) #define ao2_ref(o,delta) __ao2_ref_debug((o), (delta), "", __FILE__, __LINE__, __PRETTY_FUNCTION__) + #else + #define ao2_t_ref(o,delta,tag) __ao2_ref((o), (delta)) #define ao2_ref(o,delta) __ao2_ref((o), (delta)) + #endif + int __ao2_ref_debug(void *o, int delta, char *tag, char *file, int line, const char *funcname); int __ao2_ref(void *o, int delta); + /*! @} */ /*! \brief @@ -691,23 +698,29 @@ struct ao2_container; * destructor is set implicitly. */ -#ifdef REF_DEBUG +#if defined(REF_DEBUG) || defined(__AST_DEBUG_MALLOC) + #define ao2_t_container_alloc(arg1,arg2,arg3,arg4) __ao2_container_alloc_debug((arg1), (arg2), (arg3), (arg4), __FILE__, __LINE__, __PRETTY_FUNCTION__) #define ao2_container_alloc(arg1,arg2,arg3) __ao2_container_alloc_debug((arg1), (arg2), (arg3), "", __FILE__, __LINE__, __PRETTY_FUNCTION__) + #else + #define ao2_t_container_alloc(arg1,arg2,arg3,arg4) __ao2_container_alloc((arg1), (arg2), (arg3)) #define ao2_container_alloc(arg1,arg2,arg3) __ao2_container_alloc((arg1), (arg2), (arg3)) + #endif + struct ao2_container *__ao2_container_alloc(const unsigned int n_buckets, - ao2_hash_fn *hash_fn, ao2_callback_fn *cmp_fn); + ao2_hash_fn *hash_fn, ao2_callback_fn *cmp_fn); struct ao2_container *__ao2_container_alloc_debug(const unsigned int n_buckets, - ao2_hash_fn *hash_fn, ao2_callback_fn *cmp_fn, - char *tag, char *file, int line, const char *funcname); + ao2_hash_fn *hash_fn, ao2_callback_fn *cmp_fn, + char *tag, char *file, int line, const char *funcname); /*! \brief * Returns the number of elements in a container. */ int ao2_container_count(struct ao2_container *c); + /*@} */ /*! \name Object Management @@ -738,15 +751,19 @@ int ao2_container_count(struct ao2_container *c); #define ao2_t_link(arg1, arg2, arg3) __ao2_link_debug((arg1), (arg2), (arg3), __FILE__, __LINE__, __PRETTY_FUNCTION__) #define ao2_link(arg1, arg2) __ao2_link_debug((arg1), (arg2), "", __FILE__, __LINE__, __PRETTY_FUNCTION__) + #else + #define ao2_t_link(arg1, arg2, arg3) __ao2_link((arg1), (arg2)) #define ao2_link(arg1, arg2) __ao2_link((arg1), (arg2)) + #endif + void *__ao2_link_debug(struct ao2_container *c, void *new_obj, char *tag, char *file, int line, const char *funcname); void *__ao2_link(struct ao2_container *c, void *newobj); /*! - * \brief Remove an object from the container + * \brief Remove an object from a container * * \param c the container * \param obj the object to unlink @@ -762,12 +779,17 @@ void *__ao2_link(struct ao2_container *c, void *newobj); * refcount will be decremented). */ #ifdef REF_DEBUG + #define ao2_t_unlink(arg1, arg2, arg3) __ao2_unlink_debug((arg1), (arg2), (arg3), __FILE__, __LINE__, __PRETTY_FUNCTION__) #define ao2_unlink(arg1, arg2) __ao2_unlink_debug((arg1), (arg2), "", __FILE__, __LINE__, __PRETTY_FUNCTION__) + #else + #define ao2_t_unlink(arg1, arg2, arg3) __ao2_unlink((arg1), (arg2)) #define ao2_unlink(arg1, arg2) __ao2_unlink((arg1), (arg2)) + #endif + void *__ao2_unlink_debug(struct ao2_container *c, void *obj, char *tag, char *file, int line, const char *funcname); void *__ao2_unlink(struct ao2_container *c, void *obj); @@ -777,6 +799,7 @@ struct ao2_list { struct ao2_list *next; void *obj; /* pointer to the user portion of the object */ }; + /*@} */ /*! \brief @@ -859,18 +882,21 @@ struct ao2_list { * @{ */ #ifdef REF_DEBUG + #define ao2_t_callback(c,flags,cb_fn,arg,tag) __ao2_callback_debug((c), (flags), (cb_fn), (arg), (tag), __FILE__, __LINE__, __PRETTY_FUNCTION__) #define ao2_callback(c,flags,cb_fn,arg) __ao2_callback_debug((c), (flags), (cb_fn), (arg), "", __FILE__, __LINE__, __PRETTY_FUNCTION__) + #else + #define ao2_t_callback(c,flags,cb_fn,arg,tag) __ao2_callback((c), (flags), (cb_fn), (arg)) #define ao2_callback(c,flags,cb_fn,arg) __ao2_callback((c), (flags), (cb_fn), (arg)) + #endif -void *__ao2_callback_debug(struct ao2_container *c, enum search_flags flags, - ao2_callback_fn *cb_fn, void *arg, char *tag, - char *file, int line, const char *funcname); -void *__ao2_callback(struct ao2_container *c, - enum search_flags flags, - ao2_callback_fn *cb_fn, void *arg); + +void *__ao2_callback_debug(struct ao2_container *c, enum search_flags flags, ao2_callback_fn *cb_fn, + void *arg, char *tag, char *file, int line, const char *funcname); +void *__ao2_callback(struct ao2_container *c, enum search_flags flags, ao2_callback_fn *cb_fn, void *arg); + /*! @} */ /*! \brief @@ -889,30 +915,40 @@ void *__ao2_callback(struct ao2_container *c, * \see ao2_callback() */ #ifdef REF_DEBUG + #define ao2_t_callback_data(arg1,arg2,arg3,arg4,arg5,arg6) __ao2_callback_data_debug((arg1), (arg2), (arg3), (arg4), (arg5), (arg6), __FILE__, __LINE__, __PRETTY_FUNCTION__) #define ao2_callback_data(arg1,arg2,arg3,arg4,arg5) __ao2_callback_data_debug((arg1), (arg2), (arg3), (arg4), (arg5), "", __FILE__, __LINE__, __PRETTY_FUNCTION__) + #else + #define ao2_t_callback_data(arg1,arg2,arg3,arg4,arg5,arg6) __ao2_callback_data((arg1), (arg2), (arg3), (arg4), (arg5)) #define ao2_callback_data(arg1,arg2,arg3,arg4,arg5) __ao2_callback_data((arg1), (arg2), (arg3), (arg4), (arg5)) + #endif + void *__ao2_callback_data_debug(struct ao2_container *c, enum search_flags flags, - ao2_callback_data_fn *cb_fn, void *arg, void *data, char *tag, - char *file, int line, const char *funcname); -void *__ao2_callback_data(struct ao2_container *c, - enum search_flags flags, - ao2_callback_data_fn *cb_fn, void *arg, void *data); + ao2_callback_data_fn *cb_fn, void *arg, void *data, char *tag, + char *file, int line, const char *funcname); +void *__ao2_callback_data(struct ao2_container *c, enum search_flags flags, + ao2_callback_data_fn *cb_fn, void *arg, void *data); /*! ao2_find() is a short hand for ao2_callback(c, flags, c->cmp_fn, arg) * XXX possibly change order of arguments ? */ #ifdef REF_DEBUG + #define ao2_t_find(arg1,arg2,arg3,arg4) __ao2_find_debug((arg1), (arg2), (arg3), (arg4), __FILE__, __LINE__, __PRETTY_FUNCTION__) #define ao2_find(arg1,arg2,arg3) __ao2_find_debug((arg1), (arg2), (arg3), "", __FILE__, __LINE__, __PRETTY_FUNCTION__) + #else + #define ao2_t_find(arg1,arg2,arg3,arg4) __ao2_find((arg1), (arg2), (arg3)) #define ao2_find(arg1,arg2,arg3) __ao2_find((arg1), (arg2), (arg3)) + #endif -void *__ao2_find_debug(struct ao2_container *c, void *arg, enum search_flags flags, char *tag, char *file, int line, const char *funcname); + +void *__ao2_find_debug(struct ao2_container *c, void *arg, enum search_flags flags, char *tag, + char *file, int line, const char *funcname); void *__ao2_find(struct ao2_container *c, void *arg, enum search_flags flags); /*! \brief @@ -1011,16 +1047,23 @@ struct ao2_iterator { searches for the next pointer */ struct ao2_iterator ao2_iterator_init(struct ao2_container *c, int flags); + #ifdef REF_DEBUG + #define ao2_t_iterator_next(arg1, arg2) __ao2_iterator_next_debug((arg1), (arg2), __FILE__, __LINE__, __PRETTY_FUNCTION__) #define ao2_iterator_next(arg1) __ao2_iterator_next_debug((arg1), "", __FILE__, __LINE__, __PRETTY_FUNCTION__) + #else + #define ao2_t_iterator_next(arg1, arg2) __ao2_iterator_next((arg1)) #define ao2_iterator_next(arg1) __ao2_iterator_next((arg1)) + #endif + void *__ao2_iterator_next_debug(struct ao2_iterator *a, char *tag, char *file, int line, const char *funcname); void *__ao2_iterator_next(struct ao2_iterator *a); /* extra functions */ void ao2_bt(void); /* backtrace */ + #endif /* _ASTERISK_ASTOBJ2_H */ -- cgit v1.2.3