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>