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


-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to