aboutsummaryrefslogtreecommitdiffstats
path: root/include/asterisk
diff options
context:
space:
mode:
authorrizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b>2006-04-12 20:40:46 +0000
committerrizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b>2006-04-12 20:40:46 +0000
commit08c77ea86d932596542a63a1a67cb3e6a1229135 (patch)
tree0b296463204ccd97d57e585d6659dd75d15280fc /include/asterisk
parentdb922028c05355324c33e3a08ce427ed0a16b45f (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.h1
-rw-r--r--include/asterisk/lock.h35
-rw-r--r--include/asterisk/utils.h10
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