/*
 * 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