aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Willi <martin@strongswan.org>2009-10-23 08:12:17 +0200
committerMartin Willi <martin@strongswan.org>2009-10-23 08:12:17 +0200
commit3dc40325d5eaa147f7692375058fe659caa49133 (patch)
treebdc925649bada125f5bce0e81d5325b132927683 /src
parentc5f36782ca31118e82c89c5a5010bcd0a37eff20 (diff)
downloadstrongswan-3dc40325d5eaa147f7692375058fe659caa49133.tar.bz2
strongswan-3dc40325d5eaa147f7692375058fe659caa49133.tar.xz
Show the number of times a lock was acquired in lock profiler
Diffstat (limited to 'src')
-rw-r--r--src/libstrongswan/utils/mutex.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/libstrongswan/utils/mutex.c b/src/libstrongswan/utils/mutex.c
index c7797c49e..3e1885a42 100644
--- a/src/libstrongswan/utils/mutex.c
+++ b/src/libstrongswan/utils/mutex.c
@@ -35,7 +35,13 @@ typedef struct private_rwlock_t private_rwlock_t;
/**
* Do not report mutexes with an overall waiting time smaller than this (in us)
*/
-#define PROFILE_TRESHHOLD 1000
+#define PROFILE_WAIT_TRESHHOLD 10000
+
+/**
+ * Do not report mutexes with an overall lock count smaller than this
+ */
+#define PROFILE_LOCK_TRESHHOLD 1000
+
#include <utils/backtrace.h>
@@ -49,6 +55,11 @@ struct lock_profile_t {
timeval_t waited;
/**
+ * How many times the lock has been invoked
+ */
+ u_int locked;
+
+ /**
* backtrace where mutex has been created
*/
backtrace_t *backtrace;
@@ -60,10 +71,11 @@ struct lock_profile_t {
static void profiler_cleanup(lock_profile_t *profile)
{
if (profile->waited.tv_sec > 0 ||
- profile->waited.tv_usec > PROFILE_TRESHHOLD)
+ profile->waited.tv_usec > PROFILE_WAIT_TRESHHOLD ||
+ profile->locked > PROFILE_LOCK_TRESHHOLD)
{
- fprintf(stderr, "%d.%06ds in lock created at:",
- profile->waited.tv_sec, profile->waited.tv_usec);
+ fprintf(stderr, "%d.%03ds / %d times in lock created at:",
+ profile->waited.tv_sec, profile->waited.tv_usec, profile->locked);
profile->backtrace->log(profile->backtrace, stderr);
}
profile->backtrace->destroy(profile->backtrace);
@@ -76,10 +88,12 @@ static void profiler_init(lock_profile_t *profile)
{
profile->backtrace = backtrace_create(2);
timerclear(&profile->waited);
+ profile->locked = 0;
}
#define profiler_start(profile) { \
struct timeval _start, _end, _diff; \
+ (profile)->locked++; \
time_monotonic(&_start);
#define profiler_end(profile) \