mirror of https://github.com/getdnsapi/getdns.git
Making sure that the project compiles on Windows when HAVE_MDNS_SUPPORT is present.
Moving the 2 additional LRU functions from mdns.c to lruhash.c Defining the 2 additional functions in lruhash.h
This commit is contained in:
parent
d511ce24de
commit
ed66edf52a
91
src/mdns.c
91
src/mdns.c
|
@ -110,96 +110,7 @@ static uint8_t mdns_suffix_b_e_f_ip6_arpa[] = {
|
|||
* deleted, using a "compression" procedure.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Missing LRU hash function: create only if not currently in cache,
|
||||
* and return the created or found entry.
|
||||
*
|
||||
* TODO: move this to lruhash.c, once source control issues are fixed.
|
||||
*/
|
||||
static struct lruhash_entry*
|
||||
lruhash_insert_or_retrieve(struct lruhash* table, hashvalue_type hash,
|
||||
struct lruhash_entry* entry, void* data, void* cb_arg)
|
||||
{
|
||||
struct lruhash_bin* bin;
|
||||
struct lruhash_entry* found, *reclaimlist = NULL;
|
||||
size_t need_size;
|
||||
fptr_ok(fptr_whitelist_hash_sizefunc(table->sizefunc));
|
||||
fptr_ok(fptr_whitelist_hash_delkeyfunc(table->delkeyfunc));
|
||||
fptr_ok(fptr_whitelist_hash_deldatafunc(table->deldatafunc));
|
||||
fptr_ok(fptr_whitelist_hash_compfunc(table->compfunc));
|
||||
fptr_ok(fptr_whitelist_hash_markdelfunc(table->markdelfunc));
|
||||
need_size = table->sizefunc(entry->key, data);
|
||||
if (cb_arg == NULL) cb_arg = table->cb_arg;
|
||||
|
||||
/* find bin */
|
||||
lock_quick_lock(&table->lock);
|
||||
bin = &table->array[hash & table->size_mask];
|
||||
lock_quick_lock(&bin->lock);
|
||||
|
||||
/* see if entry exists already */
|
||||
if ((found = bin_find_entry(table, bin, hash, entry->key)) != NULL) {
|
||||
/* if so: keep the existing data - acquire a writelock */
|
||||
lock_rw_wrlock(&found->lock);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* if not: add to bin */
|
||||
entry->overflow_next = bin->overflow_list;
|
||||
bin->overflow_list = entry;
|
||||
lru_front(table, entry);
|
||||
table->num++;
|
||||
table->space_used += need_size;
|
||||
/* return the entry that was presented, and lock it */
|
||||
found = entry;
|
||||
lock_rw_wrlock(&found->lock);
|
||||
}
|
||||
lock_quick_unlock(&bin->lock);
|
||||
if (table->space_used > table->space_max)
|
||||
reclaim_space(table, &reclaimlist);
|
||||
if (table->num >= table->size)
|
||||
table_grow(table);
|
||||
lock_quick_unlock(&table->lock);
|
||||
|
||||
/* finish reclaim if any (outside of critical region) */
|
||||
while (reclaimlist) {
|
||||
struct lruhash_entry* n = reclaimlist->overflow_next;
|
||||
void* d = reclaimlist->data;
|
||||
(*table->delkeyfunc)(reclaimlist->key, cb_arg);
|
||||
(*table->deldatafunc)(d, cb_arg);
|
||||
reclaimlist = n;
|
||||
}
|
||||
|
||||
/* return the entry that was selected */
|
||||
return found;
|
||||
}
|
||||
|
||||
/*
|
||||
* Another missing LRU hash function: demote, move an entry to the bottom
|
||||
* of the LRU pile.
|
||||
*/
|
||||
|
||||
static void
|
||||
lru_demote(struct lruhash* table, struct lruhash_entry* entry)
|
||||
{
|
||||
log_assert(table && entry);
|
||||
if (entry == table->lru_end)
|
||||
return; /* nothing to do */
|
||||
/* remove from current lru position */
|
||||
lru_remove(table, entry);
|
||||
/* add at end */
|
||||
entry->lru_next = NULL;
|
||||
entry->lru_prev = table->lru_end;
|
||||
|
||||
if (table->lru_end == NULL)
|
||||
{
|
||||
table->lru_start = entry;
|
||||
}
|
||||
else
|
||||
{
|
||||
table->lru_end->lru_next = entry;
|
||||
}
|
||||
table->lru_end = entry;
|
||||
}
|
||||
|
||||
/*
|
||||
* For the data part, we want to allocate in rounded increments, so as to reduce the
|
||||
|
@ -2153,7 +2064,7 @@ int mdns_addition_test(struct getdns_context* context,
|
|||
|
||||
if (ret == 0)
|
||||
{
|
||||
ret = mdns_finalize_lru_test(context, &mdns_exampleRRAM[12], 15, 1, 1,
|
||||
ret = mdns_finalize_lru_test(context, mdns_test_name, sizeof(mdns_test_name), 1, 1,
|
||||
1, buffer, buffer_max, entry_length);
|
||||
}
|
||||
|
||||
|
|
|
@ -45,6 +45,7 @@ on 1 byte), but shoehorning those bytes into integers efficiently is messy.
|
|||
/*#define SELF_TEST 1*/
|
||||
|
||||
#include "config.h"
|
||||
#include "util/lookup3.h"
|
||||
#include "util/storage/lookup3.h"
|
||||
#include <stdio.h> /* defines printf for tests */
|
||||
#include <time.h> /* defines time_t for timings in the test */
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
*/
|
||||
|
||||
#include "config.h"
|
||||
#include "util/lruhash.h"
|
||||
#include "util/storage/lruhash.h"
|
||||
#include "util/fptr_wlist.h"
|
||||
|
||||
|
@ -296,6 +297,92 @@ lru_touch(struct lruhash* table, struct lruhash_entry* entry)
|
|||
lru_front(table, entry);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Demote: the opposite of touch, move an entry to the bottom
|
||||
* of the LRU pile.
|
||||
*/
|
||||
|
||||
void
|
||||
lru_demote(struct lruhash* table, struct lruhash_entry* entry)
|
||||
{
|
||||
log_assert(table && entry);
|
||||
if (entry == table->lru_end)
|
||||
return; /* nothing to do */
|
||||
/* remove from current lru position */
|
||||
lru_remove(table, entry);
|
||||
/* add at end */
|
||||
entry->lru_next = NULL;
|
||||
entry->lru_prev = table->lru_end;
|
||||
|
||||
if (table->lru_end == NULL)
|
||||
{
|
||||
table->lru_start = entry;
|
||||
}
|
||||
else
|
||||
{
|
||||
table->lru_end->lru_next = entry;
|
||||
}
|
||||
table->lru_end = entry;
|
||||
}
|
||||
|
||||
struct lruhash_entry*
|
||||
lruhash_insert_or_retrieve(struct lruhash* table, hashvalue_type hash,
|
||||
struct lruhash_entry* entry, void* data, void* cb_arg)
|
||||
{
|
||||
struct lruhash_bin* bin;
|
||||
struct lruhash_entry* found, *reclaimlist = NULL;
|
||||
size_t need_size;
|
||||
fptr_ok(fptr_whitelist_hash_sizefunc(table->sizefunc));
|
||||
fptr_ok(fptr_whitelist_hash_delkeyfunc(table->delkeyfunc));
|
||||
fptr_ok(fptr_whitelist_hash_deldatafunc(table->deldatafunc));
|
||||
fptr_ok(fptr_whitelist_hash_compfunc(table->compfunc));
|
||||
fptr_ok(fptr_whitelist_hash_markdelfunc(table->markdelfunc));
|
||||
need_size = table->sizefunc(entry->key, data);
|
||||
if (cb_arg == NULL) cb_arg = table->cb_arg;
|
||||
|
||||
/* find bin */
|
||||
lock_quick_lock(&table->lock);
|
||||
bin = &table->array[hash & table->size_mask];
|
||||
lock_quick_lock(&bin->lock);
|
||||
|
||||
/* see if entry exists already */
|
||||
if ((found = bin_find_entry(table, bin, hash, entry->key)) != NULL) {
|
||||
/* if so: keep the existing data - acquire a writelock */
|
||||
lock_rw_wrlock(&found->lock);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* if not: add to bin */
|
||||
entry->overflow_next = bin->overflow_list;
|
||||
bin->overflow_list = entry;
|
||||
lru_front(table, entry);
|
||||
table->num++;
|
||||
table->space_used += need_size;
|
||||
/* return the entry that was presented, and lock it */
|
||||
found = entry;
|
||||
lock_rw_wrlock(&found->lock);
|
||||
}
|
||||
lock_quick_unlock(&bin->lock);
|
||||
if (table->space_used > table->space_max)
|
||||
reclaim_space(table, &reclaimlist);
|
||||
if (table->num >= table->size)
|
||||
table_grow(table);
|
||||
lock_quick_unlock(&table->lock);
|
||||
|
||||
/* finish reclaim if any (outside of critical region) */
|
||||
while (reclaimlist) {
|
||||
struct lruhash_entry* n = reclaimlist->overflow_next;
|
||||
void* d = reclaimlist->data;
|
||||
(*table->delkeyfunc)(reclaimlist->key, cb_arg);
|
||||
(*table->deldatafunc)(d, cb_arg);
|
||||
reclaimlist = n;
|
||||
}
|
||||
|
||||
/* return the entry that was selected */
|
||||
return found;
|
||||
}
|
||||
|
||||
void
|
||||
lruhash_insert(struct lruhash* table, hashvalue_type hash,
|
||||
struct lruhash_entry* entry, void* data, void* cb_arg)
|
||||
|
|
|
@ -46,8 +46,10 @@
|
|||
#define lruhash_delete _getdns_lruhash_delete
|
||||
#define lruhash_clear _getdns_lruhash_clear
|
||||
#define lruhash_insert _getdns_lruhash_insert
|
||||
#define lruhash_insert_or_retrieve _getdns_lruhash_insert_or_retrieve
|
||||
#define lruhash_lookup _getdns_lruhash_lookup
|
||||
#define lru_touch _getdns_lru_touch
|
||||
#define lru_demote _getdns_lru_demote
|
||||
#define lruhash_setmarkdel _getdns_lruhash_setmarkdel
|
||||
|
||||
#define lruhash_remove _getdns_lruhash_remove
|
||||
|
@ -65,4 +67,37 @@
|
|||
#define lruhash_traverse _getdns_lruhash_traverse
|
||||
|
||||
#include "util/orig-headers/lruhash.h"
|
||||
|
||||
/*
|
||||
* Additional function definitions, not found in original header.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Demote entry, so it becomes the least recently used in the LRU list.
|
||||
* Caller must hold hash table lock. The entry must be inserted already.
|
||||
* @param table: hash table.
|
||||
* @param entry: entry to make last in LRU.
|
||||
*/
|
||||
void lru_demote(struct lruhash* table, struct lruhash_entry* entry);
|
||||
|
||||
/**
|
||||
* Insert a new element into the hashtable, or retrieve the corresponding
|
||||
* element of it exits.
|
||||
*
|
||||
* If key is already present data pointer in that entry is kept.
|
||||
* If it is not present, a new entry is created. In that case,
|
||||
* the space calculation function is called with the key, data.
|
||||
* If necessary the least recently used entries are deleted to make space.
|
||||
* If necessary the hash array is grown up.
|
||||
*
|
||||
* @param table: hash table.
|
||||
* @param hash: hash value. User calculates the hash.
|
||||
* @param entry: identifies the entry.
|
||||
* @param data: the data.
|
||||
* @param cb_override: if not null overrides the cb_arg for the deletefunc.
|
||||
* @return: pointer to the existing entry if the key was already present,
|
||||
* or to the entry argument if it was not.
|
||||
*/
|
||||
struct lruhash_entry* lruhash_insert_or_retrieve(struct lruhash* table, hashvalue_type hash,
|
||||
struct lruhash_entry* entry, void* data, void* cb_arg);
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue