12ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis/*
22ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis * Copyright (C) 2012 The Android Open Source Project
32ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis *
42ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis * Licensed under the Apache License, Version 2.0 (the "License");
52ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis * you may not use this file except in compliance with the License.
62ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis * You may obtain a copy of the License at
72ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis *
82ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis *      http://www.apache.org/licenses/LICENSE-2.0
92ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis *
102ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis * Unless required by applicable law or agreed to in writing, software
112ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis * distributed under the License is distributed on an "AS IS" BASIS,
122ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis * See the License for the specific language governing permissions and
142ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis * limitations under the License.
152ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis */
162ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis
172ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis#ifndef ANDROID_TRACE_H
182ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis#define ANDROID_TRACE_H
192ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis
209b828adfad09200f3f1bd3602187fe3dd5335774Elliott Hughes#if defined(__ANDROID__)
21214c701ec6de8bd4b57f6aec8874fb343c79d874Tim Murray
222ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis#include <stdint.h>
2322dbf3947fedf988e714a4703ddf85fc41413f90Mathias Agopian
245b2d36e38adcc09e72f81b06c324bf3c5c92e043Alex Ray#include <cutils/trace.h>
252ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis
265b2d36e38adcc09e72f81b06c324bf3c5c92e043Alex Ray// See <cutils/trace.h> for more ATRACE_* macros.
272ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis
2801937ee2b9ad00ac72162c92d838f2520ab5ae8dJosh Gao// ATRACE_NAME traces from its location until the end of its enclosing scope.
2901937ee2b9ad00ac72162c92d838f2520ab5ae8dJosh Gao#define _PASTE(x, y) x ## y
3001937ee2b9ad00ac72162c92d838f2520ab5ae8dJosh Gao#define PASTE(x, y) _PASTE(x,y)
3101937ee2b9ad00ac72162c92d838f2520ab5ae8dJosh Gao#define ATRACE_NAME(name) android::ScopedTrace PASTE(___tracer, __LINE__) (ATRACE_TAG, name)
3222dbf3947fedf988e714a4703ddf85fc41413f90Mathias Agopian
33fcb349ff75272c802519a20abc0e083c35bbe8cfAlex Ray// ATRACE_CALL is an ATRACE_NAME that uses the current function name.
34fcb349ff75272c802519a20abc0e083c35bbe8cfAlex Ray#define ATRACE_CALL() ATRACE_NAME(__FUNCTION__)
353fc49adfd2887d01e54c4ad6a62eae5383101f62Romain Guy
362ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennisnamespace android {
372ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis
382ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennisclass ScopedTrace {
392ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennispublic:
4022dbf3947fedf988e714a4703ddf85fc41413f90Mathias Agopian    inline ScopedTrace(uint64_t tag, const char* name) : mTag(tag) {
4122dbf3947fedf988e714a4703ddf85fc41413f90Mathias Agopian        atrace_begin(mTag, name);
4222dbf3947fedf988e714a4703ddf85fc41413f90Mathias Agopian    }
4322dbf3947fedf988e714a4703ddf85fc41413f90Mathias Agopian
4422dbf3947fedf988e714a4703ddf85fc41413f90Mathias Agopian    inline ~ScopedTrace() {
4522dbf3947fedf988e714a4703ddf85fc41413f90Mathias Agopian        atrace_end(mTag);
4622dbf3947fedf988e714a4703ddf85fc41413f90Mathias Agopian    }
472ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis
482ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennisprivate:
492ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis    uint64_t mTag;
502ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis};
512ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis
522ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis}; // namespace android
532ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis
549b828adfad09200f3f1bd3602187fe3dd5335774Elliott Hughes#else // !__ANDROID__
55214c701ec6de8bd4b57f6aec8874fb343c79d874Tim Murray
56214c701ec6de8bd4b57f6aec8874fb343c79d874Tim Murray#define ATRACE_NAME(...)
57214c701ec6de8bd4b57f6aec8874fb343c79d874Tim Murray#define ATRACE_CALL()
58214c701ec6de8bd4b57f6aec8874fb343c79d874Tim Murray
599b828adfad09200f3f1bd3602187fe3dd5335774Elliott Hughes#endif // __ANDROID__
60214c701ec6de8bd4b57f6aec8874fb343c79d874Tim Murray
612ccfe1a0606f59b5cefd177f9dd5c837d0ea2d0bJamie Gennis#endif // ANDROID_TRACE_H
62