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