cvs: Zend / zend_hash.c zend_hash.h zend_list.c
| From: | Thies C. Arntzen | Date: | Thu, 18 Apr 2002 17:37:30 +0000 |
| Subject: | cvs: Zend / zend_hash.c zend_hash.h zend_list.c | ||
| Groups: | php.zend-engine.cvs | ||
| Request: | Send a blank email to php-zend-engine-cvs+get-53@lists.php.net to get a copy of this message | ||
thies Thu Apr 18 13:37:30 2002 EDT
Modified files:
/Zend zend_hash.c zend_hash.h zend_list.c
Log:
make sure the resource-list is always consistent during shutdown. this fixes
#15499 (which seems unrelated, but it isn't;-)
Index: Zend/zend_hash.c
diff -u Zend/zend_hash.c:1.83 Zend/zend_hash.c:1.84
--- Zend/zend_hash.c:1.83 Sun Jan 6 10:21:09 2002
+++ Zend/zend_hash.c Thu Apr 18 13:37:28 2002
@@ -651,6 +651,23 @@
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: Zend/zend_hash.h
diff -u Zend/zend_hash.h:1.55 Zend/zend_hash.h:1.56
--- Zend/zend_hash.h:1.55 Sun Jan 6 10:21:09 2002
+++ Zend/zend_hash.h Thu Apr 18 13:37:29 2002
@@ -119,6 +119,7 @@
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: Zend/zend_list.c
diff -u Zend/zend_list.c:1.52 Zend/zend_list.c:1.53
--- Zend/zend_list.c:1.52 Sun Jan 6 10:21:09 2002
+++ Zend/zend_list.c Thu Apr 18 13:37:29 2002
@@ -230,32 +230,8 @@
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);
}
-
static int clean_module_resource(zend_rsrc_list_entry *le, int *resource_id TSRMLS_DC)
{