summaryrefslogtreecommitdiffstats
path: root/include/utils/TimerProbe.h
blob: f2e32b21a5dd9192630ff69ac539ca7c61972424 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef ANDROID_TIMER_PROBE_H
#define ANDROID_TIMER_PROBE_H

#if 0 && defined(HAVE_POSIX_CLOCKS)
#define ENABLE_TIMER_PROBE 1
#else
#define ENABLE_TIMER_PROBE 0
#endif

#if ENABLE_TIMER_PROBE

#include <time.h>
#include <sys/time.h>
#include <utils/Vector.h>

#define TIMER_PROBE(tag) \
    static int _timer_slot_; \
    android::TimerProbe probe(tag, &_timer_slot_)
#define TIMER_PROBE_END() probe.end()
#else
#define TIMER_PROBE(tag)
#define TIMER_PROBE_END()
#endif

#if ENABLE_TIMER_PROBE
namespace android {

class TimerProbe {
public:
    TimerProbe(const char tag[], int* slot);
    void end();
    ~TimerProbe();
private:
    struct Bucket {
        int mStart, mReal, mProcess, mThread, mCount;
        const char* mTag;
        int* mSlotPtr;
        int mIndent;
    };
    static Vector<Bucket> gBuckets;
    static TimerProbe* gExecuteChain;
    static int gIndent;
    static timespec gRealBase;
    TimerProbe* mNext;
    static uint32_t ElapsedTime(const timespec& start, const timespec& end);
    void print(const timespec& r, const timespec& p, const timespec& t) const;
    timespec mRealStart, mPStart, mTStart;
    const char* mTag;
    int mIndent;
    int mBucket;
};

}; // namespace android

#endif
#endif