php-src/ext/rpc/hash.h

75 lines
1.8 KiB
C

#ifndef HASH_H
#define HASH_H
static int zend_ts_hash_remove_key_or_index(TsHashTable *ht, char *arKey, uint nKeyLength, void **pData);
static int zend_ts_hash_remove_key_or_index(TsHashTable *ht, char *arKey, uint nKeyLength, void **pData)
{
uint nIndex;
uint h = nKeyLength;
uint result;
void **ppData;
Bucket *p;
tsrm_mutex_lock(ht->mx_writer);
if (arKey) {
result = zend_hash_find(TS_HASH(ht), arKey, nKeyLength, (void **) &ppData);
} else {
result = zend_hash_index_find(TS_HASH(ht), h, (void **) &ppData);
}
if (result == SUCCESS) {
*pData = *ppData;
if (arKey) {
h = zend_inline_hash_func(arKey, nKeyLength);
}
nIndex = h & TS_HASH(ht)->nTableMask;
p = TS_HASH(ht)->arBuckets[nIndex];
while (p != NULL) {
if ((p->h == h) && ((p->nKeyLength == 0) || /* Numeric index */
((p->nKeyLength == nKeyLength) && (!memcmp(p->arKey, arKey, nKeyLength))))) {
HANDLE_BLOCK_INTERRUPTIONS();
if (p == TS_HASH(ht)->arBuckets[nIndex]) {
TS_HASH(ht)->arBuckets[nIndex] = p->pNext;
} else {
p->pLast->pNext = p->pNext;
}
if (p->pNext) {
p->pNext->pLast = p->pLast;
}
if (p->pListLast != NULL) {
p->pListLast->pListNext = p->pListNext;
} else {
/* Deleting the head of the list */
TS_HASH(ht)->pListHead = p->pListNext;
}
if (p->pListNext != NULL) {
p->pListNext->pListLast = p->pListLast;
} else {
TS_HASH(ht)->pListTail = p->pListLast;
}
if (TS_HASH(ht)->pInternalPointer == p) {
TS_HASH(ht)->pInternalPointer = p->pListNext;
}
if (!p->pDataPtr) {
pefree(p->pData, TS_HASH(ht)->persistent);
}
pefree(p, TS_HASH(ht)->persistent);
HANDLE_UNBLOCK_INTERRUPTIONS();
TS_HASH(ht)->nNumOfElements--;
return SUCCESS;
}
p = p->pNext;
}
}
tsrm_mutex_unlock(ht->mx_writer);
return FAILURE;
}
#endif /* HASH_H */