2001-12-18 07:21 UTC+0100 JFL (Mafact) <jfl@mafact.com>
This commit is contained in:
@@ -8,6 +8,16 @@
|
||||
2002-12-01 23:12 UTC+0100 Foo Bar <foo.bar@foobar.org>
|
||||
*/
|
||||
|
||||
2001-12-18 07:21 UTC+0100 JFL (Mafact) <jfl@mafact.com>
|
||||
* source/vm/garbage.c
|
||||
! RON Further Fix for forever loop when GC try to free first item in the
|
||||
arrayclone cloned list.
|
||||
+ RON Added hb_gcReleaseAll()
|
||||
it will increase cleanup speed (on app termination), and will
|
||||
result in a more complete cleanup in certain situations
|
||||
* include/hbapi.h
|
||||
+ RON Added hb_gcReleaseAll()
|
||||
|
||||
2001-12-18 06:44 UTC+0100 Antonio Linares <alinares@fivetech.com>
|
||||
* source/vm/maindll.c
|
||||
* source/vm/maindllh.c
|
||||
|
||||
@@ -558,6 +558,7 @@ extern void * hb_gcLock( void *pAlloc ); /* do not release passed memory block *
|
||||
extern void * hb_gcUnlock( void *pAlloc ); /* passed block is allowed to be released */
|
||||
extern void hb_gcCollect( void ); /* checks if a single memory block can be released */
|
||||
extern void hb_gcCollectAll( void ); /* checks if all memory blocks can be released */
|
||||
extern void hb_gcReleaseAll( void ); /* release all memory blocks unconditionally */
|
||||
extern void hb_gcItemRef( HB_ITEM_PTR pItem ); /* checks if passed item refers passed memory block pointer */
|
||||
extern void hb_vmIsLocalRef( void ); /* hvm.c - mark all local variables as used */
|
||||
extern void hb_vmIsStaticRef( void ); /* hvm.c - mark all static variables as used */
|
||||
|
||||
@@ -372,32 +372,53 @@ void hb_gcCollectAll( void )
|
||||
( s_pCurrBlock->pFunc )( ( void *)( s_pCurrBlock + 1 ) );
|
||||
}
|
||||
}
|
||||
|
||||
s_pCurrBlock = s_pCurrBlock->pNext;
|
||||
|
||||
} while ( s_pCurrBlock && (pAlloc != s_pCurrBlock) );
|
||||
|
||||
pAlloc = s_pCurrBlock;
|
||||
do
|
||||
{
|
||||
NewTopBlock:
|
||||
|
||||
if( s_pCurrBlock->used & HB_GC_DELETE )
|
||||
{
|
||||
pDelete = s_pCurrBlock;
|
||||
hb_gcUnlink( &s_pCurrBlock, s_pCurrBlock );
|
||||
|
||||
/*
|
||||
Releasing the top block in the list, so we must mark the new top into pAlloc
|
||||
but we still need to process this new top. Without this goto, the while
|
||||
condition will immediatly fail. Using extra flags, and new conditions
|
||||
will adversly effect performance.
|
||||
*/
|
||||
if( pDelete == pAlloc )
|
||||
{
|
||||
pAlloc = s_pCurrBlock;
|
||||
}
|
||||
pAlloc = s_pCurrBlock;
|
||||
HB_GARBAGE_FREE( pDelete );
|
||||
|
||||
HB_GARBAGE_FREE( pDelete );
|
||||
if( s_pCurrBlock )
|
||||
{
|
||||
goto NewTopBlock;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
HB_GARBAGE_FREE( pDelete );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
s_pCurrBlock = s_pCurrBlock->pNext;
|
||||
}
|
||||
} while ( s_pCurrBlock && (pAlloc != s_pCurrBlock) );
|
||||
|
||||
} while ( s_pCurrBlock && ( pAlloc != s_pCurrBlock ) );
|
||||
|
||||
s_bCollecting = FALSE;
|
||||
|
||||
s_pCurrBlock = pAlloc;
|
||||
|
||||
/* Step 4 - flip flag */
|
||||
/* Reverse used/unused flag so we don't have to mark all blocks
|
||||
* during next collecting
|
||||
@@ -406,6 +427,41 @@ void hb_gcCollectAll( void )
|
||||
}
|
||||
}
|
||||
|
||||
void hb_gcReleaseAll( void )
|
||||
{
|
||||
if( s_pCurrBlock )
|
||||
{
|
||||
HB_GARBAGE_PTR pAlloc, pDelete;
|
||||
|
||||
s_bCollecting = TRUE;
|
||||
|
||||
pAlloc = s_pCurrBlock;
|
||||
do
|
||||
{
|
||||
/* call a cleanup function */
|
||||
if( s_pCurrBlock->pFunc )
|
||||
{
|
||||
HB_TRACE( HB_TR_INFO, ( "Cleanup, %p", s_pCurrBlock ) );
|
||||
( s_pCurrBlock->pFunc )( ( void *)( s_pCurrBlock + 1 ) );
|
||||
}
|
||||
|
||||
s_pCurrBlock = s_pCurrBlock->pNext;
|
||||
|
||||
} while ( s_pCurrBlock && pAlloc != s_pCurrBlock );
|
||||
|
||||
do
|
||||
{
|
||||
HB_TRACE( HB_TR_INFO, ( "Release %p", s_pCurrBlock ) );
|
||||
pDelete = s_pCurrBlock;
|
||||
hb_gcUnlink( &s_pCurrBlock, s_pCurrBlock );
|
||||
HB_GARBAGE_FREE( pDelete );
|
||||
|
||||
} while ( s_pCurrBlock );
|
||||
}
|
||||
|
||||
s_bCollecting = FALSE;
|
||||
}
|
||||
|
||||
/* service a single garbage collector step
|
||||
* Check a single memory block if it can be released
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user