 
/*********************************************************************
*                                                                    *
*       PRF module                                                   *
*                                                                    *
**********************************************************************
*                                                                    *
*  This module is a profiler                                         *
*                                                                    *
*  Define USE_PROFILER to use it                                     *
*                                                                    *
*  Author : Alexis Vaise                                             *
*                                                                    *
*********************************************************************/
 
#ifndef _PRF_H__
#define _PRF_H__
 
/* ===========================================================================================*/
#include "acp_base.h"
#include "tmr.h"    /* to have access to the target-dependant internal counter*/
#include "assert.h"
 
/* ===========================================================================================*/
 
#if defined(__cplusplus)
    extern "C"
    {
#endif
 
/* ===========================================================================================*/
 
#if defined(USE_PROFILER) && !defined(PRESS_DEMO)
 
/* ===========================================================================================*/
 
#if defined(U64)
	#define __fastcall
 
#endif /* U64 */
 
/* ======================================== Constants ========================================*/
 
#define PRF_C_lMaxNbFunction					50
#define PRF_C_lMaxNbVariable					30
#define PRF_C_lMaxNbIndependantVariable			50
#define PRF_C_lMaxNbFloatIndependantVariable	10
 
/* independant variables use... see end of file */
 
 
 
#define PRF_C_lNbTramesForAverage	20
 
 
 
 
/* ======================================== Structures ========================================*/
 
 
/* used for statistics on a global raster or variable*/
typedef struct PRF_stMinMaxTotalStructure
{
    unsigned long ulThisFrameValue;
    unsigned long ulMinValue;
    unsigned long ulMaxValue;
    unsigned long ulTotalValueForAverage;
	unsigned long a_ulValuesHistory[PRF_C_lNbTramesForAverage];
	unsigned long ulAverageValue;
} PRF_tdstMinMaxTotalStructure;
 
/* used to remember what happened during the frame, for function or variable*/
typedef struct PRF_stHistory
{
	unsigned long	ulValue;
	void		   *p_vUserData;
} PRF_tdstHistory;
 
 
/* used when computing chronos or variables, to group what happened during the frame, for each user data*/
typedef struct PRF_stUserDataSummary
{
	void			*p_vUserData;
	unsigned long	ulValueForThisFrame;
	unsigned char	ucStartStopCounter;
} PRF_tdstUserDataSummary;
 
 
/* a raster complete definition*/
typedef struct PRF_stFunctionInformation
{
    char *szFunctionName;
 
    unsigned long ulHistorySize;        /* size of historic array*/
    unsigned long ulUserDataSize;       /* max number of UserData*/
 
    PRF_tdstHistory         *p_stFrameHistory;      /* history for one frame*/
    PRF_tdstUserDataSummary *p_stUserDataSummary;   /* result for each user data*/
 
    unsigned long ulNbFrame;
	unsigned long ulHistoryIndex;	/* number of pertinent data in history array*/
 
	int iNbUserData;	/* number of pertinent data in each-user-result array (and also number of different user data)*/
 
    PRF_tdstMinMaxTotalStructure stFunctionDuration;	/* time statistics for the raster*/
    PRF_tdstMinMaxTotalStructure stNbTimeCalled;		/* number of time called statistics for the raster*/
 
    int iRunning;            /* number of start less number of stop*/
} PRF_tdstFunctionInformation;
 
 
 
typedef struct PRF_stVariableInformation
{
    char			*szVariableName;
 
    unsigned long ulHistorySize;        /* size of historic array*/
    unsigned long ulUserDataSize;       /* max number of UserData*/
 
    PRF_tdstHistory         *p_stFrameHistory;      /* history for one frame*/
    PRF_tdstUserDataSummary *p_stUserDataSummary;   /* result for each user data*/
 
	unsigned long	ulNbFrame;
	unsigned long	ulHistoryIndex;	/* number of pertinent data in history array*/
 
	int	iNbUserData;	/* number of pertinent data in each-user-result array (and also number of different user data)*/
 
    PRF_tdstMinMaxTotalStructure stVariableValue;	/* variable statistics*/
} PRF_tdstVariableInformation;
 
/* ======================================== Variables ========================================*/
 
extern PRF_tdstFunctionInformation PRF_g_a_stFunctionInformation [PRF_C_lMaxNbFunction];
extern PRF_tdstVariableInformation PRF_g_a_stVariableInformation [PRF_C_lMaxNbVariable];
extern BOOL						   PRF_g_bModuleInitialized;
 
/* ======================================== Inline functions ========================================*/
 
/*-----------------------------------------------------------------------------*/
/* PRF_fn_vStartChrono*/
/* Start a chrono*/
/*-----------------------------------------------------------------------------*/
#ifdef DREAMCAST
#pragma inline(PRF_fn_vStartChrono)
#endif 
 
INLINE
void __fastcall PRF_fn_vStartChrono (unsigned long _ulFunctionNumber, void *p_vUserData)
{
	PRF_tdstFunctionInformation *p = &PRF_g_a_stFunctionInformation[_ulFunctionNumber];
 
    if (p->ulHistoryIndex<p->ulHistorySize)
    {
		register PRF_tdstHistory *h = &p->p_stFrameHistory[p->ulHistoryIndex++];
 
        h->p_vUserData  = p_vUserData;
        h->ulValue		= (TMR_fn_ulFastGetInternalCounter() & 0xfffffffe);
        p->iRunning++;
    }
	else
	{
		/* too short history*/
		p->ulHistoryIndex = p->ulHistorySize + 2;
	}
}
 
/*-----------------------------------------------------------------------------*/
/* PRF_fn_vStopChrono*/
/* Stop a chrono*/
/*-----------------------------------------------------------------------------*/
#ifdef DREAMCAST
#pragma inline(PRF_fn_vStopChrono)
#endif 
 
INLINE 
void __fastcall PRF_fn_vStopChrono (unsigned long _ulFunctionNumber, void *p_vUserData)
{
	unsigned long ulTimerValue = TMR_fn_ulFastGetInternalCounter();
 
	PRF_tdstFunctionInformation *p = &PRF_g_a_stFunctionInformation[_ulFunctionNumber];
 
 
    if (p->ulHistoryIndex<p->ulHistorySize)
    {
		register PRF_tdstHistory *h = &p->p_stFrameHistory[p->ulHistoryIndex++];
 
        h->p_vUserData	= p_vUserData;
        h->ulValue		= (ulTimerValue | 0x00000001);
        p->iRunning--;
    }
	else
	{
		/* too short history*/
		p->ulHistoryIndex = p->ulHistorySize + 2;
	}
}
 
/*-----------------------------------------------------------------------------*/
/* PRF_fn_vIncreaseVariable*/
/* increase the value of a variable*/
/*-----------------------------------------------------------------------------*/
#ifdef DREAMCAST
#pragma inline(PRF_fn_vIncreaseVariable)
#endif 
 
INLINE
void __fastcall PRF_fn_vIncreaseVariable (unsigned long _ulVariableNumber, void *_p_vUserData, unsigned long _ulDelta)
{
	PRF_tdstVariableInformation *p = &PRF_g_a_stVariableInformation[_ulVariableNumber];
 
	if (p->ulHistoryIndex<p->ulHistorySize)
	{
		register PRF_tdstHistory *h;
 
		if (p->ulHistoryIndex > 0)
		{
			h = &p->p_stFrameHistory[p->ulHistoryIndex-1];
			if (h->p_vUserData == _p_vUserData)
			{
				h->ulValue += _ulDelta;
				return;
			}
			h++;
		}
		else
			h = p->p_stFrameHistory;		/* p->ulHistoryIndex = 0*/
		
		p->ulHistoryIndex++;
 
		/* new user data...*/
		h->ulValue		= _ulDelta;
		h->p_vUserData	= _p_vUserData;
	}
	else
	{
		/* too short history*/
		p->ulHistoryIndex = p->ulHistorySize + 2;
	}
}
 
/* ======================================== Profiler control ========================================*/
 
 
/* init module*/
void PRF_fn_vInitProfileModule ();
/* DesInit module*/
void PRF_fn_vDesInitProfileModule ();
/* create a new function raster*/
void PRF_fn_vInitChrono        (unsigned long _ulFunctionNumber , char * _szFunctionName,
                                unsigned long _ulHistorySize, unsigned long _ulMaxNumberOfUserData);
/* create a new variable raster*/
void PRF_fn_vInitVariable      (unsigned long _ulVariableNumber , char * _szVariableName,
                                unsigned long _ulHistorySize, unsigned long _ulMaxNumberOfUserData);
 
/* ReInit a function raster*/
void PRF_fn_vReInitChrono       (PRF_tdstFunctionInformation *_pFunction);
/* ReInit a variable raster*/
void PRF_fn_vReInitVariable     (PRF_tdstVariableInformation *_pVariable);
 
void PRF_fn_vReinitAllChrono   (void);    /* Must be called when reinitializing the map*/
 
void PRF_fn_vComputeChrono     (unsigned long _ulFunctionNumber);
void PRF_fn_vComputeVariable   (unsigned long _ulVariableNumber);
void PRF_fn_vComputeAllChrono  (void);    /* Must be called each trame before writing the result*/
 
void PRF_fn_vResetChrono       (unsigned long _ulFunctionNumber);
void PRF_fn_vResetVariable     (unsigned long _ulVariableNumber);
void PRF_fn_vResetAllChrono    (void);    /* Must be called each trame after writing the result*/
 
unsigned long PRF_fn_ulTimerCount2Duration(unsigned long ulDuration);
 
/* ======================================== Functions result ========================================*/
 
 
/* get function raster name*/
char *PRF_fn_p_cGetFunctionName(unsigned long _ulFunctionNumber);
 
/* get function result with user data*/
unsigned long PRF_fn_ulGetFunctionDurationWithData(unsigned long _ulFunctionNumber, void *p_vUserData);
 
/* get function global result*/
unsigned long PRF_fn_ulGetFunctionDuration(unsigned long _ulFunctionNumber);
unsigned long PRF_fn_ulGetFunctionAverageDuration(unsigned long _ulFunctionNumber);
unsigned long PRF_fn_ulGetFunctionMaxDuration(unsigned long _ulFunctionNumber);
unsigned long PRF_fn_ulGetFunctionMinDuration(unsigned long _ulFunctionNumber);
int           PRF_fn_iGetFunctionNbStartAndStop (unsigned long _ulFunctionNumber);
unsigned long PRF_fn_ulGetFunctionStartOrStop (unsigned long _ulFunctionNumber , unsigned long _ulStartStopNumber ,
                                               void * * _p_p_vData , BOOL * _p_bThisIsAStart);
 
/* get number of diferent user data*/
int PRF_fn_iGetNumberOfUserDataForFunction(unsigned long _ulFunctionNumber);
 
/* get function result with index*/
unsigned long PRF_fn_ulGetFunctionDurationWithIndex(unsigned long _ulFunctionNumber, void **_p_p_vUserData, int _iIndex);
 
/* get the current number of start less number of stop*/
int PRF_fn_iGetFunctionNumberOfStart(unsigned long _ulFunctionNumber, void **_p_p_vUserData);
 
/* ======================================== Variables result========================================*/
 
/* get variable raster name*/
char *PRF_fn_p_cGetVariableName(unsigned long _ulVariableNumber);
 
/* get GetVariable result with user data*/
unsigned long PRF_fn_ulGetVariableValueWithData(unsigned long _ulVariableNumber, void *p_vUserData);
 
/* get GetVariable global result*/
unsigned long PRF_fn_ulGetVariableValue(unsigned long _ulVariableNumber);
unsigned long PRF_fn_ulGetVariableAverageValue(unsigned long _ulVariableNumber);
unsigned long PRF_fn_ulGetVariableMaxValue(unsigned long _ulVariableNumber);
unsigned long PRF_fn_ulGetVariableMinValue(unsigned long _ulVariableNumber);
 
/* get number of diferent user data*/
int PRF_fn_iGetNumberOfUserDataForVariable(unsigned long _ulVariableNumber);
 
/* get Variable result with index*/
unsigned long PRF_fn_ulGetVariableValueWithIndex(unsigned long _ulFunctionNumber, void **_p_p_vUserData, int _iIndex);
 
/* ======================================== independant long Variable result========================================*/
 
void PRF_fn_vSetIndependantVariableName(unsigned long i, char *_szName);
long PRF_fn_lGetIndependantVariable(unsigned long i);
void PRF_fn_vSetIndependantVariable(unsigned long i, long lValue);
long PRF_fn_lIncIndependantVariable(unsigned long i, long lValue);
char *PRF_fn_szGetIndependantVariableName(unsigned long i);
 
/* ======================================== independant float Variable result========================================*/
 
void  PRF_fn_vSetFloatIndependantVariableName(unsigned long i, char *_szName);
float PRF_fn_fGetFloatIndependantVariable(unsigned long i);
void  PRF_fn_vSetFloatIndependantVariable(unsigned long i, float fValue);
float PRF_fn_fIncFloatIndependantVariable(unsigned long i, float fValue);
char *PRF_fn_szGetFloatIndependantVariableName(unsigned long i);
 
/* ========================================  Misc ============================================*/
 
unsigned long PRF_fn_ulGetCPUFrequency(void);
void PRF_fn_vUpdateMonitorFrequency( unsigned long _ulFrequency );
 
/* ======================================== Constants ========================================*/
/* ======================================== Constants ========================================*/
/* ======================================== Constants ========================================*/
 
/* Misc for Idp*/
#define PRF_C_ulDynamic             0   /* for Idp 1*/
#define PRF_C_ulStatic              1   /* for Idp 1*/
#define PRF_C_ulFix					2   /* for Idp 1*/
#define PRF_C_ulShadow				3   /* for Idp 1*/
 
/* Functions*/
 
#define PRF_C_ulFctMainLoop         0
#define PRF_C_ulFctDisplay          1
#define PRF_C_ulFctAI               2
#define PRF_C_ulFctCollisions       3
#define PRF_C_ulFctCollisionsChar   4
#define PRF_C_ulFctDNM              5
#define PRF_C_ulFctAnimPlayer       6
#define PRF_C_ulFctInput            7
#define PRF_C_ulFctEditor           8
#define PRF_C_ulFctSoundInit        9
#define PRF_C_ulFctSound		    9
#define PRF_C_ulFctFlip             10
#define PRF_C_ulFctMainMisc         11
#define PRF_C_ulFctIADNMPLAMisc     12
#define PRF_C_ulFctHIE              13  /* COL+IA+DNM+Player+Misc => ~ 2 + 3 + 4 + 5 + 6 + 11*/
#define PRF_C_ulWaitFor3dFx			14
#define PRF_C_ulFctDisplaySpecific	15
#define PRF_C_ulFctDisplayCommon	16
#define PRF_C_ulFctDisplaySprite	17
 
/* sub function fot Display specific*/
#define PRF_C_ulGLI1                        18
#define PRF_C_ulGLI2                        19
#define PRF_C_ulGLI3                        20
#define PRF_C_ulGLI4                        21
#define PRF_C_ulGLI5                        22
#define PRF_C_ulGLI6                        23
#define PRF_C_ulGLI7                        24
#define PRF_C_ulGLI8                        25
 
/* Data for functions*/
#define M_DATA_FOR_FUNCTIONS(a,b)		((void*)((a+1)*256+(b)))
 
#define PRF_C_pvDisplayRDP					M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,0)
#define PRF_C_pvDisplayRSP					M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,1)
#define PRF_C_pvDisplaySynchroWait	M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,2)
#define PRF_C_pvDisplayGfxBuild			M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,3)
#define PRF_C_pvDisplaySendSector		M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,4)
#define PRF_C_pvDisplaySendObject		M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,5)
#define PRF_C_pvDisplayDisplayFix		M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,6)
#define PRF_C_pvDisplayRaster				M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,7)
#define PRF_C_pvDisplayClearVP			M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,8)
#define PRF_C_pvDisplaySendToList   M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,9)
 
#define PRF_C_pvSoundInit						M_DATA_FOR_FUNCTIONS(PRF_C_ulFctSound,0)
#define PRF_C_pvSoundRSP						M_DATA_FOR_FUNCTIONS(PRF_C_ulFctSound,1)
#define PRF_C_pvSoundPrepareAudio		M_DATA_FOR_FUNCTIONS(PRF_C_ulFctSound,2)
 
#define PRF_C_pvEditorPRFComput			M_DATA_FOR_FUNCTIONS(PRF_C_ulFctDisplay,0)
 
#define PRF_C_pvMisc                ((void*)0)  /* variable 1 : Misc*/
#define PRF_C_pvGetDevice			((void*)1)  /* variable 1 : Wait for 3Dfx*/
#define PRF_C_pvSendToViewPort      ((void*)2)  /* variable 1 : Clipping*/
#define PRF_C_pvSendFix				((void*)3)  /* variable 1 : Projection*/
#define PRF_C_pvSendSector			((void*)4)  /* variable 1 : Lights*/
#define PRF_C_pvSendActor           ((void*)5)  /* variable 1 : Shadow*/
#define PRF_C_pvSendToList          ((void*)6)  /* variable 1 : SendToList*/
#define PRF_C_pvRest                ((void*)9)  /* variable 1 : Vignette*/
#define PRF_C_pvLight				((void*)10)
#define PRF_C_pvStack				((void*)11)
#define PRF_C_pvShadow				((void*)12)
 
/* Variables*/
#define PRF_C_ulVarCurrentSector    1   /* h_SO current sector*/
#define PRF_C_ulVarObjects          2   /* Objects*/
#define PRF_C_ulVarDynObjects       (PRF_C_ulVarObjects + PRF_C_ulDynamic)  /* 2 : number of dynamic objects visible/computed/displayed*/
#define PRF_C_ulVarStaObjects       (PRF_C_ulVarObjects + PRF_C_ulStatic)   /* 3 : number of static objects visible/computed/displayed*/
#define PRF_C_ulVarFixObjects       (PRF_C_ulVarObjects + PRF_C_ulFix)		/* 4 : number of Fix objects visible/computed/displayed*/
#define PRF_C_ulVarShwObjects       (PRF_C_ulVarObjects + PRF_C_ulShadow)	/* 5 : number of Shadow objects visible/computed/displayed*/
#define PRF_C_ulVarFaces            6   /* Faces*/
#define PRF_C_ulVarDynFaces         (PRF_C_ulVarFaces   + PRF_C_ulDynamic)  /* 7 : number of dynamic faces visible/computed/displayed*/
#define PRF_C_ulVarStaFaces         (PRF_C_ulVarFaces   + PRF_C_ulStatic)   /* 8 : number of static faces visible/computed/displayed*/
#define PRF_C_ulVarFixFaces         (PRF_C_ulVarFaces   + PRF_C_ulFix)		/* 9 : number of Fix faces visible/computed/displayed*/
#define PRF_C_ulVarShwFaces         (PRF_C_ulVarFaces   + PRF_C_ulShadow)	/* 10 : number of Shadow faces visible/computed/displayed*/
#define PRF_C_ulVarSectors			11
#define PRF_C_ulVarStaColl          12
#define PRF_C_ulVarDynColl          13
#define PRF_C_ulVarElements			14
#define PRF_C_ulVarDynElements      (PRF_C_ulVarElements + PRF_C_ulDynamic)  /* 15 : number of dynamic objects visible/computed/displayed*/
#define PRF_C_ulVarStaElements      (PRF_C_ulVarElements + PRF_C_ulStatic)   /* 16 : number of static objects visible/computed/displayed*/
#define PRF_C_ulVarFixElements      (PRF_C_ulVarElements + PRF_C_ulFix)		 /* 17 : number of Fix objects visible/computed/displayed*/
#define PRF_C_ulVarShwElements      (PRF_C_ulVarElements + PRF_C_ulShadow)	 /* 17 : number of Shadow objects visible/computed/displayed*/
 
#define PRF_C_ulVarGLI1             19
#define PRF_C_ulVarGLI2             20
#define PRF_C_ulVarGLI3             21
#define PRF_C_ulVarGLI4             22
#define PRF_C_ulVarGLI5             23
#define PRF_C_ulVarGLI6             24
#define PRF_C_ulVarGLI7             25
#define PRF_C_ulVarGLI8             26
 
/* Data for variables*/
#define PRF_C_pvVisible					((void*)2)   /* variables 2/3/4/5*/
#define PRF_C_pvComputed				((void*)4)   /* variables 2/3/4/5*/
#define PRF_C_pvDisplayed				((void*)5)   /* variables 1/2/3/4/5*/
#define PRF_C_pvMainCharCurrentSector	((void*)0)
#define PRF_C_pvCameraCurrentSector		((void*)1)
 
/* Independant Variables*/
#define PRF_C_ulIdpCurrentPage			0
#define PRF_C_ulIdpDynOrSta				1   /* 0 : Dyn , 2 : Sta*/
#define PRF_C_ulIdpAdvancedPage			2
#define PRF_C_ulIdpDisplayedFaces		3   /* flag*/
#define PRF_C_ulIdpDisplayedObjects		4   /* flag*/
#define PRF_C_ulIdpRasterTime			5
#define PRF_C_ulIdpRasterDisplayMode	6
#define PRF_C_ulIdpDisplayedElements	7
#define PRF_C_ulIdpCollComputed			8
#define PRF_C_ulIdpDisplayedTriangle	9
#define PRF_C_ulIdpNbSkippedAnims		10
#define PRF_C_ulIdpNbAllocSPO			11
#define PRF_C_ulIdpNbMaxAllocSPO		12
#define PRF_C_ulIdpNbAllocCHA			13
#define PRF_C_ulIdpNbMaxAllocCHA		14
 
#define PRF_C_ulIdpGfxList				15
#define PRF_C_ulIdpMaxGfxList			16
#define PRF_C_ulIdpAllowedGfxList		17
 
#define PRF_C_ulIdpGfxList2				18
#define PRF_C_ulIdpMaxGfxList2			19
#define PRF_C_ulIdpAllowedGfxList2		20
 
#define PRF_C_ulIdpMtxList				21
#define PRF_C_ulIdpMaxMtxList			22
#define PRF_C_ulIdpAllowedMtxList		23
 
#define PRF_C_ulIdpLightList			24
#define PRF_C_ulIdpMaxLightList			25
#define PRF_C_ulIdpAllowedLightList		26
 
#define PRF_C_ulIdpMaxMainStackSize		27
#define PRF_C_ulIdpAllowedMainStackSize	28
 
#define PRF_C_ulIdpVirtualKey           29
 
#define PRF_C_ulIdpMaxNbCollisions		30
#define PRF_C_ulIdpAllowedNbCollisions	31
 
#define PRF_C_ulIdpAAMode				32
 
#define PRF_C_ulIdpDeltaTime			40
#define PRF_C_ulIdpMonitorFrequency		41
#define PRF_C_ulIdpTextureSize			42
#define PRF_C_ulIdpTextureMemorySize	43
 
#define PRF_C_ulU64Mode					0x0001
#define PRF_C_ulShowCurrent				0x0002
#define PRF_C_ulShowAverage				0x0004
#define PRF_C_ulShowMaximum				0x0008
#define PRF_C_ulFinalMode				0x0010
#define PRF_C_ulVariableMode			0x0020
#define PRF_C_ulShowStatic				0x0040
#define PRF_C_ulShowDynamic				0x0080
#define PRF_C_ulShowAll					(PRF_C_ulShowStatic|PRF_C_ulShowDynamic)
#define PRF_C_ulShowPGMMode				0x0100
#define PRF_C_ulSuperImposed			0x0200
#define PRF_C_ulClearScreen				0x0400
#define PRF_C_ulChangeActor				0x0800
 
/* ================================================================================*/
 
#else /* #ifdef USE_PROFILER */
 
/* ===========================================================================================*/
 
#define PRF_fn_vStartChrono(Chrono,Data)
#define PRF_fn_vStopChrono(Chrono,Data)
 
#define PRF_fn_vIncreaseVariable(Var,Data,Inc)
 
#define PRF_fn_vSetIndependantVariable(Var,Inc)
#define PRF_fn_lGetIndependantVariable(Var)     0
#define PRF_fn_lIncIndependantVariable(Var,Inc)
 
#define PRF_fn_vReinitAllChrono()
#define PRF_fn_vDesInitProfileModule()
#define PRF_fn_vUpdateMonitorFrequency( _ulFrequency )
 
/* ===========================================================================================*/
 
#endif  /* #ifdef USE_PROFILER*/
 
/* ===========================================================================================*/
 
#if defined(__cplusplus)
    }
#endif
 
/* ===========================================================================================*/
 
#endif  /* #ifndef _PRF_H__*/
