Re: Zend Engine expert wanted!!!!

From: Date: Fri, 07 Jun 2002 20:00:39 +0000
Subject: Re: Zend Engine expert wanted!!!!
References: 1  Groups: php.dev 
Request: Send a blank email to php-dev+get-85004@lists.php.net to get a copy of this message
I will try that, but I was worried that the pDestructor function would not get called for each item like it was in zend_hash_destroy. Is this the case? Looking at the code what is the difference between zend_hash_graceful_destroy and zend_hash_destroy? Thanks again for the help! Brian At 10:53 PM +0300 6/7/02, Andi Gutmans wrote:
Can you check and see if using zend_hash_graceful_reverse_destroy() fixes your problem? Andi At 11:44 AM 6/7/2002 -0700, Brian France wrote:
Zend Engine unloading extension in the wrong order! (Re-post due to no response) I have been tracking down a core dump with my php extension when it is unloading some of its shared libraries. I have shared extension that is link against libexpat and will load fine if it is the only on in the php.ini. If I then load xml.so extension then my extension it works fine, but if it is my extension then xml.so it crashes while xml.so is unloading libexapt. What I have found is the Zend Engine is unloading extension in the same order it loaded them. load: foo_bar.so load: xml.so unload: foo_bar.so unload: xml.so I believe this is wrong and think it should be in reverse order. load: foo_bar.so load: xml.so unload: xml.so unload: foo_bar.so There are two ways to fix this problem. One is to push the modules to the head of the hash, but looking at the zend_hash_add function I decided to go with the second. Second way is to destroy them in reverse order. I created a zend_hash_reverse_destroy and call that instead of zend_hash_destroy. There may be a better way to do this, but this is the quick fix for me. I have included a patch below, should I submit a bug report as well? Thanks, Brian diff -rc php-4.2.1/Zend/zend.c
*** php-4.2.1/Zend/zend.c       Tue Feb 26 10:59:25 2002
--- php-4.2.1/Zend/zend.c       Thu Jun  6 11:32:57 2002
*************** *** 487,493 ****
        zend_destroy_rsrc_list(&EG(persistent_list) TSRMLS_CC);
#endif
        zend_destroy_rsrc_list_dtors();
!       zend_hash_destroy(&module_registry);
        zend_hash_destroy(GLOBAL_FUNCTION_TABLE);
        free(GLOBAL_FUNCTION_TABLE);
        zend_hash_destroy(GLOBAL_CLASS_TABLE);
--- 487,493 ----
        zend_destroy_rsrc_list(&EG(persistent_list) TSRMLS_CC);
#endif
        zend_destroy_rsrc_list_dtors();
!       zend_hash_reverse_destroy(&module_registry);
        zend_hash_destroy(GLOBAL_FUNCTION_TABLE);
        free(GLOBAL_FUNCTION_TABLE);
        zend_hash_destroy(GLOBAL_CLASS_TABLE);
diff -rc php-4.2.1/Zend/zend_hash.c *** php-4.2.1/Zend/zend_hash.c Mon Apr 22 23:53:26 2002 --- php-4.2.1/Zend/zend_hash.c Thu Jun 6 11:32:57 2002 *************** *** 550,555 **** --- 550,579 ----
        SET_INCONSISTENT(HT_DESTROYED);
} + ZEND_API void zend_hash_reverse_destroy(HashTable *ht) + {
+       Bucket *p, *q;
+
+       IS_CONSISTENT(ht);
+
+       SET_INCONSISTENT(HT_IS_DESTROYING);
+
+       p = ht->pListTail;
+       while (p != NULL) {
+               q = p;
+               p = p->pLast;
+               if (ht->pDestructor) {
+                       ht->pDestructor(q->pData);
+               }
+               if (!q->pDataPtr && q->pData) {
+                       pefree(q->pData, ht->persistent);
+               }
+               pefree(q, ht->persistent);
+       }
+       pefree(ht->arBuckets, ht->persistent);
+
+       SET_INCONSISTENT(HT_DESTROYED);
+ } ZEND_API void zend_hash_clean(HashTable *ht) { -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php


« previous php.dev (#85004) next »