⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 warfunctionprofiler.h

📁 ftpserver very good sample
💻 H
字号:
/** */#ifndef WAR_FUNCTION_PROFILER_H#define WAR_FUNCTION_PROFILER_H/* SYSTEM INCLUDES */#if defined(HAVE_SYS_TIME_H) && !defined(WAR_SYS_TIME_H_INCLUDED)#   define WAR_SYS_TIME_H_INCLUDED#   include <sys/time.h>#endif/* PROJECT INCLUDES */#ifndef WAR_TYPES_H#   include "WarTypes.h"#endif#ifndef WAR_AUTO_LOCK_H#   include "WarAutoLock.h"#endif/* LOCAL INCLUDES *//* FORWARD REFERENCES */#ifdef __cplusplusextern "C" {#endif/****************** BEGIN OLD STYLE C spesific ********/#define WAR_PROFILE_FUNC(id) \    WarCodeTimer my_func_timer(id)/****************** END OLD STYLE C spesific **********/#ifdef __cplusplus }#endif/****************** BEGIN C++ spesific ****************/#ifdef __cplusplusenum WarProfilerItemE{    WAR_FP_DATA_PUMP,    WAR_FP_DATA_PUMP_FREAD_ASYNCH,    WAR_FP_DATA_PUMP_FREAD_SYNCH,    WAR_FP_DATA_PUMP_FREAD_CHKEOF,    WAR_FP_DATA_PUMP_SCK_OUT,    WAR_FP_DATA_PUMP_RECEIVING,    WAR_FP_WarSvrProtocolFtpDataConn_ProcessPendingBuffers,    WAR_FP_WarTransferSocket_OnTransferDone,    WAR_FP_WarTransferSocket_OnAccept,    WAR_FP_WarTransferSocket_OnConnect,    WAR_FP_WarTransferSocket_OnFileIo,    WAR_FP_WarTransferSocket_OnFileIo_SendWithCallback,    WAR_FP_WarTransferSocket_OnFileIo_ERROR,    WAR_FP_WarTransferSocket_OnFileIo_QUEUE,    WAR_FP_WarTransferSocket_OnFileIo_RECV,    WAR_FP_WarTransferSocket_OnReceived,    WAR_FP_WarTransferSocket_OnSent,    WAR_FP_WarFileDriverFileWin32_ReadWithCallback,    WAR_FP_WarFileDriverFileWin32_ReadWithCallback_ALLOC,    WAR_FP_WarFileDriverFileWin32_ReadWithCallback_PREP,    WAR_FP_WarFileDriverFileWin32_ReadWithCallback_READFILE,    WAR_FP_WarFileDriverFileWin32_ReadWithCallback_POSTPRC,    WAR_FP_WarFileDriverFileWin32_WriteWithCallback,    WAR_FP_WarFileDriverFileWin32_AllocResult_NEW,    WAR_FP_WarFileDriverFileWin32_AllocResult_ASSIGN,    WAR_FP_WarSocketIoWin32Nt_SendWithCallback,    WAR_FP_WarSocketIoWin32Nt_SendWithCallback_ALLOC,    WAR_FP_WarSocketIoWin32Nt_SendWithCallback_READFILE,    WAR_FP_WarSocketIoWin32Nt_SendWithCallback_POSTPRC,    WAR_FP_WarSocketIoWin32Nt_RecvWithCallback,    WAR_FP_WarSocketIoWin32Nt_AllocResult_NEW,    WAR_FP_WarSocketIoWin32Nt_AllocResult_ASSIGN,    WAR_FP_WarUserAuthDataWin32Nt_BeginImpersonate,    WAR_FP_WarUserAuthDataWin32Nt_EndImpersonate,    WAR_FP_WarTransferSocket_OnReceived_SIMPLE,    WAR_FP_WarTransferSocket_OnReceived_QUEUE,    WAR_FT_INVALID};class WarFunctionProfiler {public:    typedef struct profile_data_def    {        war_int64_t pd_total_time; // Time in milliseconds        war_int64_t pd_counter; // Counter    } data_t;        // LIFECYCLE        /**    * Default constructor.    */    WarFunctionProfiler();         /**    * Destructor.    */    ~WarFunctionProfiler();        // OPERATORS    // OPERATIONS    inline void Record(WarProfilerItemE indexId,        const war_int64_t& msElapsed)    {        WarAutoLock my_lock(mLock);        data_t *p = &mData[indexId];        p->pd_total_time += msElapsed;        p->pd_counter++;    }    // CALLBACK    // ACCESS    // INQUIRY    std::string Explain() const;    protected:    friend class WarCodeTimer;    static WarFunctionProfiler *mspProfiler;private:    data_t mData[WAR_FT_INVALID];    WarCriticalSection mLock;    war_int64_t mTimerResolution; // factor of 1 second};class WarCodeTimer{public:    inline WarCodeTimer(WarProfilerItemE itemIndex) :       mItemIndex(itemIndex)      {#ifdef WIN32        if (!QueryPerformanceCounter(            (LARGE_INTEGER *)&mStartTime))        {            mStartTime.QuadPart = 0;        }#else        struct timeval tv;        if (::gettimeofday(&tv, NULL) == 0)        {            mStartTime = tv.tv_sec * 1000000;            mStartTime += tv.tv_usec;        }        else            mStartTime = 0;#endif      }      inline ~WarCodeTimer()      {          if (WarFunctionProfiler::mspProfiler)          {#ifdef WIN32              LARGE_INTEGER elapsed = {0,0};              QueryPerformanceCounter(&elapsed);              elapsed.QuadPart -= mStartTime.QuadPart;                            WarFunctionProfiler::mspProfiler->Record(                  mItemIndex, elapsed.QuadPart);#else              war_int64_t elapsed = 0;              struct timeval tv;              if (::gettimeofday(&tv, NULL) == 0)              {                  elapsed = tv.tv_sec * 1000000;                  elapsed += tv.tv_usec;                  elapsed -= mStartTime;                  WarFunctionProfiler::mspProfiler->Record(                    mItemIndex, elapsed);              }#endif          }      }private:#ifdef WIN32    LARGE_INTEGER mStartTime;#else    war_int64_t mStartTime;#endif    WarProfilerItemE mItemIndex;};#endif /* __cplusplus *//****************** END C++ spesific ******************/#endif  /* WAR_FUNCTION_PROFILER_H_ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -