Fix to the hashtable support

Renamed alloc_dcb, free_dcb and connect_dcb to be more consistant, e.g. dcb_alloc, dcb_free and dcb_connect
This commit is contained in:
Mark Riddoch
2013-06-24 15:09:37 +02:00
parent 1d3da6d18f
commit 2ec19bf7ca
7 changed files with 28 additions and 51 deletions

View File

@ -96,12 +96,12 @@ HASHTABLE *rval;
rval->n_readers = 0;
rval->writelock = 0;
spinlock_init(&rval->spin);
if ((rval->entries = calloc(size, sizeof(HASHENTRIES))) == NULL)
if ((rval->entries = (HASHENTRIES **)calloc(size, sizeof(HASHENTRIES *))) == NULL)
{
free(rval);
return NULL;
}
memset(rval->entries, 0, size * sizeof(HASHENTRIES));
memset(rval->entries, 0, size * sizeof(HASHENTRIES *));
return rval;
}
@ -121,12 +121,6 @@ HASHENTRIES *entry, *ptr;
for (i = 0; i < table->hashsize; i++)
{
entry = table->entries[i];
if (entry->key)
{
table->freefn(entry->key);
table->freefn(entry->value);
}
entry = entry->next;
while (entry)
{
ptr = entry->next;
@ -172,17 +166,11 @@ HASHENTRIES *entry;
hashtable_write_lock(table);
entry = table->entries[hashkey % table->hashsize];
while (entry->next && entry->key && table->cmpfn(key, entry->key) != 0)
while (entry && table->cmpfn(key, entry->key) != 0)
{
entry = entry->next;
}
if (entry->key == NULL)
{
/* Entry is empty - special case for first insert */
entry->key = table->copyfn(key);
entry->value = table->copyfn(value);
}
else if (table->cmpfn(key, entry->key) == 0)
if (entry && table->cmpfn(key, entry->key) == 0)
{
/* Duplicate key value */
hashtable_write_unlock(table);
@ -198,8 +186,8 @@ HASHENTRIES *entry;
}
ptr->key = table->copyfn(key);
ptr->value = table->copyfn(value);
ptr->next = NULL;
entry->next = ptr;
ptr->next = table->entries[hashkey % table->hashsize];
table->entries[hashkey % table->hashsize] = ptr;
}
hashtable_write_unlock(table);
return 1;
@ -224,7 +212,7 @@ HASHENTRIES *entry, *ptr;
{
entry = entry->next;
}
if (entry == NULL || entry->key == NULL)
if (entry == NULL)
{
/* Not found */
hashtable_write_unlock(table);
@ -233,24 +221,13 @@ HASHENTRIES *entry, *ptr;
if (entry == table->entries[hashkey % table->hashsize])
{
/* We are removing from the special first entry */
if (entry->next)
{
table->freefn(entry->key);
table->freefn(entry->value);
entry->key = entry->next->key;
entry->value = entry->next->value;
ptr = entry->next;
entry->next = ptr->next;
free(ptr);
}
else
{
table->freefn(entry->key);
table->freefn(entry->value);
entry->key = NULL;
entry->value = NULL;
}
/* We are removing from the first entry */
table->entries[hashkey % table->hashsize] = entry->next;
table->freefn(entry->key);
table->freefn(entry->value);
entry->key = entry->next->key;
entry->value = entry->next->value;
free(entry);
}
else
{
@ -290,7 +267,7 @@ HASHENTRIES *entry;
{
entry = entry->next;
}
if (entry == NULL || entry->key == NULL)
if (entry == NULL)
{
hashtable_read_unlock(table);
return NULL;