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 */
27PERF_LOG_Private *
28__PERF_LOG_create(PERF_Private *perf, PERF_Config *config,
29                  PERF_MODULETYPE eModule);
30
31void
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
43static
44void
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
74PERF_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
130PERF_OBJHANDLE
131PERF_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