]> granicus.if.org Git - php/commitdiff
MFZE1: make sure the resource-list is always consistent during shutdown (Thies).
authorSebastian Bergmann <sebastian@php.net>
Fri, 19 Apr 2002 16:53:36 +0000 (16:53 +0000)
committerSebastian Bergmann <sebastian@php.net>
Fri, 19 Apr 2002 16:53:36 +0000 (16:53 +0000)
Zend/zend_hash.c
Zend/zend_hash.h
Zend/zend_list.c

index 694ba7f9883a6d994a3af1fb32737510fc70cbcc..d4c50560d42100d0fb29e3c0e3f976b79f326993 100644 (file)
@@ -653,6 +653,23 @@ ZEND_API void zend_hash_graceful_destroy(HashTable *ht)
        SET_INCONSISTENT(HT_DESTROYED);
 }
 
+ZEND_API void zend_hash_graceful_reverse_destroy(HashTable *ht)
+{
+       Bucket *p;
+
+       IS_CONSISTENT(ht);
+
+       p = ht->pListTail;
+       while (p != NULL) {
+               zend_hash_apply_deleter(ht, p);
+               p = ht->pListTail;
+       }
+
+       pefree(ht->arBuckets, ht->persistent);
+
+       SET_INCONSISTENT(HT_DESTROYED);
+}
+
 /* This is used to selectively delete certain entries from a hashtable.
  * destruct() receives the data and decides if the entry should be deleted 
  * or not
index 85a9b9a48fdd1a93eb859d1d7434dc87d598e997..5e5571e13442a21af51f4e721cf7f7739ad0e02a 100644 (file)
@@ -119,6 +119,7 @@ typedef int (*apply_func_arg_t)(void *pDest, void *argument TSRMLS_DC);
 typedef int (*apply_func_args_t)(void *pDest, int num_args, va_list args, zend_hash_key *hash_key);
 
 ZEND_API void zend_hash_graceful_destroy(HashTable *ht);
+ZEND_API void zend_hash_graceful_reverse_destroy(HashTable *ht);
 ZEND_API void zend_hash_apply(HashTable *ht, apply_func_t apply_func TSRMLS_DC);
 ZEND_API void zend_hash_apply_with_argument(HashTable *ht, apply_func_arg_t apply_func, void * TSRMLS_DC);
 ZEND_API void zend_hash_apply_with_arguments(HashTable *ht, apply_func_args_t apply_func, int, ...);
index 4f33c8c3449645da39a071fd119480b393646c48..0bae054bab4b9101e5c7373b6fed3dcbf5547cd4 100644 (file)
@@ -230,30 +230,7 @@ int zend_init_rsrc_plist(TSRMLS_D)
 
 void zend_destroy_rsrc_list(HashTable *ht TSRMLS_DC)
 {
-       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) {
-                       zend_try {
-                               ht->pDestructor(p->pData);
-                       } zend_end_try();
-               }
-               if (!p->pDataPtr && p->pData) {
-                       pefree(p->pData, ht->persistent);
-               }
-               pefree(p, ht->persistent);
-       }
-       pefree(ht->arBuckets, ht->persistent);
+       zend_hash_graceful_reverse_destroy(ht);
 }