From d4f626b2a97b145751ad74826d9b52268e4839ca Mon Sep 17 00:00:00 2001 From: Jean-Francois Lefebvre Date: Mon, 17 Dec 2001 06:19:22 +0000 Subject: [PATCH] 2001-12-17 07:20 UTC+0100 JFL (Mafact) --- harbour/ChangeLog | 7 +++++++ harbour/source/vm/garbage.c | 14 ++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index d30a71b6fb..fa27c455a9 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,13 @@ 2002-12-01 23:12 UTC+0100 Foo Bar */ +2001-12-17 07:20 UTC+0100 JFL (Mafact) + + * source/vm/garbage.c + ! RON Fix for forever loop when GC try to free first item in the + arrayclone cloned list. + + 2001-12-16 21:28 UTC+0100 Viktor Szakats * source/rtl/tbrowse.prg diff --git a/harbour/source/vm/garbage.c b/harbour/source/vm/garbage.c index 394034d30b..8f5d43e905 100644 --- a/harbour/source/vm/garbage.c +++ b/harbour/source/vm/garbage.c @@ -179,7 +179,7 @@ HB_ITEM_PTR hb_gcGripGet( HB_ITEM_PTR pOrigin ) if( pAlloc ) { HB_ITEM_PTR pItem = ( HB_ITEM_PTR )( pAlloc + 1 ); - + hb_gcLink( &s_pLockedBlock, pAlloc ); pAlloc->pFunc = hb_gcGripRelease; pAlloc->locked = 1; @@ -209,7 +209,7 @@ void hb_gcGripDrop( HB_ITEM_PTR pItem ) --pAlloc; hb_itemClear( pItem ); /* clear value stored in this item */ - + hb_gcUnlink( &s_pLockedBlock, pAlloc ); HB_GARBAGE_FREE( pAlloc ); } @@ -368,7 +368,9 @@ void hb_gcCollectAll( void ) /* call a cleanup function */ s_pCurrBlock->used |= HB_GC_DELETE; if( s_pCurrBlock->pFunc ) + { ( s_pCurrBlock->pFunc )( ( void *)( s_pCurrBlock + 1 ) ); + } } s_pCurrBlock = s_pCurrBlock->pNext; } while ( s_pCurrBlock && (pAlloc != s_pCurrBlock) ); @@ -380,10 +382,18 @@ void hb_gcCollectAll( void ) { pDelete = s_pCurrBlock; hb_gcUnlink( &s_pCurrBlock, s_pCurrBlock ); + + if( pDelete == pAlloc ) + { + pAlloc = s_pCurrBlock; + } + HB_GARBAGE_FREE( pDelete ); } else + { s_pCurrBlock = s_pCurrBlock->pNext; + } } while ( s_pCurrBlock && (pAlloc != s_pCurrBlock) ); s_bCollecting = FALSE;