diff options
author | Zeev Suraski <zeev@php.net> | 2001-07-20 14:20:34 +0000 |
---|---|---|
committer | Zeev Suraski <zeev@php.net> | 2001-07-20 14:20:34 +0000 |
commit | 8084d278850b9b4cf4880ed75cf19f04c38b953f (patch) | |
tree | 9a25327a80e28385e284a968651c876d02813ef5 /Zend/zend_list.c | |
parent | 13ac04b8e504ba5b0d531bee43d602e6980e2e20 (diff) | |
download | php-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.c | 27 |
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)); |