1fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
2fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/*
3fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Copyright (C) Texas Instruments - http://www.ti.com/
4fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *
5fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * This library is free software; you can redistribute it and/or
6fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * modify it under the terms of the GNU Lesser General Public
7fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * License as published by the Free Software Foundation; either
8fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * version 2.1 of the License, or (at your option) any later version.
9fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *
10fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *
11fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * This library is distributed in the hope that it will be useful,
12fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * but WITHOUT ANY WARRANTY; without even the implied warranty of
13fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Lesser General Public License for more details.
15fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *
16fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *
17fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * You should have received a copy of the GNU Lesser General Public
18fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * License along with this library; if not, write to the Free Software
19fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
20fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin */
21fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* This should be only included from perf.h and perf_config.c */
22fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
23fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include <stdio.h>
24fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include <stdlib.h>
25fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include <string.h>
26fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
27fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* This file contains the implementation of the PERF instrumentation object,
28fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   including the customizable interfaces */
29fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
30fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/******************************************************************************
31fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    GENERIC TYPES
32fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin******************************************************************************/
33fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#ifdef _WIN32
34fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #undef INLINE_SUPPORTED
35fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define INLINE
36fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define INLINEORSTATIC static
37fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
38fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #include <time.h>
39fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
40fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* time and process ID routines */
41fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
42fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define TIME_STRUCT                    unsigned long
43fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define TIME_GET(target)               time(&target)
44fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define TIME_COPY(target, source)      target = source
45fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define TIME_MICROSECONDS(time)        0
46fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define TIME_SECONDS(time)             (time)
47fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define TIME_INCREASE(time, microsecs) time += microsecs / 1000000
48fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define TIME_SET(time, sec, microsec)  time = sec
49fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define PID_GET(target)                target = 0
50fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
51fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#else
52fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #ifdef __STRICT_ANSI__
53fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* for some reason strdup, strcasecmp and strncasecmp does not get
54fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin       defined on ANSI builds */
55fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    extern char *strdup(char const *);
56fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    extern int strcasecmp(const char *, const char *);
57fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    extern int strncasecmp(const char *, const char *, size_t);
58fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #endif
59fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
60fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #undef INLINE_SUPPORTED
61fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define INLINE
62fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define INLINEORSTATIC static
63fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
64fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #include <sys/time.h>
65fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #include <sys/types.h>
66fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #include <unistd.h>
67fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
68fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* time and process ID routines */
69fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
70fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define TIME_STRUCT                    struct timeval
71fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define TIME_GET(target)               gettimeofday(&target, NULL)
72fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define TIME_COPY(target, source) \
73fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    ((target).tv_sec = (source).tv_sec), ((target).tv_usec = (source).tv_usec)
74fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define TIME_MICROSECONDS(time)        (time).tv_usec
75fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define TIME_SECONDS(time)             (time).tv_sec
76fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define TIME_INCREASE(time, microsecs) \
77fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    ((time).tv_sec += ((microsecs) / 1000000) +                             \
78fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                       ((time).tv_usec + (microsecs) % 1000000) / 1000000), \
79fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    ((time).tv_usec = ((time).tv_usec + (microsecs) % 1000000) % 1000000)
80fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define TIME_SET(time, sec, microsec) \
81fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    ((time).tv_sec = (sec)), ((time).tv_usec = (microsec))
82fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define PID_GET(target)                target = getpid()
83fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
84fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#endif
85fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
86fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define TIME_DELTA(time, base)                             \
87fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    ((TIME_SECONDS(time) - TIME_SECONDS(base)) * 1000000 + \
88fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin     (TIME_MICROSECONDS(time) - TIME_MICROSECONDS(base)))
89fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
90