summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThies C. Arntzen <thies@php.net>2001-07-13 12:05:47 +0000
committerThies C. Arntzen <thies@php.net>2001-07-13 12:05:47 +0000
commit7b7e72d1d25d41ee65c15ad6ca242cb6517b569d (patch)
treef91db120f37a57cc22366dff6544fadb14f2c0b3
parent249c010d92af717fe9f76c497cf3f0003781f1f2 (diff)
downloadphp-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.c24
-rw-r--r--Zend/zend_hash.h1
-rw-r--r--Zend/zend_list.c4
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));
}