mirror of
https://github.com/php/php-src.git
synced 2024-10-14 04:52:33 +00:00
75 lines
1.8 KiB
C
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 */
|