Page 1 of 1

Quien sabe como generar informe del estado de la memoria...

PostPosted: Fri Jul 17, 2015 8:29 am
by xmanuel
Pues eso, qué es lo que hay que hacer para que cuando no se libera memoria reservada previamente, el programa EXE genere un fichero "hb_out.log" con el informe del estado de la memoria
:shock: :lol:

Gracias compañeros!!!

Re: Quien sabe como generar informe del estado de la memoria...

PostPosted: Fri Jul 17, 2015 9:09 am
by Antonio Linares
Manuel,

Y como estas reservando esa memoria previamente ?

hb_xgrab() ?

Re: Quien sabe como generar informe del estado de la memoria...

PostPosted: Fri Jul 17, 2015 10:37 am
by xmanuel
Si con hb_xgrab() :D

Re: Quien sabe como generar informe del estado de la memoria...

PostPosted: Fri Jul 17, 2015 12:11 pm
by Antonio Linares
En principio todo lo que tienes que hacer es llamar a hb_xfree( ... ) cuando ya no necesites esa memoria.

Se puede construir un Harbour con control de memoria usando unos determinados flags,
pero es más lento que sin ellos.

Re: Quien sabe como generar informe del estado de la memoria...

PostPosted: Fri Jul 17, 2015 6:44 pm
by xmanuel
Jajaja ya eso lo sé Antonio...
El tema es controlar que no me he saltado ningún hb_xfree( ... ) sin querer o ningún itemRelease( ... )

Y esto es en fase de desarrollo así que me da igual que vaya lento...

Estoy desarrollando un LIB para acceso a bases de datos con clases hechas en C completamente.
La verdad es que me va quedando muy bien. Con el preprocesador de C he conseguido facilitar el desarrollo...
Mira este ejemplo:
Code: Select all  Expand view


CREATE_CLASS( "THASHCURSOR", THASHCURSOR, THASHCURSOR_IVARCOUNT )

    /* Metodos */
    METHOD( "NEW",          THASHCURSOR_NEW )
    METHOD( "GETCURSOR",    THASHCURSOR_GETCURSOR )
    METHOD( "SETCURSOR",    THASHCURSOR_SETCURSOR )
    METHOD( "RECNO",        THASHCURSOR_RECNO )
    METHOD( "RECCOUNT",     THASHCURSOR_RECCOUNT )
    METHOD( "GOTO",         THASHCURSOR_GOTO )
    METHOD( "GOTOP",        THASHCURSOR_GOTOP )
    METHOD( "GOBOTTOM",     THASHCURSOR_GOBOTTOM )
    METHOD( "SKIP",         THASHCURSOR_SKIP )
    METHOD( "SKIPPER",      THASHCURSOR_SKIPPER )
    METHOD( "NEXT",         THASHCURSOR_NEXT )
    METHOD( "PRIOR",        THASHCURSOR_PRIOR )
    METHOD( "EOF",          THASHCURSOR_EOF )
    METHOD( "BOF",          THASHCURSOR_BOF )
    METHOD( "FIELDCOUNT",   THASHCURSOR_FIELDCOUNT )
    METHOD( "FIELDGET",     THASHCURSOR_FIELDGET )
    METHOD( "GETBYNAME",    THASHCURSOR_GETBYNAME )
    METHOD( "FIELDNAME",    THASHCURSOR_FIELDNAME )
    METHOD( "FIELDLEN",     THASHCURSOR_FIELDLEN )
    METHOD( "FIELDTYPE",    THASHCURSOR_FIELDTYPE )
    METHOD( "SCAN",         THASHCURSOR_SCAN )
    METHOD( "ASARRAY",      THASHCURSOR_ASARRAY )
    METHOD( "CLOSE",        THASHCURSOR_CLOSE )

END_CLASS

/***
 * Metodo: NEW
 * Uso: Constructor de la clase
 * Parametros: Ninguno
 * Devuelve: Self, un objeto inicializado
 */


HB_METHOD( THASHCURSOR_NEW )
{
    PHB_ITEM pSelf = hb_pSelf();
    HASHCURSORP hc = hb_xgrab( sizeof( HASHCURSOR ) );

    if( hc )
    {
        PHB_ITEM paValue = hb_param( 1, HB_IT_ARRAY );

        hc->paValue = hb_itemNew( NULL );

        if( paValue )
        {
            hb_itemCopy( hc->paValue, paValue );
        }
        else
        {
            hb_arrayNew( hc->paValue, 0 );
        }

        if( hb_arrayLen( hc->paValue ) > 0 )
        {
            setRecNo( hc, 1 );
            setEOF( hc, HB_FALSE );
        }
        else
        {
            setRecNo( hc, 0 );
            setEOF( hc, HB_TRUE );
        }

        setBOF( hc, HB_TRUE );
        setFound( hc, HB_FALSE );

        hb_arraySetPtr( pSelf, IVAR_HASHCURSOR, hc );
    }

    /* Devuelve SELF */

    hb_itemReturnRelease( pSelf );
}
 

Re: Quien sabe como generar informe del estado de la memoria...

PostPosted: Sat Jul 18, 2015 10:06 am
by Antonio Linares
Manuel,

Si revisas en los fuentes de Harbour el módulo fm.c:

https://github.com/harbour/core/blob/master/src/vm/fm.c

Verás que cuando se ha construido con el define HB_FM_STATISTICS se usa una lista enlazada de bloques de memoria que contienen la información que buscas:

En hb_xalloc():
Code: Select all  Expand view
if( ! s_pFirstBlock )
      {
         pMem->pPrevBlock = NULL;
         s_pFirstBlock = pMem;
      }
      else
      {
         pMem->pPrevBlock = s_pLastBlock;
         s_pLastBlock->pNextBlock = pMem;
      }
      s_pLastBlock = pMem;
      pMem->pNextBlock = NULL;

      pMem->u32Signature = HB_MEMINFO_SIGNATURE;
      HB_FM_SETSIG( HB_MEM_PTR( pMem ), nSize );
      pMem->nSize = nSize;  /* size of the memory block */

      s_nMemoryConsumed += nSize + sizeof( HB_COUNTER );
      if( s_nMemoryMaxConsumed < s_nMemoryConsumed )
         s_nMemoryMaxConsumed = s_nMemoryConsumed;
      s_nMemoryBlocks++;
      if( s_nMemoryMaxBlocks < s_nMemoryBlocks )
         s_nMemoryMaxBlocks = s_nMemoryBlocks;

Re: Quien sabe como generar informe del estado de la memoria...

PostPosted: Sat Jul 18, 2015 10:08 am
by Antonio Linares
En s_nMemoryConsumed tendrias la memoria consumida y en s_nMemoryBlocks en número de bloques de memoria

Debe haber alguna función que recorre esos bloques.

Espero que con esta pista tu ya lo puedas solucionar :-)

Re: Quien sabe como generar informe del estado de la memoria...

PostPosted: Sat Jul 18, 2015 11:31 pm
by xmanuel
Muchas gracias Antonio...
He recompilado mi Harbour y ya me sale el dichoso informe.

Jejeje qué haríamos sin ti?!!!

PD: Ayer estube en el concierto de tu tocallo Marc Anthony ahí en Málaga, mi mujer es una fanática...

Si hubiera ido con tiempo te aviso para ir a verte.

Muchas gracias por tu ayuda :D