From: <bi...@us...> - 2008-01-29 11:42:16
|
Revision: 2321 http://oorexx.svn.sourceforge.net/oorexx/?rev=2321&view=rev Author: bigrixx Date: 2008-01-29 03:42:17 -0800 (Tue, 29 Jan 2008) Log Message: ----------- [ 1881558 ] Not all unints are getting run Modified Paths: -------------- interpreter-3.x/trunk/kernel/runtime/RexxMemory.cpp interpreter-3.x/trunk/platform/windows/ole/orexxole.c Modified: interpreter-3.x/trunk/kernel/runtime/RexxMemory.cpp =================================================================== --- interpreter-3.x/trunk/kernel/runtime/RexxMemory.cpp 2008-01-28 19:27:35 UTC (rev 2320) +++ interpreter-3.x/trunk/kernel/runtime/RexxMemory.cpp 2008-01-29 11:42:17 UTC (rev 2321) @@ -534,13 +534,8 @@ /* uninitTabe exists, run UNINIT */ for (iterTable = uninitTable->first(); - (zombieObj = uninitTable->index(iterTable)) != OREF_NULL; - iterTable = uninitTable->next(iterTable)) + (zombieObj = uninitTable->index(iterTable)) != OREF_NULL;) { - // TODO: Ther's a bug here. Removing the object can cause the - // iterator to skip over an entry....something should be done to - // prevent this. - /* is this object readyfor UNINIT? */ if (uninitTable->value(iterTable) == TheTrueObject) { @@ -554,7 +549,22 @@ catch (ActivityException) { } /* remove zombie from uninit table */ uninitTable->remove(zombieObj); + + + // because we just did a remove operation, this will effect the iteration + // process. There are two possibilities here. Either A) we were at the end of the + // chain and this is now an empty slot or B) the removal process moved an new item + // into this slot. If it is case A), then we need to search for the next item. If + // it is case B) we'll just leave the index alone and process this position again. + if (uninitTable->index(iterTable) == OREF_NULL) + { + iterTable = uninitTable->next(iterTable); + } } + else + { + iterTable = uninitTable->next(iterTable); + } } /* now go check next object in table */ /* make sure we remove the recursion protection */ processingUninits = false; Modified: interpreter-3.x/trunk/platform/windows/ole/orexxole.c =================================================================== --- interpreter-3.x/trunk/platform/windows/ole/orexxole.c 2008-01-28 19:27:35 UTC (rev 2320) +++ interpreter-3.x/trunk/platform/windows/ole/orexxole.c 2008-01-29 11:42:17 UTC (rev 2321) @@ -596,10 +596,6 @@ switch( ul_reason_for_call ) { case DLL_PROCESS_DETACH: - if (iInstanceCount > 0) { - destroyTypeLibList(); - OleUninitialize(); - } // free class info memory [not a real leak] // not really needed, since the process will go away // and release that memory, but it is cleaner this way This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |