23#include "gdbsupport/gdb_obstack.h"
61#define CHAIN_LENGTH_THRESHOLD (5)
71 static const unsigned long sizes[] = {
72 1021, 2053, 4099, 8191, 16381, 32771,
73 65537, 131071, 262144, 524287, 1048573, 2097143,
74 4194301, 8388617, 16777213, 33554467, 67108859, 134217757,
75 268435459, 536870923, 1073741827, 2147483659UL
77 unsigned int new_num_buckets;
88 for (
unsigned long a_size : sizes)
91 new_num_buckets = a_size;
97 size_t new_size = new_num_buckets *
sizeof (new_buckets[0]);
100 memset (new_buckets, 0, new_size);
118 s->
next = *new_bucket;
134#define BSTRING_SIZE(n) (offsetof (struct bstring, d.data) + (n))
145 unsigned long full_hash;
146 unsigned short half_hash;
150 if (added !=
nullptr)
170 full_hash = this->
hash (addr, length);
172 half_hash = (full_hash >> 16);
183 && this->compare (&s->
d.
data, addr, length))
196 memcpy (&newobj->
d.
data, addr, length);
206 if (added !=
nullptr)
209 return &newobj->
d.
data;
227 return memcmp (left, right, length) == 0;
250 gdb_printf (
"%3d%%\n", (
int) (portion * 100.0 / total));
261 int occupied_buckets;
262 int max_chain_length;
263 int median_chain_length;
265 int median_entry_size;
275 occupied_buckets = 0;
292 entry_size[stringi++] = s->
length;
310 max_chain_length = 0;
311 median_chain_length = 0;
321 median_entry_size = 0;
324 xfree (chain_length);
331 gdb_printf (_(
" Percentage of duplicates, by count: "));
337 gdb_printf (_(
" Percentage of duplicates, by size: "));
341 gdb_printf (_(
" Max entry size: %d\n"), max_entry_size);
348 gdb_printf (_(
" Median entry size: %d\n"), median_entry_size);
352Total memory used by bcache, including overhead: %ld\n"),
354 gdb_printf (_(
" Percentage memory overhead: "));
370 gdb_printf (_(
" Median hash chain length: %3d\n"),
371 median_chain_length);
372 gdb_printf (_(
" Average hash chain length: "));
378 gdb_printf (_(
" Maximum hash chain length: %3d\n"),
388 return obstack_memory_used (&
m_cache);
#define CHAIN_LENGTH_THRESHOLD
static void print_percentage(int portion, int total)
unsigned int m_num_buckets
virtual int compare(const void *left, const void *right, int length)
unsigned long m_unique_count
virtual unsigned long hash(const void *addr, int length)
unsigned long m_expand_count
void print_statistics(const char *type)
unsigned long m_half_hash_miss_count
const void * insert(const void *addr, int length, bool *added=nullptr)
unsigned long m_expand_hash_count
struct bstring ** m_bucket
union gdb::bstring::@18 d
void gdb_printf(struct ui_file *stream, const char *format,...)
static unsigned int fast_hash(const void *ptr, size_t len, unsigned int start_value=0)