X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fbcache.h;h=929375642046047641443de196a10b46614fdd85;hb=53a47a3e4904839a902e34d4dfd3f53c397d66e1;hp=c6ce25f96757d164c7fd6b7252077c8d174bea24;hpb=01f0fe5e0450edf168c1f612feb93cf588e4e7ea;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/bcache.h b/gdb/bcache.h index c6ce25f967..9293756420 100644 --- a/gdb/bcache.h +++ b/gdb/bcache.h @@ -2,13 +2,13 @@ Written by Fred Fish Rewritten by Jim Blandy - Copyright (C) 1999, 2000, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1999-2020 Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -17,9 +17,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ #ifndef BCACHE_H #define BCACHE_H 1 @@ -138,33 +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 void *deprecated_bcache (const void *addr, int length, - struct bcache *bcache); -extern const void *bcache (const void *addr, int length, - struct bcache *bcache); - -/* Free all the storage used by BCACHE. */ -extern void bcache_xfree (struct bcache *bcache); - -/* Create a new bcache object. */ -extern struct bcache *bcache_xmalloc (void); - -/* 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, char *type); -extern int bcache_memory_used (struct bcache *bcache); - -/* The hash function */ -extern unsigned long hash(const void *addr, int length); +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 */