Miguel,
FWIW, if memory is released in hb_vmQuit() and assuming you build
with memory statitics (as it's clear you do), than there could be no
memory leak, because all hb_vmQuit() does is use normal GC!!!
IOW, the memory blocks must be held by RDD, and then probably
released in hb_rddShutDown(). So you probably need to review
dbCloseAll() compared to hb_rddShutDown() to find the difference.
Ron
On Jun 17, 2008, at 4:56 AM, Miguel Angel Marchuet wrote:
> With this example hou can see how we lost 2 blocks for each new alias
> and at the end of aplication vm_quit shows memory leaks.
>
> It's normal. But at wm_quit not always free this blocks.
>
> When I execute this example shows loosted blocks, that are released
> normally at wm_Quit. But in some cases :
>
> Total 2242174 allocations (36126 reallocation), of which 2241906
> freed.
> Highest total allocated 9951471 bytes in 93311 blocks.
> WARNING! Memory allocated but not released: 1943 bytes (268 blocks)
> source\vm\fm.c:971: HB_TR_ERROR Block 1 0240FDFC (size 10)
> CNUEVOALIAS(855), "RMCLCA001."
> source\vm\fm.c:971: HB_TR_ERROR Block 2 023430D4 (size 4)
> CNUEVOALIAS(855), "01000000"
> source\vm\fm.c:971: HB_TR_ERROR Block 3 021D46A4 (size 10)
> CNUEVOALIAS(855), "RMCLDE001."
> source\vm\fm.c:971: HB_TR_ERROR Block 4 023A9A5C (size 4)
> CNUEVOALIAS(855), "01000000"
> source\vm\fm.c:971: HB_TR_ERROR Block 5 019A155C (size 10)
> CNUEVOALIAS(855), "RMCLEX001."
> source\vm\fm.c:971: HB_TR_ERROR Block 6 023A93A4 (size 4)
> CNUEVOALIAS(855), "01000000"
> source\vm\fm.c:971: HB_TR_ERROR Block 7 019A09B4 (size 10)
> CNUEVOALIAS(855), "RMPRCA001."
> source\vm\fm.c:971: HB_TR_ERROR Block 8 02343684 (size 4)
> CNUEVOALIAS(855), "01000000"
> source\vm\fm.c:971: HB_TR_ERROR Block 9 0199C95C (size 10)
> CNUEVOALIAS(855), "RMPRDE001."
> source\vm\fm.c:971: HB_TR_ERROR Block 10 024037FC (size 4)
> CNUEVOALIAS(855), "01000000"
> source\vm\fm.c:971: HB_TR_ERROR Block 11 0210397C (size 10)
> CNUEVOALIAS(855), "RMPREX001."
> source\vm\fm.c:971: HB_TR_ERROR Block 12 023768AC (size 4)
> CNUEVOALIAS(855), "01000000"
> source\vm\fm.c:971: HB_TR_ERROR Block 13 02162904 (size 10)
> CNUEVOALIAS(855), "CLIENT001."
> source\vm\fm.c:971: HB_TR_ERROR Block 14 0237619C (size 4)
> CNUEVOALIAS(855), "01000000"
> source\vm\fm.c:971: HB_TR_ERROR Block 15 0232AFEC (size 10)
> CNUEVOALIAS(855), "PROVEE001."
> source\vm\fm.c:971: HB_TR_ERROR Block 16 019B3B0C (size 4)
> CNUEVOALIAS(855), "01000000"
> source\vm\fm.c:971: HB_TR_ERROR Block 17 01997074 (size 10)
> CNUEVOALIAS(855), "ARTICU001."
>
>
> //--------------------------------------------------------------------
> ---//
> // Sample
> //--------------------------------------------------------------------
> ---//
>
> #include "hbmemory.ch"
> PROCEDURE Main()
> LOCAL n
>
> REQUEST HB_GT_WIN
>
> DBCREATE( 'TEST', {{'TEST','C',1,0}} )
>
> ? 'Used blocks 1 -> ' + AllTrim( Str( Memory( HB_MEM_BLOCKS ) ) )
> FOR N := 1 TO 100
> DbUseArea( .T.,, 'TEST', cNuevoAlias( 'ACOUNT' ), .T., .T. )
> NEXT
> DbCloseAll()
> HB_GCALL()
> ? 'Used blocks 2 -> ' + AllTrim( Str( Memory( HB_MEM_BLOCKS ) ) )
>
> RETURN
>
>
> #define WIDTH_SUFIX_ALIAS 3
>
> // Alias dinamico unico basado en el nombre del DBF
> FUNCTION cNuevoAlias( cNomDbf )
>
> LOCAL cAlias
> LOCAL cPref := Left( cFileNoExt( cNomDbf ), 8 )
> LOCAL nArea := 0
>
> WHILE .T.
> cAlias := cPref + StrZero( ++nArea, WIDTH_SUFIX_ALIAS )
> IF Select( cAlias ) == 0
> EXIT
> ENDIF
> ENDDO
>
> RETURN cAlias
>
> function cFileNoExt( cPathMask ) // returns the filename without ext
>
> local cName := AllTrim( cFileNoPath( cPathMask ) )
> local n := At( ".", cName )
>
> return AllTrim( If( n > 0, Left( cName, n - 1 ), cName ) )
>
> function cFileNoPath( cPathMask ) // returns just the filename no
> path
>
> local n := RAt( "\", cPathMask )
>
> return Upper( If( n > 0 .and. n < Len( cPathMask ),;
> Right( cPathMask, Len( cPathMask ) - n ),;
> If( ( n := At( ":", cPathMask ) ) > 0,;
> Right( cPathMask, Len( cPathMask ) - n ),;
> cPathMask ) ) )
>
> ----------------------------------------------------------------------
> ---
> Check out the new SourceForge.net Marketplace.
> It's the best place to buy or sell services for
> just about anything Open Source.
> http://sourceforge.net/services/buy/index.php
> _______________________________________________
> xHarbour-developers mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/xharbour-developers
>
-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
xHarbour-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xharbour-developers