2001-06-15 02:29:44 -05:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2005-09-07 22:51:55 -05:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2001-06-15 02:29:44 -05:00
|
|
|
*
|
2005-09-07 22:51:55 -05:00
|
|
|
* $RCSfile: memorymeasure.hxx,v $
|
2001-06-15 02:29:44 -05:00
|
|
|
*
|
2005-09-07 22:51:55 -05:00
|
|
|
* $Revision: 1.3 $
|
2001-06-15 02:29:44 -05:00
|
|
|
*
|
2005-09-07 22:51:55 -05:00
|
|
|
* last change: $Author: rt $ $Date: 2005-09-08 04:51:55 $
|
2001-06-15 02:29:44 -05:00
|
|
|
*
|
2005-09-07 22:51:55 -05:00
|
|
|
* The Contents of this file are made available subject to
|
|
|
|
* the terms of GNU Lesser General Public License Version 2.1.
|
2001-06-15 02:29:44 -05:00
|
|
|
*
|
|
|
|
*
|
2005-09-07 22:51:55 -05:00
|
|
|
* GNU Lesser General Public License Version 2.1
|
|
|
|
* =============================================
|
|
|
|
* Copyright 2005 by Sun Microsystems, Inc.
|
|
|
|
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
2001-06-15 02:29:44 -05:00
|
|
|
*
|
2005-09-07 22:51:55 -05:00
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License version 2.1, as published by the Free Software Foundation.
|
2001-06-15 02:29:44 -05:00
|
|
|
*
|
2005-09-07 22:51:55 -05:00
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
2001-06-15 02:29:44 -05:00
|
|
|
*
|
2005-09-07 22:51:55 -05:00
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
|
|
* MA 02111-1307 USA
|
2001-06-15 02:29:44 -05:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
#ifndef __FRAMEWORK_MACROS_DEBUG_MEMORYMEASURE_HXX_
|
|
|
|
#define __FRAMEWORK_MACROS_DEBUG_MEMORYMEASURE_HXX_
|
|
|
|
|
|
|
|
// *************************************************************************************************************
|
|
|
|
// special macros for time measures
|
|
|
|
// 1) LOGFILE_MEMORYMEASURE used it to define log file for this operations (default will be set automaticly)
|
|
|
|
// 2) MAKE_MEMORY_SNAPSHOT make snapshot of currently set memory informations of OS
|
|
|
|
// 3) LOG_MEMORYMEASURE write measured time to logfile
|
|
|
|
// *************************************************************************************************************
|
|
|
|
|
|
|
|
#ifdef ENABLE_MEMORYMEASURE
|
|
|
|
|
|
|
|
#if !defined( WIN ) && !defined( WNT )
|
|
|
|
#error "Macros to measure memory access not available under platforms different from windows!"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
//_________________________________________________________________________________________________________________
|
|
|
|
// includes
|
|
|
|
//_________________________________________________________________________________________________________________
|
|
|
|
|
|
|
|
#ifndef _RTL_STRBUF_HXX_
|
|
|
|
#include <rtl/strbuf.hxx>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef __SGI_STL_VECTOR
|
|
|
|
#include <vector>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*_____________________________________________________________________________________________________________
|
|
|
|
LOGFILE_MEMORYMEASURE
|
|
|
|
|
|
|
|
For follow macros we need a special log file. If user forget to specify anyone, we must do it for him!
|
|
|
|
_____________________________________________________________________________________________________________*/
|
|
|
|
|
|
|
|
#ifndef LOGFILE_MEMORYMEASURE
|
|
|
|
#define LOGFILE_MEMORYMEASURE "memorymeasure.log"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*_____________________________________________________________________________________________________________
|
|
|
|
class MemoryMeasure
|
|
|
|
|
|
|
|
We use this baseclass to collect all snapshots in one object and analyze this information at one point.
|
|
|
|
Macros of this file are used to enable using of this class by special compile-parameter only!
|
|
|
|
_____________________________________________________________________________________________________________*/
|
|
|
|
|
|
|
|
class _DBGMemoryMeasure
|
|
|
|
{
|
|
|
|
//---------------------------------------------------------------------------------------------------------
|
|
|
|
private:
|
|
|
|
struct _MemoryInfo
|
|
|
|
{
|
|
|
|
MEMORYSTATUS aStatus ;
|
|
|
|
::rtl::OString sComment ;
|
|
|
|
};
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------------------------------------
|
|
|
|
public:
|
|
|
|
//_____________________________________________________________________________________________________
|
|
|
|
inline _DBGMemoryMeasure()
|
|
|
|
{
|
2001-06-20 13:04:53 -05:00
|
|
|
makeSnapshot("Initializing Data");
|
|
|
|
}
|
|
|
|
//_____________________________________________________________________________________________________
|
|
|
|
inline _DBGMemoryMeasure(const ::rtl::OString& sComment)
|
|
|
|
{
|
|
|
|
makeSnapshot(sComment);
|
2001-06-15 02:29:44 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
//_____________________________________________________________________________________________________
|
|
|
|
// clear used container!
|
|
|
|
inline ~_DBGMemoryMeasure()
|
|
|
|
{
|
|
|
|
::std::vector< _MemoryInfo >().swap( m_lSnapshots );
|
|
|
|
}
|
|
|
|
|
|
|
|
//_____________________________________________________________________________________________________
|
|
|
|
inline void makeSnapshot( const ::rtl::OString& sComment )
|
|
|
|
{
|
|
|
|
_MemoryInfo aInfo;
|
|
|
|
aInfo.sComment = sComment;
|
|
|
|
GlobalMemoryStatus ( &(aInfo.aStatus) );
|
|
|
|
m_lSnapshots.push_back( aInfo );
|
|
|
|
}
|
|
|
|
|
|
|
|
//_____________________________________________________________________________________________________
|
|
|
|
inline ::rtl::OString getLog()
|
|
|
|
{
|
|
|
|
::rtl::OStringBuffer sBuffer( 10000 );
|
|
|
|
|
|
|
|
if( m_lSnapshots.size() > 0 )
|
|
|
|
{
|
|
|
|
// Write informations to return buffer
|
|
|
|
::std::vector< _MemoryInfo >::const_iterator pItem1;
|
|
|
|
::std::vector< _MemoryInfo >::const_iterator pItem2;
|
|
|
|
|
|
|
|
pItem1 = m_lSnapshots.begin();
|
|
|
|
pItem2 = pItem1;
|
|
|
|
++pItem2;
|
|
|
|
|
|
|
|
while( pItem1!=m_lSnapshots.end() )
|
|
|
|
{
|
|
|
|
sBuffer.append( "snap [ " );
|
|
|
|
sBuffer.append( pItem1->sComment );
|
|
|
|
sBuffer.append( " ]\n\tavail phys\t=\t" );
|
|
|
|
sBuffer.append( (sal_Int32)pItem1->aStatus.dwAvailPhys );
|
|
|
|
sBuffer.append( "\n\tavail page\t=\t" );
|
|
|
|
sBuffer.append( (sal_Int32)pItem1->aStatus.dwAvailPageFile );
|
|
|
|
sBuffer.append( "\n\tavail virt\t=\t" );
|
|
|
|
sBuffer.append( (sal_Int32)pItem1->aStatus.dwAvailVirtual );
|
|
|
|
|
|
|
|
if( pItem1 == m_lSnapshots.begin() )
|
|
|
|
{
|
2001-06-20 13:04:53 -05:00
|
|
|
sBuffer.append( "\n\t[initial values]\n\n" );
|
2001-06-15 02:29:44 -05:00
|
|
|
}
|
|
|
|
else if( pItem2 != m_lSnapshots.end() )
|
|
|
|
{
|
2001-06-20 13:04:53 -05:00
|
|
|
sBuffer.append( "\n\tdifference\t=\t[ " );
|
2001-06-15 02:29:44 -05:00
|
|
|
sBuffer.append( (sal_Int32)(pItem2->aStatus.dwAvailPhys - pItem1->aStatus.dwAvailPhys ) );
|
|
|
|
sBuffer.append( ", " );
|
|
|
|
sBuffer.append( (sal_Int32)(pItem2->aStatus.dwAvailPageFile - pItem1->aStatus.dwAvailPageFile ) );
|
|
|
|
sBuffer.append( ", " );
|
|
|
|
sBuffer.append( (sal_Int32)(pItem2->aStatus.dwAvailVirtual - pItem1->aStatus.dwAvailVirtual ) );
|
|
|
|
sBuffer.append( " ]\n\n" );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2001-06-20 13:04:53 -05:00
|
|
|
sBuffer.append( "\n\t[final values]\n\n" );
|
2001-06-15 02:29:44 -05:00
|
|
|
}
|
|
|
|
if( pItem1!=m_lSnapshots.end() ) ++pItem1;
|
|
|
|
if( pItem2!=m_lSnapshots.end() ) ++pItem2;
|
|
|
|
}
|
|
|
|
// clear current list ... make it empty for further snapshots!
|
|
|
|
::std::vector< _MemoryInfo >().swap( m_lSnapshots );
|
|
|
|
}
|
|
|
|
|
|
|
|
return sBuffer.makeStringAndClear();
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------------------------------------------------------------------------------------------------
|
|
|
|
private:
|
|
|
|
::std::vector< _MemoryInfo > m_lSnapshots;
|
|
|
|
};
|
|
|
|
|
|
|
|
/*_____________________________________________________________________________________________________________
|
|
|
|
START_MEMORY_MEASURE
|
|
|
|
|
|
|
|
Create new object to measure memory access.
|
|
|
|
_____________________________________________________________________________________________________________*/
|
|
|
|
|
|
|
|
#define START_MEMORYMEASURE( AOBJECT ) \
|
|
|
|
_DBGMemoryMeasure AOBJECT;
|
|
|
|
|
2001-06-20 13:04:53 -05:00
|
|
|
#define START_MEMORYMEASURE_FOR( AOBJECT, SCOMMENT ) \
|
|
|
|
_DBGMemoryMeasure AOBJECT( SCOMMENT );
|
|
|
|
|
2001-06-15 02:29:44 -05:00
|
|
|
/*_____________________________________________________________________________________________________________
|
|
|
|
MAKE_MEMORY_SNAPSHOT
|
|
|
|
|
|
|
|
Make snapshot of currently set memory informations of OS.
|
|
|
|
see _DBGMemoryMeasure for further informations
|
|
|
|
_____________________________________________________________________________________________________________*/
|
|
|
|
|
|
|
|
#define MAKE_MEMORY_SNAPSHOT( AOBJECT, SCOMMENT ) \
|
|
|
|
AOBJECT.makeSnapshot( SCOMMENT );
|
|
|
|
|
|
|
|
/*_____________________________________________________________________________________________________________
|
|
|
|
LOG_MEMORYMEASURE( SOPERATION, SCOMMENT, AOBJECT )
|
|
|
|
|
|
|
|
Write measured values to logfile.
|
|
|
|
_____________________________________________________________________________________________________________*/
|
|
|
|
|
|
|
|
#define LOG_MEMORYMEASURE( SOPERATION, SCOMMENT, AOBJECT ) \
|
|
|
|
{ \
|
|
|
|
::rtl::OStringBuffer _sBuffer( 256 ); \
|
|
|
|
_sBuffer.append( SOPERATION ); \
|
|
|
|
_sBuffer.append( "\n" ); \
|
|
|
|
_sBuffer.append( SCOMMENT ); \
|
|
|
|
_sBuffer.append( "\n\n" ); \
|
|
|
|
_sBuffer.append( AOBJECT.getLog() ); \
|
|
|
|
WRITE_LOGFILE( LOGFILE_MEMORYMEASURE, _sBuffer.makeStringAndClear() ) \
|
|
|
|
}
|
|
|
|
|
|
|
|
#else // #ifdef ENABLE_MEMORYMEASURE
|
|
|
|
|
|
|
|
/*_____________________________________________________________________________________________________________
|
|
|
|
If right testmode is'nt set - implements these macros empty!
|
|
|
|
_____________________________________________________________________________________________________________*/
|
|
|
|
|
|
|
|
#undef LOGFILE_MEMORYMEASURE
|
|
|
|
#define START_MEMORYMEASURE( AOBJECT )
|
|
|
|
#define MAKE_MEMORY_SNAPSHOT( AOBJECT, SCOMMENT )
|
|
|
|
#define LOG_MEMORYMEASURE( SOPERATION, SCOMMENT, AOBJECT )
|
|
|
|
|
|
|
|
#endif // #ifdef ENABLE_MEMORYMEASURE
|
|
|
|
|
|
|
|
//*****************************************************************************************************************
|
|
|
|
// end of file
|
|
|
|
//*****************************************************************************************************************
|
|
|
|
|
|
|
|
#endif // #ifndef __FRAMEWORK_MACROS_DEBUG_MEMORYMEASURE_HXX_
|