From 81d901b14dd87285977ba7947a0268adb6519089 Mon Sep 17 00:00:00 2001 From: Zeev Suraski Date: Fri, 9 Jul 1999 17:24:47 +0000 Subject: Step 1 in nuking the garbage collector: - Change the hash destructor to return int - Don't kill the bucket on hash_destroy if the destructor returns 0 --- Zend/zend_hash.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'Zend/zend_hash.c') diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 285cc840f8..edb8da272f 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -71,7 +71,7 @@ ZEND_API ulong hashpjw(char *arKey, uint nKeyLength) } -ZEND_API int zend_hash_init(HashTable *ht, uint nSize, ulong(*pHashFunction) (char *arKey, uint nKeyLength), void (*pDestructor) (void *pData),int persistent) +ZEND_API int zend_hash_init(HashTable *ht, uint nSize, ulong(*pHashFunction) (char *arKey, uint nKeyLength), int (*pDestructor) (void *pData),int persistent) { uint i; @@ -720,6 +720,7 @@ ZEND_API int zend_hash_del_key_or_index(HashTable *ht, char *arKey, uint nKeyLen ZEND_API void zend_hash_destroy(HashTable *ht) { Bucket *p, *q; + int delete_bucket; p = ht->pListHead; while (p != NULL) { @@ -727,13 +728,19 @@ ZEND_API void zend_hash_destroy(HashTable *ht) p = p->pListNext; if (!q->bIsPointer) { if (ht->pDestructor) { - ht->pDestructor(q->pData); + delete_bucket = ht->pDestructor(q->pData); + } else { + delete_bucket = 1; } if (!q->pDataPtr && q->pData) { pefree(q->pData,ht->persistent); } + } else { + delete_bucket = 1; + } + if (delete_bucket) { + pefree(q,ht->persistent); } - pefree(q,ht->persistent); } pefree(ht->arBuckets,ht->persistent); } -- cgit v1.2.1