return ((uint64_t)primes[pindex] * MAX_LOAD_PERCENT) / 100;
}
-struct hashtable *create_hashtable(const void *ctx, unsigned int minsize,
+struct hashtable *create_hashtable(const void *ctx, const char *name,
unsigned int (*hashf) (const void *),
int (*eqf) (const void *, const void *),
unsigned int flags)
{
struct hashtable *h;
- unsigned int pindex, size = primes[0];
-
- /* Check requested hashtable isn't too large */
- if (minsize > (1u << 30)) return NULL;
-
- /* Enforce size as prime */
- for (pindex = 0; pindex < PRIME_TABLE_LEN; pindex++) {
- if (primes[pindex] > minsize) {
- size = primes[pindex];
- break;
- }
- }
h = talloc_zero(ctx, struct hashtable);
if (NULL == h)
goto err0;
- h->table = talloc_zero_array(h, struct entry *, size);
+ talloc_set_name_const(h, name);
+ h->table = talloc_zero_array(h, struct entry *, primes[0]);
if (NULL == h->table)
goto err1;
- h->tablelength = size;
+ h->primeindex = 0;
+ h->tablelength = primes[h->primeindex];
h->flags = flags;
- h->primeindex = pindex;
h->entrycount = 0;
h->hashfn = hashf;
h->eqfn = eqf;
- h->loadlimit = loadlimit(pindex);
+ h->loadlimit = loadlimit(h->primeindex);
return h;
err1:
* @name create_hashtable
* @param ctx talloc context to use for allocations
- * @param minsize minimum initial size of hashtable
+ * @param name talloc name of the hashtable
* @param hashfunction function for hashing keys
* @param key_eq_fn function for determining key equality
* @param flags flags HASHTABLE_*
#define HASHTABLE_FREE_KEY (1U << 1)
struct hashtable *
-create_hashtable(const void *ctx, unsigned int minsize,
+create_hashtable(const void *ctx, const char *name,
unsigned int (*hashfunction) (const void *),
int (*key_eq_fn) (const void *, const void *),
unsigned int flags
struct check_store_data data;
/* Don't free values (they are all void *1) */
- data.reachable = create_hashtable(NULL, 16, hash_from_key_fn,
+ data.reachable = create_hashtable(NULL, "checkstore", hash_from_key_fn,
keys_equal_fn, HASHTABLE_FREE_KEY);
if (!data.reachable) {
log("check_store: ENOMEM");
int rc;
/* Start with a random rather low domain count for the hashtable. */
- domhash = create_hashtable(NULL, 8, domhash_fn, domeq_fn, 0);
+ domhash = create_hashtable(NULL, "domains", domhash_fn, domeq_fn, 0);
if (!domhash)
barf_perror("Failed to allocate domain hashtable");
{
struct hashtable *domains;
- domains = create_hashtable(NULL, 8, domhash_fn, domeq_fn,
+ domains = create_hashtable(NULL, "domain_check", domhash_fn, domeq_fn,
HASHTABLE_FREE_VALUE);
if (!domains)
return NULL;