Add missing function nghash_delete_special(),
developed for branch gc-local
This commit is contained in:
parent
b9afd2bd16
commit
7c38699cd7
|
|
@ -326,6 +326,7 @@ extern void *nghash_find(NGHASHPTR hashtable, void * user_key) ;
|
||||||
extern void *nghash_find_again(NGHASHPTR hashtable, void * user_key) ;
|
extern void *nghash_find_again(NGHASHPTR hashtable, void * user_key) ;
|
||||||
extern void *_nghash_find_again(NGHASHPTR hashtable, void * user_key,BOOL *status) ;
|
extern void *_nghash_find_again(NGHASHPTR hashtable, void * user_key,BOOL *status) ;
|
||||||
extern void *nghash_delete(NGHASHPTR hashtable, void * user_key) ;
|
extern void *nghash_delete(NGHASHPTR hashtable, void * user_key) ;
|
||||||
|
extern void *nghash_delete_special(NGHASHPTR hashtable, void* user_key);
|
||||||
extern void *nghash_insert(NGHASHPTR hashtable, void * user_key, void * data) ;
|
extern void *nghash_insert(NGHASHPTR hashtable, void * user_key, void * data) ;
|
||||||
/*
|
/*
|
||||||
The four functions above replace the old nghash_search function. The same
|
The four functions above replace the old nghash_search function. The same
|
||||||
|
|
|
||||||
|
|
@ -405,6 +405,85 @@ void * nghash_delete(NGHASHPTR hashtable, void * user_key)
|
||||||
|
|
||||||
} /* end nghash_delete() */
|
} /* end nghash_delete() */
|
||||||
|
|
||||||
|
|
||||||
|
/* different return value:
|
||||||
|
NGHASH_FUNC_PTR always returns NULL.
|
||||||
|
This function returns the pointer, if _not_ successful, otherwise NULL */
|
||||||
|
void * nghash_delete_special(NGHASHPTR hashtable, void* user_key)
|
||||||
|
{
|
||||||
|
int ret_code;
|
||||||
|
unsigned int hsum;
|
||||||
|
void* user_data_p;
|
||||||
|
NGTABLEPTR curPtr, * prevPtr;
|
||||||
|
NGTABLEPTR* table;
|
||||||
|
|
||||||
|
/* initialization */
|
||||||
|
table = hashtable->hash_table;
|
||||||
|
DS(hashtable->access++;);
|
||||||
|
|
||||||
|
/* -----------------------------------------------------------------
|
||||||
|
* Process the hash function.
|
||||||
|
----------------------------------------------------------------- */
|
||||||
|
switch ((intptr_t)hashtable->hash_func) {
|
||||||
|
case NGHASH_FUNC_STR:
|
||||||
|
NGHASH_STR_TO_HASH(user_key, hsum, hashtable->size);
|
||||||
|
break;
|
||||||
|
case NGHASH_FUNC_PTR:
|
||||||
|
NGHASH_PTR_TO_HASH(user_key, hsum, hashtable->size);
|
||||||
|
break;
|
||||||
|
case NGHASH_FUNC_NUM:
|
||||||
|
NGHASH_NUM_TO_HASH(user_key, hsum, hashtable->size);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
hsum = hashtable->hash_func(hashtable, user_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* insert into table only if distinct number */
|
||||||
|
curPtr = table[hsum];
|
||||||
|
if (curPtr) {
|
||||||
|
/* list started at this hash */
|
||||||
|
prevPtr = table + hsum;
|
||||||
|
for (; curPtr; prevPtr = &(curPtr->next), curPtr = curPtr->next) {
|
||||||
|
if (hashtable->compare_func == NGHASH_DEF_CMP(NGHASH_FUNC_STR)) {
|
||||||
|
ret_code = strcmp((char*)curPtr->key, (char*)user_key);
|
||||||
|
}
|
||||||
|
else if (hashtable->compare_func == NGHASH_DEF_CMP(NGHASH_FUNC_PTR) ||
|
||||||
|
hashtable->compare_func == NGHASH_DEF_CMP(NGHASH_FUNC_NUM)) {
|
||||||
|
ret_code = NGHASH_PTR_COMPARE_FUNC(curPtr->key, user_key);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ret_code = hashtable->compare_func(curPtr->key, user_key);
|
||||||
|
}
|
||||||
|
if (ret_code == STRINGEQ) {
|
||||||
|
if (curPtr->thread_prev) { /* no sentinel */
|
||||||
|
curPtr->thread_prev->thread_next = curPtr->thread_next;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
hashtable->thread = curPtr->thread_next;
|
||||||
|
}
|
||||||
|
if (curPtr->thread_next) { /* no sentinel */
|
||||||
|
curPtr->thread_next->thread_prev = curPtr->thread_prev;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
hashtable->last_entry = curPtr->thread_prev;
|
||||||
|
}
|
||||||
|
*prevPtr = curPtr->next;
|
||||||
|
if (hashtable->hash_func == NGHASH_DEF_HASH(NGHASH_FUNC_STR)) {
|
||||||
|
/* we allocated this ourselves we can delete it */
|
||||||
|
NGFREE(curPtr->key);
|
||||||
|
}
|
||||||
|
user_data_p = curPtr->data;
|
||||||
|
NGFREE(curPtr);
|
||||||
|
hashtable->num_entries--;
|
||||||
|
return(user_data_p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(user_key); /* didn't find anything to delete */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void * nghash_insert(NGHASHPTR hashtable, void * user_key, void * data)
|
void * nghash_insert(NGHASHPTR hashtable, void * user_key, void * data)
|
||||||
{
|
{
|
||||||
int ret_code ;
|
int ret_code ;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue