Annotation of embedaddon/strongswan/src/libstrongswan/threading/lock_profiler.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2008 Tobias Brunner
! 3: * Copyright (C) 2008 Martin Willi
! 4: * HSR Hochschule fuer Technik Rapperswil
! 5: *
! 6: * This program is free software; you can redistribute it and/or modify it
! 7: * under the terms of the GNU General Public License as published by the
! 8: * Free Software Foundation; either version 2 of the License, or (at your
! 9: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 10: *
! 11: * This program is distributed in the hope that it will be useful, but
! 12: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 13: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 14: * for more details.
! 15: */
! 16:
! 17: #ifndef THREADING_LOCK_PROFILER_H_
! 18: #define THREADING_LOCK_PROFILER_H_
! 19:
! 20: #ifdef LOCK_PROFILER
! 21:
! 22: #include <time.h>
! 23:
! 24: /**
! 25: * Do not report mutexes with an overall waiting time smaller than this (in us)
! 26: */
! 27: #define PROFILE_WAIT_TRESHOLD 10000
! 28:
! 29: /**
! 30: * Do not report mutexes with an overall lock count smaller than this
! 31: */
! 32: #define PROFILE_LOCK_TRESHOLD 1000
! 33:
! 34: #include <utils/backtrace.h>
! 35:
! 36: typedef struct lock_profile_t lock_profile_t;
! 37:
! 38: struct lock_profile_t {
! 39: /**
! 40: * how long threads have waited for the lock in this mutex so far
! 41: */
! 42: timeval_t waited;
! 43:
! 44: /**
! 45: * How many times the lock has been invoked
! 46: */
! 47: u_int locked;
! 48:
! 49: /**
! 50: * backtrace where mutex has been created
! 51: */
! 52: backtrace_t *backtrace;
! 53: };
! 54:
! 55: /**
! 56: * Print and cleanup mutex profiler
! 57: */
! 58: static inline void profiler_cleanup(lock_profile_t *profile)
! 59: {
! 60: if (profile->waited.tv_sec > 0 ||
! 61: profile->waited.tv_usec > PROFILE_WAIT_TRESHOLD ||
! 62: profile->locked > PROFILE_LOCK_TRESHOLD)
! 63: {
! 64: fprintf(stderr, "%d.%03ds / %d times in lock created at:",
! 65: profile->waited.tv_sec, profile->waited.tv_usec, profile->locked);
! 66: profile->backtrace->log(profile->backtrace, stderr, TRUE);
! 67: }
! 68: profile->backtrace->destroy(profile->backtrace);
! 69: }
! 70:
! 71: /**
! 72: * Initialize mutex profiler
! 73: */
! 74: static inline void profiler_init(lock_profile_t *profile)
! 75: {
! 76: profile->backtrace = backtrace_create(2);
! 77: timerclear(&profile->waited);
! 78: profile->locked = 0;
! 79: }
! 80:
! 81: #define profiler_start(profile) { \
! 82: struct timeval _start, _end, _diff; \
! 83: (profile)->locked++; \
! 84: time_monotonic(&_start);
! 85:
! 86: #define profiler_end(profile) \
! 87: time_monotonic(&_end); \
! 88: timersub(&_end, &_start, &_diff); \
! 89: timeradd(&(profile)->waited, &_diff, &(profile)->waited); }
! 90:
! 91: #else /* !LOCK_PROFILER */
! 92:
! 93: #define lock_profile_t struct {}
! 94: #define profiler_cleanup(...) {}
! 95: #define profiler_init(...) {}
! 96: #define profiler_start(...) {}
! 97: #define profiler_end(...) {}
! 98:
! 99: #endif /* LOCK_PROFILER */
! 100:
! 101: #endif /* THREADING_LOCK_PROFILER_H_ */
! 102:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>