Home | History | Annotate | Download | only in hdr
      1 #ifndef __DMPROFILE_H__
      2 #define __DMPROFILE_H__
      3 
      4 #ifndef __cplusplus
      5 #error "This is a C++ header file; it requires C++ to compile."
      6 #endif
      7 
      8 #ifdef DM_PERFORMANCE_ENABLED
      9 
     10 #include "trace_perf.h"
     11 
     12 #endif
     13 
     14 enum {
     15     DM_INITIALIZE_ENTER = 18000000,
     16     DM_INITIALIZE_EXIT = 18000001,
     17     DM_GET_TREE_ENTER = 18000002,
     18     DM_GET_TREE_EXIT = 18000003,
     19     DM_GET_NODE_ENTER = 18000004,
     20     DM_GET_NODE_EXIT = 18000005,
     21     DM_UNINITIALIZE_ENTER = 18000006,
     22     DM_UNINITIALIZE_EXIT = 18000007,
     23     DM_INITIALIZE_MOUNT = 18000008,
     24     DM_INITIALIZE_MDF = 18000009,
     25     DM_INITIALIZE_PLUGIN = 18000010,
     26     DM_INITIALIZE_ACRHIVER = 18000011,
     27     DM_INITIALIZE_FILE = 18000012,
     28     DM_INITIALIZE_LOCK = 18000013,
     29     DM_INITIALIZE_ACL = 18000014,
     30     DM_INITIALIZE_EVENT = 18000015,
     31     DM_INITIALIZE_LOAD = 18000016,
     32 
     33 };
     34 
     35 
     36 #ifdef DM_PERFORMANCE_ENABLED
     37 #define DM_PERFORMANCE(event)   TRACE_PERF(event)
     38 #else
     39 #define DM_PERFORMANCE(event)
     40 #endif
     41 
     42 
     43 #ifdef DM_PROFILER_ENABLED
     44 #include <sys/time.h>
     45 #include <stdio.h>
     46 #include <string.h>
     47 
     48 #ifdef DEBUG
     49 extern int s_nBlocks , s_nSize, s_nCnt;
     50 #endif
     51 
     52 // static storage for performance statistic
     53 #define PROF_CELL_NUM   20000
     54 struct CDMProfCell {
     55   const char* _s;
     56   long long  _elapsed, _from;
     57 };
     58 
     59 extern CDMProfCell  g_aProfStorage[PROF_CELL_NUM];
     60 extern int g_nProfCurCell;
     61 
     62 struct CDMProfile {
     63 
     64   CDMProfile( const char* s) {
     65     _s = s;
     66     gettimeofday( &_tv1, NULL );
     67 #ifdef DEBUG
     68     _nasBlocks = s_nBlocks;
     69     _nWasSize = s_nSize;
     70     _nWasTotal = s_nCnt;
     71 #endif
     72   }
     73   ~CDMProfile() {
     74     struct timeval  tv2;
     75     gettimeofday( &tv2, NULL );
     76     long long n1 = _tv1.tv_usec + (_tv1.tv_sec * 1000000 );
     77     long long n2 = tv2.tv_usec + (tv2.tv_sec * 1000000 );
     78     long long elapsed = n2 - n1;
     79     //printf( "DMProfile: %s, time is %lld usec, from %lld to %lld\n", _s, elapsed, n1, n2 );
     80     int nCurCell = g_nProfCurCell++ % PROF_CELL_NUM;
     81     g_aProfStorage[nCurCell]._s = strdup( _s );
     82     g_aProfStorage[nCurCell]._elapsed = elapsed;
     83     g_aProfStorage[nCurCell]._from = n1;
     84 
     85 #ifdef DEBUG
     86 #ifdef DM_DM_MEMORY_USAGE_ENABLED
     87     printf( "DMProfile: %s, time is %lld usec, from %lld to %lld\n", _s, elapsed, n1, n2 );
     88 
     89     printf( "Total Blocks %d (delta is %d), size %d (delta is %d), total allocated (including deallocated) %d, (d %d)\n\n",
     90       s_nBlocks,  s_nBlocks - _nasBlocks,
     91       s_nSize, s_nSize - _nWasSize,
     92       s_nCnt, s_nCnt - _nWasTotal );
     93 #endif
     94 #endif
     95   }
     96 
     97   struct timeval  _tv1;
     98   const char* _s;
     99 #ifdef DEBUG
    100   int _nasBlocks, _nWasSize, _nWasTotal;
    101 #endif
    102 };
    103 
    104 #define DM_PROFILE_EXT(msg,num)  CDMProfile __oProf##num(msg );
    105 #define DM_PROFILE(msg)  CDMProfile __oProf(msg );
    106 
    107 #else
    108 #define DM_PROFILE(msg)
    109 #define DM_PROFILE_EXT(msg,num)
    110 #endif
    111 
    112 
    113 #ifdef DM_PROFILER_STACK
    114 
    115 #include <sys/time.h>
    116 #include <stdio.h>
    117 #include <string.h>
    118 #include "dmvector.h"
    119 
    120 // static storage for performance statistic
    121 #define PROF_STACK_NUM   20000
    122 struct DMProfileData {
    123   const char* _s;
    124   long long  _elapsed, _from;
    125 };
    126 
    127 extern DMProfileData  __aProfStackStorage[PROF_STACK_NUM];
    128 extern int g_nProfCurCell;
    129 
    130 struct CDMProfileCapture {
    131 
    132   CDMProfileCapture(DMStringVector itemNames, DMStringVector itemValues) {
    133     _itemNames = itemNames;
    134     _itemValues = itemValues;
    135     gettimeofday( &_tv1, NULL );
    136   }
    137 
    138   ~CDMProfileCapture() {
    139     struct timeval  tv2;
    140     gettimeofday( &tv2, NULL );
    141     long long n1 = _tv1.tv_usec + (_tv1.tv_sec * 1000000 );
    142     long long n2 = tv2.tv_usec + (tv2.tv_sec * 1000000 );
    143     long long elapsed = n2 - n1;
    144 
    145     DMString tmp = "";
    146     DMString tmpValue = "";
    147 
    148     for (int i = 0; i < _itemNames.size(); i++) {
    149       tmp += "    <";
    150       tmp += _itemNames[i];
    151       tmp += ">";
    152       tmpValue = _itemValues[i];
    153 
    154       tmpValue.replaceAll('<', '#');
    155       tmpValue.replaceAll('>', '#');
    156 
    157       tmp += tmpValue;
    158 
    159       const char* ch = _itemValues[i].c_str();
    160 
    161       int size = strlen(ch);
    162 
    163       if (ch[size - 1] == '\n') {
    164 	tmp += "    </";
    165       } else {
    166         tmp += "</";
    167       }
    168 
    169       tmp += _itemNames[i];
    170       tmp += ">\n";
    171     }
    172 
    173     int nCurCell = g_nProfCurCell++ % PROF_STACK_NUM;
    174     __aProfStackStorage[nCurCell]._s = strdup(tmp.c_str());
    175 
    176     __aProfStackStorage[nCurCell]._elapsed = elapsed;
    177     __aProfStackStorage[nCurCell]._from = n1;
    178   }
    179 
    180   struct timeval  _tv1;
    181   const char* _s;
    182   DMStringVector _itemNames;
    183   DMStringVector _itemValues;
    184 };
    185 
    186 #define DM_PROFILE_STACK(itemNames, itemValues)  CDMProfileCapture __oProfStack(itemNames, itemValues);
    187 
    188 #else
    189 #define DM_PROFILE_STACK(itemNames, itemValues)
    190 #endif
    191 
    192 
    193 #ifdef DM_FILE_OUTPUT
    194 void DMFileOutput( const char* szFormat, ... );
    195 #else
    196 #define DMFileOutput
    197 #endif
    198 
    199 #endif // __DMPROFILE_H__
    200 
    201