X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fbcache.h;h=929375642046047641443de196a10b46614fdd85;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=aa0147926c68a6cdd1660fee347d22f93da475fb;hpb=42a4f53d2bf8938c2aeda9f52be7a20534b214a9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/bcache.h b/gdb/bcache.h index aa0147926c..9293756420 100644 --- a/gdb/bcache.h +++ b/gdb/bcache.h @@ -2,7 +2,7 @@ Written by Fred Fish Rewritten by Jim Blandy - Copyright (C) 1999-2019 Free Software Foundation, Inc. + Copyright (C) 1999-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -136,41 +136,94 @@ */ - -struct bcache; - -/* Find a copy of the LENGTH bytes at ADDR in BCACHE. If BCACHE has - never seen those bytes before, add a copy of them to BCACHE. In - either case, return a pointer to BCACHE's copy of that string. - Since the cached value is ment to be read-only, return a const - buffer. */ -extern const void *bcache (const void *addr, int length, - struct bcache *bcache); - -/* Like bcache, but if ADDED is not NULL, set *ADDED to true if the - bytes were newly added to the cache, or to false if the bytes were - found in the cache. */ -extern const void *bcache_full (const void *addr, int length, - struct bcache *bcache, int *added); - -/* Free all the storage used by BCACHE. */ -extern void bcache_xfree (struct bcache *bcache); - -/* Create a new bcache object. */ -extern struct bcache *bcache_xmalloc ( - unsigned long (*hash_function)(const void *, int length), - int (*compare_function)(const void *, const void *, int length)); - -/* Print statistics on BCACHE's memory usage and efficacity at - eliminating duplication. TYPE should be a string describing the - kind of data BCACHE holds. Statistics are printed using - `printf_filtered' and its ilk. */ -extern void print_bcache_statistics (struct bcache *bcache, const char *type); -extern int bcache_memory_used (struct bcache *bcache); - -/* The hash functions */ -extern unsigned long hash(const void *addr, int length); -extern unsigned long hash_continue (const void *addr, int length, - unsigned long h); +namespace gdb { + +struct bstring; + +struct bcache +{ + /* Allocate a bcache. HASH_FN and COMPARE_FN can be used to pass in + custom hash, and compare functions to be used by this bcache. If + HASH_FUNCTION is NULL fast_hash() is used and if COMPARE_FUNCTION is + NULL memcmp() is used. */ + + explicit bcache (unsigned long (*hash_fn)(const void *, + int length) = nullptr, + int (*compare_fn)(const void *, const void *, + int length) = nullptr) + : m_hash_function (hash_fn == nullptr ? default_hash : hash_fn), + m_compare_function (compare_fn == nullptr ? compare : compare_fn) + { + } + + ~bcache (); + + /* Find a copy of the LENGTH bytes at ADDR in BCACHE. If BCACHE has + never seen those bytes before, add a copy of them to BCACHE. In + either case, return a pointer to BCACHE's copy of that string. + Since the cached value is ment to be read-only, return a const + buffer. If ADDED is not NULL, set *ADDED to true if the bytes + were newly added to the cache, or to false if the bytes were + found in the cache. */ + + const void *insert (const void *addr, int length, int *added = nullptr); + + /* Print statistics on this bcache's memory usage and efficacity at + eliminating duplication. TYPE should be a string describing the + kind of data this bcache holds. Statistics are printed using + `printf_filtered' and its ilk. */ + void print_statistics (const char *type); + int memory_used (); + +private: + + /* All the bstrings are allocated here. */ + struct obstack m_cache {}; + + /* How many hash buckets we're using. */ + unsigned int m_num_buckets = 0; + + /* Hash buckets. This table is allocated using malloc, so when we + grow the table we can return the old table to the system. */ + struct bstring **m_bucket = nullptr; + + /* Statistics. */ + unsigned long m_unique_count = 0; /* number of unique strings */ + long m_total_count = 0; /* total number of strings cached, including dups */ + long m_unique_size = 0; /* size of unique strings, in bytes */ + long m_total_size = 0; /* total number of bytes cached, including dups */ + long m_structure_size = 0; /* total size of bcache, including infrastructure */ + /* Number of times that the hash table is expanded and hence + re-built, and the corresponding number of times that a string is + [re]hashed as part of entering it into the expanded table. The + total number of hashes can be computed by adding TOTAL_COUNT to + expand_hash_count. */ + unsigned long m_expand_count = 0; + unsigned long m_expand_hash_count = 0; + /* Number of times that the half-hash compare hit (compare the upper + 16 bits of hash values) hit, but the corresponding combined + length/data compare missed. */ + unsigned long m_half_hash_miss_count = 0; + + /* Hash function to be used for this bcache object. */ + unsigned long (*m_hash_function)(const void *addr, int length); + + /* Compare function to be used for this bcache object. */ + int (*m_compare_function)(const void *, const void *, int length); + + /* Default compare function. */ + static int compare (const void *addr1, const void *addr2, int length); + + /* Default hash function. */ + static unsigned long default_hash (const void *ptr, int length) + { + return fast_hash (ptr, length, 0); + } + + /* Expand the hash table. */ + void expand_hash_table (); +}; + +} /* namespace gdb */ #endif /* BCACHE_H */