hxchkpt2.h
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:13k
源码类别:

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: hxchkpt2.h,v 1.4.32.3 2004/07/09 01:46:15 hubbe Exp $
  3.  * 
  4.  * Portions Copyright (c) 1995-2004 RealNetworks, Inc. All Rights Reserved.
  5.  * 
  6.  * The contents of this file, and the files included with this file,
  7.  * are subject to the current version of the RealNetworks Public
  8.  * Source License (the "RPSL") available at
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed
  10.  * the file under the current version of the RealNetworks Community
  11.  * Source License (the "RCSL") available at
  12.  * http://www.helixcommunity.org/content/rcsl, in which case the RCSL
  13.  * will apply. You may also obtain the license terms directly from
  14.  * RealNetworks.  You may not use this file except in compliance with
  15.  * the RPSL or, if you have a valid RCSL with RealNetworks applicable
  16.  * to this file, the RCSL.  Please see the applicable RPSL or RCSL for
  17.  * the rights, obligations and limitations governing use of the
  18.  * contents of the file.
  19.  * 
  20.  * Alternatively, the contents of this file may be used under the
  21.  * terms of the GNU General Public License Version 2 or later (the
  22.  * "GPL") in which case the provisions of the GPL are applicable
  23.  * instead of those above. If you wish to allow use of your version of
  24.  * this file only under the terms of the GPL, and not to allow others
  25.  * to use your version of this file under the terms of either the RPSL
  26.  * or RCSL, indicate your decision by deleting the provisions above
  27.  * and replace them with the notice and other provisions required by
  28.  * the GPL. If you do not delete the provisions above, a recipient may
  29.  * use your version of this file under the terms of any one of the
  30.  * RPSL, the RCSL or the GPL.
  31.  * 
  32.  * This file is part of the Helix DNA Technology. RealNetworks is the
  33.  * developer of the Original Code and owns the copyrights in the
  34.  * portions it created.
  35.  * 
  36.  * This file, and the files included with this file, is distributed
  37.  * and made available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY
  38.  * KIND, EITHER EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS
  39.  * ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES
  40.  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET
  41.  * ENJOYMENT OR NON-INFRINGEMENT.
  42.  * 
  43.  * Technology Compatibility Kit Test Suite(s) Location:
  44.  *    http://www.helixcommunity.org/content/tck
  45.  * 
  46.  * Contributor(s):
  47.  * 
  48.  * ***** END LICENSE BLOCK ***** */
  49. /*
  50.     @description This is another cut at the RN checkpoint macros. It is designed to plugin seamlessly, 
  51.     it defines the same macros as the main hxchkpt.h header.
  52.       Removes checkpoint lists - all checkpoints now stored in the checkpoint manager
  53.       Does not support accumulators
  54.       Designed to produce output that is then post processed
  55. */
  56. #ifndef _HXCHKPT2_H_
  57. #define _HXCHKPT2_H_
  58. #ifndef _RNPERFORMANCE_H_
  59. #error This file must not be included on its own. You should include hxperf.h
  60. #endif
  61. #ifdef ENABLE_CHECKPOINTS2
  62. #include "hlxclib/stdio.h"
  63. #include "hxtick.h"
  64. #ifdef SECTIONS_ONLY
  65. // If we're just logging sections we don't need to allocate so much space for checkpoints
  66. #define MAX_CHECKPOINTS_PER_MODULE 100
  67. #define MAX_COMMENT_CHARACTERS 100
  68. #else
  69. #define MAX_CHECKPOINTS_PER_MODULE 600000
  70. #define MAX_COMMENT_CHARACTERS 100000
  71. #endif
  72. struct CHXCheckpoint2
  73. {
  74.     enum CheckpointType { ENTER_BLOCK, EXIT_BLOCK, CHECKPOINT };
  75.     
  76.     const char* m_pFunctionName;
  77.     const char* m_pComment;
  78.     const char* m_pFileName;
  79.     UINT32 m_ulLineNumber;
  80.     double m_dTime;
  81.     CheckpointType m_type;
  82. };
  83. class CHXCheckpointManager2
  84. {
  85. public:
  86.     CHXCheckpointManager2( const char* pModuleName, const char* pOutputFileName )
  87.     : m_pModuleName( pModuleName ),
  88.       m_pOutputFileName( pOutputFileName ),
  89.       m_ulCheckpointIndex( 0 ),
  90.       m_pComments( m_comments )
  91.     {
  92.     }
  93.     ~CHXCheckpointManager2()
  94.     {
  95. // Since writing to a file slows down startup time timing data is only dumped to the file when the global checkpoint
  96. // manager object associated with a dll or exe is destroyed meaning an unload or program termination occured.
  97. DumpCheckpoints();
  98.     }
  99.     void AddCheckpoint( const char* pFunctionName, const char* pComment, const char* pFileName, UINT32 ulLineNumber, double dTime, CHXCheckpoint2::CheckpointType type )
  100.     {
  101. if( m_ulCheckpointIndex < MAX_CHECKPOINTS_PER_MODULE )
  102. {
  103.     m_CheckpointArray[ m_ulCheckpointIndex ].m_pFunctionName = pFunctionName;
  104.     m_CheckpointArray[ m_ulCheckpointIndex ].m_pComment = pComment;
  105.     m_CheckpointArray[ m_ulCheckpointIndex ].m_pFileName = pFileName;
  106.     m_CheckpointArray[ m_ulCheckpointIndex ].m_ulLineNumber = ulLineNumber;
  107.     m_CheckpointArray[ m_ulCheckpointIndex ].m_dTime = dTime;
  108.     m_CheckpointArray[ m_ulCheckpointIndex ].m_type = type;
  109. }
  110. ++m_ulCheckpointIndex;
  111.     }
  112.     const char* AddCheckpointCopy( const char* pFunctionName, const char* pComment, const char* pFileName, UINT32 ulLineNumber, double dTime, CHXCheckpoint2::CheckpointType type )
  113.     {
  114.      const char* result = "Unknown";
  115.     
  116. if( m_ulCheckpointIndex < MAX_CHECKPOINTS_PER_MODULE )
  117. {
  118.     m_CheckpointArray[ m_ulCheckpointIndex ].m_pFunctionName = pFunctionName;
  119.     m_CheckpointArray[ m_ulCheckpointIndex ].m_pFileName = pFileName;
  120.     m_CheckpointArray[ m_ulCheckpointIndex ].m_ulLineNumber = ulLineNumber;
  121.     m_CheckpointArray[ m_ulCheckpointIndex ].m_dTime = dTime;
  122.     m_CheckpointArray[ m_ulCheckpointIndex ].m_type = type;
  123.     const int len = strlen( pComment );
  124.     if( m_pComments < m_comments + MAX_COMMENT_CHARACTERS && m_pComments + len + 1 < m_comments + MAX_COMMENT_CHARACTERS )
  125.     {
  126.      m_CheckpointArray[ m_ulCheckpointIndex ].m_pComment = m_pComments;
  127.      memcpy( m_pComments, pComment, len + 1 ); /* Flawfinder: ignore */
  128.     }
  129.     else
  130.     {
  131.      m_CheckpointArray[ m_ulCheckpointIndex ].m_pComment = "Unknown";
  132.     }
  133.     result = m_pComments;
  134.     m_pComments += len + 1;
  135. }
  136. ++m_ulCheckpointIndex;
  137. return result;
  138.     }
  139.     const char* CommentPrefix( CHXCheckpoint2::CheckpointType type )
  140.     {
  141.      switch( type )
  142.      {
  143.          case CHXCheckpoint2::ENTER_BLOCK:
  144.           return "Enter ";
  145.           break;
  146.          case CHXCheckpoint2::EXIT_BLOCK:
  147.           return "Exit ";
  148.           break;
  149.          case CHXCheckpoint2::CHECKPOINT:
  150.           return "";
  151.           break;
  152.      }
  153.      return "";
  154.     }
  155.     
  156.     void DumpCheckpoints()
  157.     {
  158. // We must append to the log files because the DLL might be loaded and unloaded several times.
  159. FILE* pFile = ::fopen( m_pOutputFileName, "a+" );
  160. if (pFile)
  161. {
  162.     if( m_ulCheckpointIndex > MAX_CHECKPOINTS_PER_MODULE )
  163.     {
  164. ::fprintf( pFile, "***ERROR*** tried to store %ld checkpoints, only room for %ldn", m_ulCheckpointIndex, MAX_CHECKPOINTS_PER_MODULE );
  165. ::fprintf( pFile, "nnn" );
  166.     }
  167.     if( m_pComments >= m_comments + MAX_COMMENT_CHARACTERS )
  168.          {
  169. ::fprintf( pFile, "***ERROR*** tried to copy %ld comment characters, only room for %ldn", m_pComments, MAX_COMMENT_CHARACTERS );
  170. ::fprintf( pFile, "nnn" );
  171.     }
  172.     
  173.     ::fprintf(pFile, "Format==> ElapsedTimeFromPreviousCheckpoint;ElapsedTimeFromStartOfFunction;ElapsedTimeSinceFirstModuleCheckpoint;OSTime;ModuleAndFileName;FunctionName;LineNumber;Commentn");
  174.     for(UINT32 j = 0; j < min( MAX_CHECKPOINTS_PER_MODULE, m_ulCheckpointIndex ); j++)
  175.     {
  176. ::fprintf(pFile, "%.6lf;%.6lf;%.6lf;%.6lf;%s\%s;%s;%lu;%s%sn",
  177.     (j ? (m_CheckpointArray[j].m_dTime - m_CheckpointArray[j-1].m_dTime) : 0),
  178.     m_CheckpointArray[j].m_dTime - m_CheckpointArray[0].m_dTime,
  179.     m_CheckpointArray[j].m_dTime,
  180.     m_CheckpointArray[j].m_dTime,
  181.     m_pModuleName,
  182.     m_CheckpointArray[j].m_pFileName,
  183.     m_CheckpointArray[j].m_pFunctionName,
  184.     m_CheckpointArray[j].m_ulLineNumber,
  185.     CommentPrefix( m_CheckpointArray[j].m_type ),
  186.     m_CheckpointArray[j].m_pComment );
  187.     }
  188.     ::fclose(pFile);
  189. }
  190.     }
  191. protected:
  192.     CHXCheckpoint2  m_CheckpointArray[ MAX_CHECKPOINTS_PER_MODULE ];
  193.     const char*     m_pModuleName;
  194.     const char*     m_pOutputFileName;
  195.     UINT32     m_ulCheckpointIndex;
  196.     // This is the array used to store comments that must be copied because they are not static strings that will stick around in the module
  197.     char     m_comments[ MAX_COMMENT_CHARACTERS ]; /* Flawfinder: ignore */
  198.     char*     m_pComments;
  199. };
  200. extern CHXCheckpointManager2 g_HXCheckpointManager2;
  201. static const char* g_HXFunctionName = "Unknown";
  202. //
  203. // HXGetDoubleTickCount()
  204. // return a double in milliseconds
  205. #if defined(_WIN32) 
  206. inline double HXGetDoubleTickCount()
  207. {
  208.     static double frequency = 0.0;
  209.     if( frequency == 0.0 )
  210.     {
  211. QueryPerformanceFrequency( &QueryPerformanceFrequencyResult );
  212. frequency = 4294967296.0;
  213. frequency *= QueryPerformanceFrequencyResult.HighPart;
  214. frequency += QueryPerformanceFrequencyResult.LowPart;
  215.     }
  216.     QueryPerformanceCounter( &QueryPerformanceCounterResult );
  217.     double result = 4294967296.0;
  218.     result *= QueryPerformanceCounterResult.HighPart;
  219.     result += QueryPerformanceCounterResult.LowPart;
  220.     result /= frequency;
  221.     result *= 1000.0;
  222.     return result;
  223. }
  224. #elif defined(_UNIX) && !defined(_VXWORKS)
  225. // GetTickCount in pnmisc/unix/getticcount.c chops off accuracy
  226. // this version doesn't
  227. // returns a double in millisecond with microsecond accuracy
  228. inline double HXGetDoubleTickCount()
  229. {
  230.     struct timeval tv;
  231.     gettimeofday (&tv, NULL);
  232.     return tv.tv_sec * 1000 + tv.tv_usec / 1000.0;
  233. }
  234. #endif
  235. #if defined(_WIN32) || ( defined(_UNIX) && !defined(_VXWORKS))
  236. #define HX_GET_BETTERTICKCOUNT2() HXGetDoubleTickCount()
  237. #else
  238. #define  HX_GET_BETTERTICKCOUNT2()     HX_GET_BETTERTICKCOUNT()
  239. #endif
  240. #define HX_ENABLE_CHECKPOINTS_FOR_MODULE( pModuleName, pOutputFileName )
  241.     CHXCheckpointManager2 g_HXCheckpointManager2(pModuleName, pOutputFileName);
  242. #define HX_SETUP_CHECKPOINTLIST( pFunctionName )
  243. // We don't support accumulators
  244. #define HX_PRIME_ACCUMULATOR(id, pComment)
  245. #define HX_UPDATE_ACCUMULATOR(id)
  246. #define HX_ACCUMULATE(id, pComment, data)
  247. #define HX_LOG_CHECKPOINT_INTEHXAL(pComment, type )
  248.     g_HXCheckpointManager2.AddCheckpoint( g_HXFunctionName, pComment, __FILE__, __LINE__, HX_GET_BETTERTICKCOUNT2(), type );
  249. #define HX_LOG_CHECKPOINT_INTEHXAL_COPY(pComment, type)
  250.     g_HXCheckpointManager2.AddCheckpointCopy( g_HXFunctionName, pComment, __FILE__, __LINE__, HX_GET_BETTERTICKCOUNT2(), type );
  251. #define HX_LOG_SINGLESHOT_CHECKPOINT_INTEHXAL( pFunctionName, pComment)
  252.     {       
  253. static BOOL doneCheckPoint = FALSE;       
  254. if( !doneCheckPoint )       
  255. {       
  256.     HX_LOG_CHECKPOINT_INTEHXAL( pComment, CHXCheckpoint2::CHECKPOINT )
  257.     doneCheckPoint = TRUE;       
  258. }       
  259.     }
  260. #ifdef SECTIONS_ONLY
  261. // We are only interesting in logging the start and end of sections. All other macros 
  262. // compile out completely. This is done to provide a bare minimum profiling that will 
  263. // be almost completely unaffected by the presence of the profiling code.
  264. #define HX_LOG_CHECKPOINT(pComment)
  265. #define HX_LOG_CHECKPOINT_COPY(pComment)
  266. #define HX_LOG_INITIAL_CHECKPOINT(pFunctionName)
  267. #define HX_LOG_SINGLESHOT_CHECKPOINT( pFunctionName, pComment)
  268. #define HX_LOG_BLOCK( pBlockName )
  269. #define HX_LOG_BLOCK_COPY( pBlockName )
  270. #define HX_LOG_START_SECTION( pSectionName )
  271.     HX_LOG_SINGLESHOT_CHECKPOINT_INTEHXAL( "", "--- Start section " pSectionName );
  272. #define HX_LOG_END_SECTION( pSectionName )
  273.     HX_LOG_SINGLESHOT_CHECKPOINT_INTEHXAL( "", "--- End section " pSectionName );
  274. #else
  275. #define HX_LOG_CHECKPOINT(pComment)   HX_LOG_CHECKPOINT_INTEHXAL( pComment, CHXCheckpoint2::CHECKPOINT )
  276. #define HX_LOG_CHECKPOINT_COPY(pComment)   HX_LOG_CHECKPOINT_INTEHXAL_COPY( pComment, CHXCheckpoint2::CHECKPOINT )
  277. #define HX_LOG_INITIAL_CHECKPOINT(pFunctionName)
  278.     HX_SETUP_CHECKPOINTLIST( pFunctionName )
  279.     HX_LOG_CHECKPOINT( "Initial Function Checkpoint" )
  280. #define HX_LOG_SINGLESHOT_CHECKPOINT( pFunctionName, pComment ) HX_LOG_SINGLESHOT_CHECKPOINT_INTEHXAL( pFunctionName, pComment )
  281. #define HX_LOG_BLOCK( pBlockName )
  282.     class CHXBlockLogger2
  283.     {
  284.     public:
  285. CHXBlockLogger2()
  286. {
  287.     HX_LOG_CHECKPOINT_INTEHXAL( pBlockName, CHXCheckpoint2::ENTER_BLOCK );
  288. }
  289. ~CHXBlockLogger2()
  290. {
  291.     HX_LOG_CHECKPOINT_INTEHXAL( pBlockName, CHXCheckpoint2::EXIT_BLOCK );
  292. }
  293.     };
  294.     CHXBlockLogger2 blockLogger1278
  295. #define HX_LOG_BLOCK_COPY( pBlockName )
  296.     class CHXBlockLogger3
  297.     {
  298.     public:
  299. CHXBlockLogger3( const char* pBName  )
  300. {
  301.     pBlockName_ = HX_LOG_CHECKPOINT_INTEHXAL_COPY( pBName, CHXCheckpoint2::ENTER_BLOCK );
  302. }
  303. ~CHXBlockLogger3()
  304. {
  305.     HX_LOG_CHECKPOINT_INTEHXAL_COPY( pBlockName_, CHXCheckpoint2::EXIT_BLOCK );
  306. }
  307.     private:
  308.      const char* pBlockName_;
  309.     };
  310.     CHXBlockLogger3 blockLogger12783( pBlockName )
  311. #define HX_LOG_START_SECTION( pSectionName )
  312.     HX_LOG_SINGLESHOT_CHECKPOINT( "", "--- Start section " pSectionName );
  313. #define HX_LOG_END_SECTION( pSectionName )
  314.     HX_LOG_SINGLESHOT_CHECKPOINT( "", "--- End section " pSectionName );
  315. #endif
  316. #endif
  317. #endif // _GEMCHKPT_H_