Home | History | Annotate | Download | only in src
      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 #define __PERF_C__
     22 
     23 #include "perf_config.h"
     24 #include "perf.h"
     25 
     26 /* used internal function declarations */
     27 PERF_LOG_Private *
     28 __PERF_LOG_create(PERF_Private *perf, PERF_Config *config,
     29                   PERF_MODULETYPE eModule);
     30 
     31 void
     32 __PERF_LOG_done(PERF_Private *perf);
     33 
     34 /* get custom implementation */
     35 #ifdef __PERF_CUSTOMIZABLE__
     36     #include "perf_custom.c"
     37 #endif
     38 
     39 /*=============================================================================
     40     INSTRUMENTATION INTERFACE
     41 =============================================================================*/
     42 
     43 static
     44 void
     45 __common_Done(PERF_OBJHANDLE *phObject)
     46 {
     47     PERF_OBJHANDLE hObject = *phObject;
     48     PERF_Private *me  = get_Private(hObject);
     49 
     50     /* we may not have allocated the private structure */
     51     if (me)
     52     {
     53 #ifdef __PERF_CUSTOMIZABLE__
     54         __PERF_CUSTOM_done(me);
     55 #else
     56         if (me->uMode & PERF_Mode_Log)
     57         {   /* close log */
     58             __PERF_LOG_done(me);
     59         }
     60 #endif
     61 
     62         /* delete private structure */
     63         free (me);
     64         (*phObject)->pComponentPrivate = NULL;
     65     }
     66 
     67     /* delete PERF opject */
     68     free (*phObject);
     69 
     70     /* invalidate handle */
     71     *phObject = NULL;
     72 }
     73 
     74 PERF_OBJHANDLE
     75 __PERF_common_Create(PERF_Config *config,
     76                      unsigned long ulID,
     77                      PERF_MODULETYPE eModule)
     78 {
     79     PERF_OBJHANDLE hPERF = NULL;
     80     PERF_Private *me = NULL;
     81 
     82     if ((config->mask & eModule & ~PERF_ModuleMask) &&
     83         (config->mask & (1 << (eModule & PERF_ModuleMask))))
     84     {
     85         /* allocate object */
     86         hPERF = (PERF_OBJHANDLE) malloc(sizeof(PERF_OBJTYPE));
     87 
     88         /* set up methods */
     89         if (hPERF != NULL)
     90         {
     91             hPERF->pApplicationPrivate = NULL;
     92             hPERF->Done = __common_Done;
     93             hPERF->pComponentPrivate =
     94                 me = (PERF_Private *) malloc(sizeof(PERF_Private));
     95 
     96             if (me)
     97             {
     98                 /* no flags are selected, and capture creation time */
     99                 me->uMode = PERF_Mode_None;
    100                 me->ulID  = ulID;
    101                 me->pLog  = NULL;
    102                 PID_GET(me->ulPID);
    103 
    104                 /* save original time stamp */
    105                 TIME_GET(me->time);
    106                 TIME_COPY(me->tempTime, me->time);
    107 
    108                 /* create LOG private structures a log file is specified */
    109                 if (config->trace_file)
    110                 {
    111                     __PERF_LOG_create(me, config, eModule);
    112                 }
    113 
    114 #ifdef __PERF_CUSTOMIZABLE__
    115                 __PERF_CUSTOM_create(hPERF, config, eModule);
    116 #endif
    117             }
    118 
    119             /* if we could not create any logging object (no flag is enabled) */
    120             if (!me || me->uMode == PERF_Mode_None)
    121             {   /* free up object */
    122                 __common_Done(&hPERF);
    123             }
    124         }
    125     }
    126 
    127     return(hPERF);
    128 }
    129 
    130 PERF_OBJHANDLE
    131 PERF_Create(unsigned long ulID, PERF_MODULETYPE eModule)
    132 {
    133     PERF_OBJTYPE *hPERF = NULL;  /* PERF object */
    134     char tag[5] = { PERF_FOUR_CHARS(ulID), 0 };
    135     int i;
    136 
    137     /* replace spaces in ID with _ */
    138     for (i=0; i<4; i++) if (tag[i] == ' ') tag[i] = '_';
    139     ulID = PERF_FOURS(tag);
    140 
    141     /* read config file */
    142     PERF_Config config;
    143     PERF_Config_Init(&config);
    144     PERF_Config_Read(&config, tag);
    145 
    146     /* remove replay file if any */
    147     if (config.replay_file)
    148     {
    149         free(config.replay_file);
    150         config.replay_file = NULL;
    151     }
    152 
    153     /* create for capturing */
    154     hPERF = __PERF_common_Create(&config, ulID, eModule);
    155 
    156     PERF_Config_Release(&config);
    157     return(hPERF);
    158 }
    159 
    160