Annotation of embedaddon/strongswan/src/libstrongswan/collections/hashtable_profiler.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2020 Tobias Brunner
! 3: * HSR Hochschule fuer Technik Rapperswil
! 4: *
! 5: * This program is free software; you can redistribute it and/or modify it
! 6: * under the terms of the GNU General Public License as published by the
! 7: * Free Software Foundation; either version 2 of the License, or (at your
! 8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 9: *
! 10: * This program is distributed in the hope that it will be useful, but
! 11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 13: * for more details.
! 14: */
! 15:
! 16: #ifndef HASHTABLE_PROFILER_H_
! 17: #define HASHTABLE_PROFILER_H_
! 18:
! 19: #ifdef HASHTABLE_PROFILER
! 20:
! 21: #include <time.h>
! 22: #include <utils/backtrace.h>
! 23:
! 24: typedef struct hashtable_profile_t hashtable_profile_t;
! 25:
! 26: struct hashtable_profile_t {
! 27:
! 28: /**
! 29: * Some stats to profile lookups in the table
! 30: */
! 31: struct {
! 32: size_t count;
! 33: size_t probes;
! 34: size_t longest;
! 35: } success, failure;
! 36:
! 37: /**
! 38: * Stats on the memory usage of the table
! 39: */
! 40: struct {
! 41: size_t count;
! 42: size_t size;
! 43: } max;
! 44:
! 45: /**
! 46: * Keep track of where the hash table was created
! 47: */
! 48: backtrace_t *backtrace;
! 49: };
! 50:
! 51: /**
! 52: * Print and cleanup profiling data
! 53: */
! 54: static inline void profiler_cleanup(hashtable_profile_t *profile, u_int count,
! 55: u_int size)
! 56: {
! 57: if (profile->success.count || profile->failure.count)
! 58: {
! 59: fprintf(stderr, "%zu elements [max. %zu], %zu buckets [%zu], %zu "
! 60: "successful / %zu failed lookups, %.4f [%zu] / %.4f "
! 61: "[%zu] avg. probes in table created at:",
! 62: count, profile->max.count, size, profile->max.size,
! 63: profile->success.count, profile->failure.count,
! 64: (double)profile->success.probes/profile->success.count,
! 65: profile->success.longest,
! 66: (double)profile->failure.probes/profile->failure.count,
! 67: profile->failure.longest);
! 68: profile->backtrace->log(profile->backtrace, stderr, TRUE);
! 69: }
! 70: profile->backtrace->destroy(profile->backtrace);
! 71: }
! 72:
! 73: /**
! 74: * Initialize profiling data
! 75: */
! 76: static inline void profiler_init(hashtable_profile_t *profile, int skip)
! 77: {
! 78: profile->backtrace = backtrace_create(skip);
! 79: }
! 80:
! 81: #define lookup_start() \
! 82: u_int _lookup_probes = 0;
! 83:
! 84: #define lookup_probing() \
! 85: _lookup_probes++;
! 86:
! 87: #define _lookup_done(profile, result) \
! 88: (profile)->result.count++; \
! 89: (profile)->result.probes += _lookup_probes; \
! 90: (profile)->result.longest = max((profile)->result.longest, _lookup_probes);
! 91:
! 92: #define lookup_success(profile) _lookup_done(profile, success);
! 93: #define lookup_failure(profile) _lookup_done(profile, failure);
! 94:
! 95: static inline void profile_size(hashtable_profile_t *profile, u_int size)
! 96: {
! 97: profile->max.size = max(profile->max.size, size);
! 98: }
! 99:
! 100: static inline void profile_count(hashtable_profile_t *profile, u_int count)
! 101: {
! 102: profile->max.count = max(profile->max.count, count);
! 103: }
! 104:
! 105: #else /* !HASHTABLE_PROFILER */
! 106:
! 107: #define hashtable_profile_t struct {}
! 108: #define profiler_cleanup(...) {}
! 109: #define profiler_init(...) {}
! 110: #define lookup_start(...) {}
! 111: #define lookup_probing(...) {}
! 112: #define lookup_success(...) {}
! 113: #define lookup_failure(...) {}
! 114: #define profile_size(...) {}
! 115: #define profile_count(...) {}
! 116:
! 117: #endif /* HASHTABLE_PROFILER */
! 118:
! 119: #endif /* HASHTABLE_PROFILER_H_ */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>