1 /* 2 * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 #include <stdio.h> 11 #include <string.h> 12 #include <stdlib.h> 13 /* 14 * If you wish to build this outside of OpenSSL, remove the following lines 15 * and things should work as expected 16 */ 17 #include "internal/cryptlib.h" 18 19 #include <openssl/bio.h> 20 #include <openssl/lhash.h> 21 #include "lhash_local.h" 22 23 # ifndef OPENSSL_NO_STDIO 24 void OPENSSL_LH_stats(const OPENSSL_LHASH *lh, FILE *fp) 25 { 26 BIO *bp; 27 28 bp = BIO_new(BIO_s_file()); 29 if (bp == NULL) 30 return; 31 BIO_set_fp(bp, fp, BIO_NOCLOSE); 32 OPENSSL_LH_stats_bio(lh, bp); 33 BIO_free(bp); 34 } 35 36 void OPENSSL_LH_node_stats(const OPENSSL_LHASH *lh, FILE *fp) 37 { 38 BIO *bp; 39 40 bp = BIO_new(BIO_s_file()); 41 if (bp == NULL) 42 return; 43 BIO_set_fp(bp, fp, BIO_NOCLOSE); 44 OPENSSL_LH_node_stats_bio(lh, bp); 45 BIO_free(bp); 46 } 47 48 void OPENSSL_LH_node_usage_stats(const OPENSSL_LHASH *lh, FILE *fp) 49 { 50 BIO *bp; 51 52 bp = BIO_new(BIO_s_file()); 53 if (bp == NULL) 54 return; 55 BIO_set_fp(bp, fp, BIO_NOCLOSE); 56 OPENSSL_LH_node_usage_stats_bio(lh, bp); 57 BIO_free(bp); 58 } 59 60 # endif 61 62 void OPENSSL_LH_stats_bio(const OPENSSL_LHASH *lh, BIO *out) 63 { 64 BIO_printf(out, "num_items = %lu\n", lh->num_items); 65 BIO_printf(out, "num_nodes = %u\n", lh->num_nodes); 66 BIO_printf(out, "num_alloc_nodes = %u\n", lh->num_alloc_nodes); 67 BIO_printf(out, "num_expands = %lu\n", lh->num_expands); 68 BIO_printf(out, "num_expand_reallocs = %lu\n", lh->num_expand_reallocs); 69 BIO_printf(out, "num_contracts = %lu\n", lh->num_contracts); 70 BIO_printf(out, "num_contract_reallocs = %lu\n", lh->num_contract_reallocs); 71 BIO_printf(out, "num_hash_calls = %lu\n", lh->num_hash_calls); 72 BIO_printf(out, "num_comp_calls = %lu\n", lh->num_comp_calls); 73 BIO_printf(out, "num_insert = %lu\n", lh->num_insert); 74 BIO_printf(out, "num_replace = %lu\n", lh->num_replace); 75 BIO_printf(out, "num_delete = %lu\n", lh->num_delete); 76 BIO_printf(out, "num_no_delete = %lu\n", lh->num_no_delete); 77 BIO_printf(out, "num_retrieve = %lu\n", lh->num_retrieve); 78 BIO_printf(out, "num_retrieve_miss = %lu\n", lh->num_retrieve_miss); 79 BIO_printf(out, "num_hash_comps = %lu\n", lh->num_hash_comps); 80 } 81 82 void OPENSSL_LH_node_stats_bio(const OPENSSL_LHASH *lh, BIO *out) 83 { 84 OPENSSL_LH_NODE *n; 85 unsigned int i, num; 86 87 for (i = 0; i < lh->num_nodes; i++) { 88 for (n = lh->b[i], num = 0; n != NULL; n = n->next) 89 num++; 90 BIO_printf(out, "node %6u -> %3u\n", i, num); 91 } 92 } 93 94 void OPENSSL_LH_node_usage_stats_bio(const OPENSSL_LHASH *lh, BIO *out) 95 { 96 OPENSSL_LH_NODE *n; 97 unsigned long num; 98 unsigned int i; 99 unsigned long total = 0, n_used = 0; 100 101 for (i = 0; i < lh->num_nodes; i++) { 102 for (n = lh->b[i], num = 0; n != NULL; n = n->next) 103 num++; 104 if (num != 0) { 105 n_used++; 106 total += num; 107 } 108 } 109 BIO_printf(out, "%lu nodes used out of %u\n", n_used, lh->num_nodes); 110 BIO_printf(out, "%lu items\n", total); 111 if (n_used == 0) 112 return; 113 BIO_printf(out, "load %d.%02d actual load %d.%02d\n", 114 (int)(total / lh->num_nodes), 115 (int)((total % lh->num_nodes) * 100 / lh->num_nodes), 116 (int)(total / n_used), (int)((total % n_used) * 100 / n_used)); 117 } 118