diff options
author | rizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-04-12 20:40:46 +0000 |
---|---|---|
committer | rizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-04-12 20:40:46 +0000 |
commit | 08c77ea86d932596542a63a1a67cb3e6a1229135 (patch) | |
tree | 0b296463204ccd97d57e585d6659dd75d15280fc /include/asterisk | |
parent | db922028c05355324c33e3a08ce427ed0a16b45f (diff) |
add 'show threads' and 'show profile' commands.
These are momstly debugging tools for developers,
a bit documented in the header files (utils.h),
although more documentation is definitely necessary.
The performance impact is close to zero(*) so there is no
need to compile it conditionally.
(*) not completely true - thread destruction still needs
to search a list _but_ this can be easily optimized if we
end up with hundreds of active threads (in which case, though,
the problem is clearly elsewhere).
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@19544 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'include/asterisk')
-rw-r--r-- | include/asterisk/compat.h | 1 | ||||
-rw-r--r-- | include/asterisk/lock.h | 35 | ||||
-rw-r--r-- | include/asterisk/utils.h | 10 |
3 files changed, 43 insertions, 3 deletions
diff --git a/include/asterisk/compat.h b/include/asterisk/compat.h index 4ed0b7a5d..79d23e7e7 100644 --- a/include/asterisk/compat.h +++ b/include/asterisk/compat.h @@ -80,6 +80,7 @@ int unsetenv(const char *name); #endif #ifdef __linux__ +#include <inttypes.h> #define HAVE_STRCASESTR #define HAVE_STRNDUP #define HAVE_STRNLEN diff --git a/include/asterisk/lock.h b/include/asterisk/lock.h index f0192e7ba..e86462306 100644 --- a/include/asterisk/lock.h +++ b/include/asterisk/lock.h @@ -56,6 +56,23 @@ #ifndef _ASTERISK_LOCK_H #define _ASTERISK_LOCK_H +/* internal macro to profile mutexes. Only computes the delay on + * non-blocking calls. + */ +#ifndef HAVE_MTX_PROFILE +#define __MTX_PROF /* nothing */ +#else +#define __MTX_PROF { \ + int i; \ + /* profile only non-blocking events */ \ + ast_mark(mtx_prof, 1); \ + i = pthread_mutex_trylock(pmutex); \ + ast_mark(mtx_prof, 0); \ + if (!i) \ + return i; \ + } +#endif /* HAVE_MTX_PROFILE */ + #include <pthread.h> #include <netdb.h> #include <time.h> @@ -75,7 +92,7 @@ #endif #ifdef BSD -#ifdef __GNUC__ +#if 0 && defined( __GNUC__) #define AST_MUTEX_INIT_W_CONSTRUCTORS #else #define AST_MUTEX_INIT_ON_FIRST_USE @@ -264,7 +281,13 @@ static inline int __ast_pthread_mutex_lock(const char *filename, int lineno, con time_t seconds = time(NULL); time_t current; do { +#ifdef HAVE_MTX_PROFILE + ast_mark(mtx_prof, 1); +#endif res = pthread_mutex_trylock(&t->mutex); +#ifdef HAVE_MTX_PROFILE + ast_mark(mtx_prof, 0); +#endif if (res == EBUSY) { current = time(NULL); if ((current - seconds) && (!((current - seconds) % 5))) { @@ -279,6 +302,12 @@ static inline int __ast_pthread_mutex_lock(const char *filename, int lineno, con } while (res == EBUSY); } #else +#ifdef HAVE_MTX_PROFILE + ast_mark(mtx_prof, 1); + res = pthread_mutex_trylock(&t->mutex); + ast_mark(mtx_prof, 0); + if (res) +#endif res = pthread_mutex_lock(&t->mutex); #endif /* DETECT_DEADLOCKS */ @@ -581,6 +610,7 @@ static void __attribute__ ((destructor)) fini_##mutex(void) \ static inline int ast_mutex_lock(ast_mutex_t *pmutex) { + __MTX_PROF return pthread_mutex_lock(pmutex); } @@ -601,8 +631,10 @@ static inline int ast_mutex_lock(ast_mutex_t *pmutex) { if (*pmutex == (ast_mutex_t)AST_MUTEX_KIND) ast_mutex_init(pmutex); + __MTX_PROF return pthread_mutex_lock(pmutex); } + static inline int ast_mutex_trylock(ast_mutex_t *pmutex) { if (*pmutex == (ast_mutex_t)AST_MUTEX_KIND) @@ -616,6 +648,7 @@ static inline int ast_mutex_trylock(ast_mutex_t *pmutex) static inline int ast_mutex_lock(ast_mutex_t *pmutex) { + __MTX_PROF return pthread_mutex_lock(pmutex); } diff --git a/include/asterisk/utils.h b/include/asterisk/utils.h index c702fa6fb..35f2539ef 100644 --- a/include/asterisk/utils.h +++ b/include/asterisk/utils.h @@ -225,8 +225,14 @@ static force_inline int inaddrcmp(const struct sockaddr_in *sin1, const struct s } #define AST_STACKSIZE 256 * 1024 -#define ast_pthread_create(a,b,c,d) ast_pthread_create_stack(a,b,c,d,0) -int ast_pthread_create_stack(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *data, size_t stacksize); + +void ast_register_thread(char *name); +void ast_unregister_thread(void *id); + +#define ast_pthread_create(a,b,c,d) ast_pthread_create_stack(a,b,c,d,0, \ + __FILE__, __FUNCTION__, __LINE__, #c) +int ast_pthread_create_stack(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *data, size_t stacksize, + const char *file, const char *caller, int line, const char *start_fn); /*! \brief Process a string to find and replace characters |