summaryrefslogtreecommitdiff
path: root/Zend/zend_list.c
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2001-07-20 14:20:34 +0000
committerZeev Suraski <zeev@php.net>2001-07-20 14:20:34 +0000
commit8084d278850b9b4cf4880ed75cf19f04c38b953f (patch)
tree9a25327a80e28385e284a968651c876d02813ef5 /Zend/zend_list.c
parent13ac04b8e504ba5b0d531bee43d602e6980e2e20 (diff)
downloadphp-git-8084d278850b9b4cf4880ed75cf19f04c38b953f.tar.gz
Implement a more granular shutdown mechanism for the executor -
prevent corruption of constants and missing destructions of resources
Diffstat (limited to 'Zend/zend_list.c')
-rw-r--r--Zend/zend_list.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/Zend/zend_list.c b/Zend/zend_list.c
index 5f13b83937..a4a567b26d 100644
--- a/Zend/zend_list.c
+++ b/Zend/zend_list.c
@@ -231,10 +231,35 @@ int zend_init_rsrc_plist(ELS_D)
void zend_destroy_rsrc_list(ELS_D)
{
- zend_hash_reverse_destroy(&EG(regular_list));
+ Bucket *p, *q;
+ HashTable *ht = &EG(regular_list);
+
+ while (1) {
+ p = ht->pListTail;
+ if (!p) {
+ break;
+ }
+ q = p->pListLast;
+ if (q) {
+ q->pListNext = NULL;
+ }
+ ht->pListTail = q;
+
+ if (ht->pDestructor) {
+ if (setjmp(EG(bailout))==0) {
+ ht->pDestructor(p->pData);
+ }
+ }
+ if (!p->pDataPtr && p->pData) {
+ pefree(p->pData, ht->persistent);
+ }
+ pefree(p, ht->persistent);
+ }
+ pefree(ht->arBuckets, ht->persistent);
}
+
void zend_destroy_rsrc_plist(ELS_D)
{
zend_hash_reverse_destroy(&EG(persistent_list));