File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / strongswan / src / libstrongswan / threading / lock_profiler.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jun 3 09:46:44 2020 UTC (4 years, 3 months ago) by misho
Branches: strongswan, MAIN
CVS tags: v5_9_2p0, v5_8_4p7, HEAD
Strongswan

    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>