Home | History | Annotate | Download | only in inc
      1 
      2 /*
      3  * Copyright (C) Texas Instruments - http://www.ti.com/
      4  *
      5  * This library is free software; you can redistribute it and/or
      6  * modify it under the terms of the GNU Lesser General Public
      7  * License as published by the Free Software Foundation; either
      8  * version 2.1 of the License, or (at your option) any later version.
      9  *
     10  *
     11  * This library is distributed in the hope that it will be useful,
     12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14  * Lesser General Public License for more details.
     15  *
     16  *
     17  * You should have received a copy of the GNU Lesser General Public
     18  * License along with this library; if not, write to the Free Software
     19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
     20  */
     21 /* NOTE: This header should be only included from perf_obj.h */
     22 
     23 /*=============================================================================
     24     CUSTOMIZABLE INTERFACE
     25 
     26     If __PERF_CUSTOMIZABLE__ is defined, each PERF API is routed to a method
     27     that can be customized (set) upon creation of the PERF object.
     28 
     29     Currently we support 3 customizable interfaces that can be each enabled or
     30     disabled independently:
     31         - logging into a buffer (default behavior)
     32         - printing a message on STDOUT, STDERR or a file immediately at each
     33           instrumentation point
     34         - replaying logs from a file (this will repeat all the interface calls
     35           as they happened in the log file, but the time stamps will be set from
     36           the log file.  Currently, we do not allow logging a replayed session.
     37 =============================================================================*/
     38 
     39 typedef struct PERF_Custom_Interface
     40 {
     41     /** Customizable PERF interfaces.  These correspond to the
     42  *  __PERF and PERF macros */
     43     void (*Boundary)(PERF_OBJHANDLE hObject,
     44                      PERF_BOUNDARYTYPE eBoundary);
     45 
     46     void (*Buffer)(PERF_OBJHANDLE hObject,
     47                    unsigned long ulAddress1,
     48                    unsigned long ulAddress2,
     49                    unsigned long ulSize,
     50                    unsigned long ulModuleAndFlags);
     51 
     52     void (*Command)(PERF_OBJHANDLE hObject,
     53                     unsigned long ulCommand,
     54                     unsigned long ulArgument,
     55                     unsigned long ulModuleAndFlags);
     56 
     57     void (*Log)(PERF_OBJHANDLE hObject,
     58                 unsigned long ulData1,
     59                 unsigned long ulData2,
     60                 unsigned long ulData3);
     61 
     62     void (*SyncAV)(PERF_OBJHANDLE hObject,
     63                    float fTimeAudio,
     64                    float fTimeVideo,
     65                    PERF_SYNCOPTYPE eSyncOperation);
     66 
     67     void (*ThreadCreated)(PERF_OBJHANDLE hObject,
     68                           unsigned long ulThreadID,
     69                           unsigned long ulThreadName);
     70 #ifdef __PERF_LOG_LOCATION__
     71     void (*Location)(PERF_OBJHANDLE hObject,
     72                      char const *szFile,
     73                      unsigned long ulLine,
     74                      char const *szFunc);
     75 #endif
     76 } PERF_Custom_Interface;
     77 
     78 /** In the customizable instrumentation, each call will be
     79  *  routed to the corresponding call as defined by the
     80  *  instrumentation module. */
     81 
     82 #define __PERF_CUSTOM_Boundary(                \
     83         hObject,                               \
     84         eBoundary)                             \
     85     PERF_check((hObject),                      \
     86      ((PERF_OBJHANDLE)(hObject))->ci.Boundary( \
     87         (PERF_OBJHANDLE)(hObject),             \
     88         eBoundary) )  /* Macro End */
     89 
     90 #define __PERF_CUSTOM_Buffer(                                 \
     91         hObject,                                              \
     92         ulFlagSending,                                        \
     93         ulFlagMultiple,                                       \
     94         ulFlagFrame,                                          \
     95         ulAddress1,                                           \
     96         ulAddress2,                                           \
     97         ulSize,                                               \
     98         eModule1,                                             \
     99         eModule2)                                             \
    100     PERF_check((hObject),                                     \
    101      ((PERF_OBJHANDLE)(hObject))->ci.Buffer(                  \
    102         (PERF_OBJHANDLE)(hObject),                            \
    103         ((unsigned long) (ulAddress1)),                       \
    104         ((unsigned long) (ulAddress2)),                       \
    105         ((unsigned long) (ulSize)),                           \
    106         ((unsigned long) (eModule1)) |                        \
    107         ( ((unsigned long) (eModule2)) << PERF_ModuleBits ) | \
    108         (ulFlagSending) | (ulFlagMultiple) | (ulFlagFrame)) ) /* Macro End */
    109 
    110 #define __PERF_CUSTOM_Command(                \
    111         hObject,                              \
    112         ulFlagSending,                        \
    113         ulCommand,                            \
    114         ulArgument,                           \
    115         eModule)                              \
    116     PERF_check((hObject),                     \
    117      ((PERF_OBJHANDLE)(hObject))->ci.Command( \
    118         (PERF_OBJHANDLE)(hObject),            \
    119         ((unsigned long) (ulCommand)),        \
    120         ((unsigned long) (ulArgument)),       \
    121         ((unsigned long) (eModule)) | (ulFlagSending)) ) /* Macro End */
    122 
    123 #define __PERF_CUSTOM_Log(                \
    124         hObject,                          \
    125         ulData1,                          \
    126         ulData2,                          \
    127         ulData3)                          \
    128     PERF_check((hObject),                 \
    129      ((PERF_OBJHANDLE)(hObject))->ci.Log( \
    130         (PERF_OBJHANDLE)(hObject),        \
    131         ((unsigned long) (ulData1)),      \
    132         ((unsigned long) (ulData2)),      \
    133         ((unsigned long) (ulData3)) ) ) /* Macro End */
    134 
    135 #define __PERF_CUSTOM_SyncAV(                \
    136         hObject,                             \
    137         fTimeAudio,                          \
    138         fTimeVideo,                          \
    139         eSyncOperation)                      \
    140     PERF_check((hObject),                    \
    141      ((PERF_OBJHANDLE)(hObject))->ci.SyncAV( \
    142         (PERF_OBJHANDLE)(hObject),           \
    143         fTimeAudio,                          \
    144         fTimeVideo,                          \
    145         eSyncOperation) ) /* Macro End */
    146 
    147 #define __PERF_CUSTOM_ThreadCreated(                \
    148         hObject,                                    \
    149         ulThreadID,                                 \
    150         ulThreadName)                               \
    151     PERF_check((hObject),                           \
    152      ((PERF_OBJHANDLE)(hObject))->ci.ThreadCreated( \
    153         (PERF_OBJHANDLE)(hObject),                  \
    154         ((unsigned long) (ulThreadID)),             \
    155         ((unsigned long) (ulThreadName)) ) )   /* Macro End */
    156 
    157 #ifdef __PERF_LOG_LOCATION__
    158 #define __PERF_CUSTOM_Location(                \
    159         hObject,                               \
    160         szFile,                                \
    161         ulLine,                                \
    162         szFunc)                                \
    163     PERF_check((hObject),                      \
    164      ((PERF_OBJHANDLE)(hObject))->ci.Location( \
    165         (PERF_OBJHANDLE)(hObject),             \
    166         (szFile),                              \
    167         ((unsigned long) (ulLine)),            \
    168         (szFunc)) )   /* Macro End */
    169 #endif
    170 
    171 /*=============================================================================
    172     OUTSIDE INTERFACES
    173 =============================================================================*/
    174 
    175 typedef struct PERF_Custom_Private
    176 {
    177     /* debug interface */
    178     struct PERF_PRINT_Private *pDebug;
    179 
    180     /* real-time interface */
    181     struct PERF_RT_Private *pRT;
    182 } PERF_Custom_Private;
    183 
    184 /* PERF Custom instrumentation modes */
    185 enum PERF_CUSTOM_MODE
    186 {
    187     PERF_Mode_Print           =  0x2,
    188     PERF_Mode_Replay          =  0x4,
    189     PERF_Mode_RealTime        =  0x8,
    190 };
    191 
    192