Annotation of embedaddon/strongswan/src/libstrongswan/collections/hashtable_profiler.h, revision 1.1.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>