diff options
author | Thies C. Arntzen <thies@php.net> | 2001-07-13 12:05:47 +0000 |
---|---|---|
committer | Thies C. Arntzen <thies@php.net> | 2001-07-13 12:05:47 +0000 |
commit | 7b7e72d1d25d41ee65c15ad6ca242cb6517b569d (patch) | |
tree | f91db120f37a57cc22366dff6544fadb14f2c0b3 | |
parent | 249c010d92af717fe9f76c497cf3f0003781f1f2 (diff) | |
download | php-git-7b7e72d1d25d41ee65c15ad6ca242cb6517b569d.tar.gz |
the resource-lists are now destroyed backwards. this will make sure that
resources get destroyed in the opposite order they were created and thereby
db-cursors will always be released before their corresponding connection etc.
this sould not break anything!
-rw-r--r-- | Zend/zend_hash.c | 24 | ||||
-rw-r--r-- | Zend/zend_hash.h | 1 | ||||
-rw-r--r-- | Zend/zend_list.c | 4 |
3 files changed, 27 insertions, 2 deletions
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 425053fe2a..6cd2ea8e81 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -529,6 +529,30 @@ ZEND_API int zend_hash_del_key_or_index(HashTable *ht, char *arKey, uint nKeyLen return FAILURE; } +ZEND_API void zend_hash_reverse_destroy(HashTable *ht) +{ + Bucket *p, *q; + + while (1) { + p = ht->pListTail; + if (! p) + break; + q = p->pListLast; + if (q) + q->pListNext = NULL; + ht->pListTail = q; + + if (ht->pDestructor) { + ht->pDestructor(p->pData); + } + if (!p->pDataPtr && p->pData) { + pefree(p->pData, ht->persistent); + } + pefree(p, ht->persistent); + } + pefree(ht->arBuckets, ht->persistent); +} + ZEND_API void zend_hash_destroy(HashTable *ht) { diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h index 7b34ee5729..5639002994 100644 --- a/Zend/zend_hash.h +++ b/Zend/zend_hash.h @@ -81,6 +81,7 @@ BEGIN_EXTERN_C() ZEND_API int zend_hash_init(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, int persistent); ZEND_API int zend_hash_init_ex(HashTable *ht, uint nSize, hash_func_t pHashFunction, dtor_func_t pDestructor, int persistent, zend_bool bApplyProtection); ZEND_API void zend_hash_destroy(HashTable *ht); +ZEND_API void zend_hash_reverse_destroy(HashTable *ht); ZEND_API void zend_hash_clean(HashTable *ht); diff --git a/Zend/zend_list.c b/Zend/zend_list.c index 0576556c5f..5f13b83937 100644 --- a/Zend/zend_list.c +++ b/Zend/zend_list.c @@ -231,13 +231,13 @@ int zend_init_rsrc_plist(ELS_D) void zend_destroy_rsrc_list(ELS_D) { - zend_hash_graceful_destroy(&EG(regular_list)); + zend_hash_reverse_destroy(&EG(regular_list)); } void zend_destroy_rsrc_plist(ELS_D) { - zend_hash_graceful_destroy(&EG(persistent_list)); + zend_hash_reverse_destroy(&EG(persistent_list)); } |