@ -457,10 +457,11 @@ class InstrStruct
public :
InstrStruct ( )
{
useInstr = false ;
enableMapping = true ;
useInstr = false ;
flags = FLAGS_MAPPING ;
maxDepth = 0 ;
rootNode . m_payload = NodeData ( " ROOT " , NULL , 0 , TYPE_GENERAL , IMPL_PLAIN ) ;
rootNode . m_payload = NodeData ( " ROOT " , NULL , 0 , NULL , false , TYPE_GENERAL , IMPL_PLAIN ) ;
tlsStruct . get ( ) - > pCurrentNode = & rootNode ;
}
@ -468,7 +469,8 @@ public:
Mutex mutexCount ;
bool useInstr ;
bool enableMapping ;
int flags ;
int maxDepth ;
InstrNode rootNode ;
TLSData < InstrTLSStruct > tlsStruct ;
} ;
@ -476,7 +478,7 @@ public:
class CV_EXPORTS IntrumentationRegion
{
public :
IntrumentationRegion ( const char * funName , const char * fileName , int lineNum , TYPE instrType = TYPE_GENERAL , IMPL implType = IMPL_PLAIN ) ;
IntrumentationRegion ( const char * funName , const char * fileName , int lineNum , void * retAddress , bool alwaysExpand , TYPE instrType = TYPE_GENERAL , IMPL implType = IMPL_PLAIN ) ;
~ IntrumentationRegion ( ) ;
private :
@ -484,20 +486,28 @@ private:
uint64 m_regionTicks ;
} ;
InstrStruct & getInstrumentStruct ( ) ;
InstrTLSStruct & getInstrumentTLSStruct ( ) ;
CV_EXPORTS InstrNode * getCurrentNode ( ) ;
CV_EXPORTS InstrStruct & getInstrumentStruct ( ) ;
InstrTLSStruct & getInstrumentTLSStruct ( ) ;
CV_EXPORTS InstrNode * getCurrentNode ( ) ;
}
}
///// General instrumentation
# ifdef _WIN32
# define CV_INSTRUMENT_GET_RETURN_ADDRESS _ReturnAddress()
# else
# define CV_INSTRUMENT_GET_RETURN_ADDRESS __builtin_extract_return_addr(__builtin_return_address(0))
# endif
// Instrument region
# define CV_INSTRUMENT_REGION_META(NAME, TYPE, IMPL) ::cv::instr::IntrumentationRegion __instr_region__(NAME, __FILE__, __LINE__, TYPE, IMPL);
# define CV_INSTRUMENT_REGION_META(NAME, ALWAYS_EXPAND, TYPE, IMPL) ::cv::instr::IntrumentationRegion __instr_region__(NAME, __FILE__, __LINE__, CV_INSTRUMENT_GET_RETURN_ADDRESS, ALWAYS_EXPAND, TYPE, IMPL);
# define CV_INSTRUMENT_REGION_CUSTOM_META(NAME, ALWAYS_EXPAND, TYPE, IMPL)\
void * __curr_address__ = [ & ] ( ) { return CV_INSTRUMENT_GET_RETURN_ADDRESS ; } ( ) ; \
: : cv : : instr : : IntrumentationRegion __instr_region__ ( NAME , __FILE__ , __LINE__ , __curr_address__ , false , : : cv : : instr : : TYPE_GENERAL , : : cv : : instr : : IMPL_PLAIN ) ;
// Instrument functions with non-void return type
# define CV_INSTRUMENT_FUN_RT_META(TYPE, IMPL, ERROR_COND, FUN, ...) ([&]()\
{ \
if ( : : cv : : instr : : useInstrumentation ( ) ) { \
: : cv : : instr : : IntrumentationRegion __instr__ ( # FUN , __FILE__ , __LINE__ , TYPE , IMPL ) ; \
: : cv : : instr : : IntrumentationRegion __instr__ ( # FUN , __FILE__ , __LINE__ , NULL , false , TYPE , IMPL ) ; \
try { \
auto status = ( ( FUN ) ( __VA_ARGS__ ) ) ; \
if ( ERROR_COND ) { \
@ -518,7 +528,7 @@ CV_EXPORTS InstrNode* getCurrentNode();
# define CV_INSTRUMENT_FUN_RV_META(TYPE, IMPL, FUN, ...) ([&]()\
{ \
if ( : : cv : : instr : : useInstrumentation ( ) ) { \
: : cv : : instr : : IntrumentationRegion __instr__ ( # FUN , __FILE__ , __LINE__ , TYPE , IMPL ) ; \
: : cv : : instr : : IntrumentationRegion __instr__ ( # FUN , __FILE__ , __LINE__ , NULL , false , TYPE , IMPL ) ; \
try { \
( FUN ) ( __VA_ARGS__ ) ; \
} catch ( . . . ) { \
@ -531,17 +541,19 @@ CV_EXPORTS InstrNode* getCurrentNode();
} \
} ( ) )
// Instrumentation information marker
# define CV_INSTRUMENT_MARK_META(IMPL, NAME, ...) {::cv::instr::IntrumentationRegion __instr_mark__(NAME, __FILE__, __LINE__, ::cv::instr::TYPE_MARKER, IMPL);}
# define CV_INSTRUMENT_MARK_META(IMPL, NAME, ...) {::cv::instr::IntrumentationRegion __instr_mark__(NAME, __FILE__, __LINE__, NULL, false, ::cv::instr::TYPE_MARKER, IMPL);}
///// General instrumentation
// General OpenCV region instrumentation macro
# define CV_INSTRUMENT_REGION() CV_INSTRUMENT_REGION_META(__FUNCTION__, cv::instr::TYPE_GENERAL, cv::instr::IMPL_PLAIN)
// Parallel OpenCV region instrumentation macro
# define CV_INSTRUMENT_REGION_MT() CV_INSTRUMENT_REGION_MT_META(cv::instr::TYPE_GENERAL, cv::instr::IMPL_PLAIN)
# define CV_INSTRUMENT_REGION() CV_INSTRUMENT_REGION_META(__FUNCTION__, false, ::cv::instr::TYPE_GENERAL, ::cv::instr::IMPL_PLAIN)
// Custom OpenCV region instrumentation macro
# define CV_INSTRUMENT_REGION_NAME(NAME) CV_INSTRUMENT_REGION_CUSTOM_META(NAME, false, ::cv::instr::TYPE_GENERAL, ::cv::instr::IMPL_PLAIN)
// Instrumentation for parallel_for_ or other regions which forks and gathers threads
# define CV_INSTRUMENT_REGION_MT_FORK() CV_INSTRUMENT_REGION_META(__FUNCTION__, true, ::cv::instr::TYPE_GENERAL, ::cv::instr::IMPL_PLAIN);
///// IPP instrumentation
// Wrapper region instrumentation macro
# define CV_INSTRUMENT_REGION_IPP() CV_INSTRUMENT_REGION_META(__FUNCTION__, ::cv::instr::TYPE_WRAPPER, ::cv::instr::IMPL_IPP)
# define CV_INSTRUMENT_REGION_IPP() CV_INSTRUMENT_REGION_META(__FUNCTION__, false, ::cv::instr::TYPE_WRAPPER, ::cv::instr::IMPL_IPP)
// Function instrumentation macro
# define CV_INSTRUMENT_FUN_IPP(FUN, ...) CV_INSTRUMENT_FUN_RT_META(::cv::instr::TYPE_FUN, ::cv::instr::IMPL_IPP, status < 0, FUN, __VA_ARGS__)
// Diagnostic markers
@ -549,26 +561,28 @@ CV_EXPORTS InstrNode* getCurrentNode();
///// OpenCL instrumentation
// Wrapper region instrumentation macro
# define CV_INSTRUMENT_REGION_OPENCL() CV_INSTRUMENT_REGION_META(__FUNCTION__, ::cv::instr::TYPE_WRAPPER, ::cv::instr::IMPL_OPENCL)
# define CV_INSTRUMENT_REGION_OPENCL_(NAME) CV_INSTRUMENT_REGION_META(NAME, ::cv::instr::TYPE_WRAPPER, ::cv::instr::IMPL_OPENCL)
// Function instrumentation macro
# define CV_INSTRUMENT_FUN_OPENCL_KERNEL(FUN, ...) CV_INSTRUMENT_FUN_RT_META(::cv::instr::TYPE_FUN, ::cv::instr::IMPL_OPENCL, status == 0, FUN, __VA_ARGS__)
# define CV_INSTRUMENT_REGION_OPENCL() CV_INSTRUMENT_REGION_META(__FUNCTION__, false, ::cv::instr::TYPE_WRAPPER, ::cv::instr::IMPL_OPENCL)
// OpenCL kernel compilation wrapper
# define CV_INSTRUMENT_REGION_OPENCL_COMPILE(NAME) CV_INSTRUMENT_REGION_META(NAME, false, ::cv::instr::TYPE_WRAPPER, ::cv::instr::IMPL_OPENCL)
// OpenCL kernel run wrapper
# define CV_INSTRUMENT_REGION_OPENCL_RUN(NAME) CV_INSTRUMENT_REGION_META(NAME, false, ::cv::instr::TYPE_FUN, ::cv::instr::IMPL_OPENCL)
// Diagnostic markers
# define CV_INSTRUMENT_MARK_OPENCL(NAME) CV_INSTRUMENT_MARK_META(::cv::instr::IMPL_OPENCL, NAME)
# else
# define CV_INSTRUMENT_REGION_META(...)
# define CV_INSTRUMENT_REGION()
# define CV_INSTRUMENT_REGION_MT()
# define CV_INSTRUMENT_REGION_NAME(...)
# define CV_INSTRUMENT_REGION_MT_FORK()
# define CV_INSTRUMENT_REGION_IPP()
# define CV_INSTRUMENT_FUN_IPP(FUN, ...) ((FUN)(__VA_ARGS__))
# define CV_INSTRUMENT_MARK_IPP(NAME )
# define CV_INSTRUMENT_MARK_IPP(... )
# define CV_INSTRUMENT_REGION_OPENCL()
# define CV_INSTRUMENT_REGION_OPENCL_(...)
# define CV_INSTRUMENT_FUN_OPENCL_KERNEL(FUN, ...) ((FUN)(__VA_ARGS__) )
# define CV_INSTRUMENT_MARK_OPENCL(NAME )
# define CV_INSTRUMENT_REGION_OPENCL_COMPILE (...)
# define CV_INSTRUMENT_REGION_OPENCL_RUN(... )
# define CV_INSTRUMENT_MARK_OPENCL(... )
# endif
//! @endcond