1 | /* |
2 | * Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved. |
3 | * |
4 | * Licensed under the Apache License 2.0 (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 | |