1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker #ifndef ART_LIBARTBASE_BASE_SYSTRACE_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_LIBARTBASE_BASE_SYSTRACE_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include <sstream> 21*795d594fSAndroid Build Coastguard Worker #include <string> 22*795d594fSAndroid Build Coastguard Worker 23*795d594fSAndroid Build Coastguard Worker #include "android-base/stringprintf.h" 24*795d594fSAndroid Build Coastguard Worker #include "macros.h" 25*795d594fSAndroid Build Coastguard Worker #include "palette/palette.h" 26*795d594fSAndroid Build Coastguard Worker 27*795d594fSAndroid Build Coastguard Worker namespace art { 28*795d594fSAndroid Build Coastguard Worker ATraceEnabled()29*795d594fSAndroid Build Coastguard Workerinline bool ATraceEnabled() { 30*795d594fSAndroid Build Coastguard Worker bool enabled = false; 31*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(PaletteTraceEnabled(&enabled) == PALETTE_STATUS_OK && enabled)) { 32*795d594fSAndroid Build Coastguard Worker return true; 33*795d594fSAndroid Build Coastguard Worker } else { 34*795d594fSAndroid Build Coastguard Worker return false; 35*795d594fSAndroid Build Coastguard Worker } 36*795d594fSAndroid Build Coastguard Worker } 37*795d594fSAndroid Build Coastguard Worker ATraceBegin(const char * name)38*795d594fSAndroid Build Coastguard Workerinline void ATraceBegin(const char* name) { 39*795d594fSAndroid Build Coastguard Worker PaletteTraceBegin(name); 40*795d594fSAndroid Build Coastguard Worker } 41*795d594fSAndroid Build Coastguard Worker ATraceEnd()42*795d594fSAndroid Build Coastguard Workerinline void ATraceEnd() { 43*795d594fSAndroid Build Coastguard Worker PaletteTraceEnd(); 44*795d594fSAndroid Build Coastguard Worker } 45*795d594fSAndroid Build Coastguard Worker ATraceIntegerValue(const char * name,int32_t value)46*795d594fSAndroid Build Coastguard Workerinline void ATraceIntegerValue(const char* name, int32_t value) { 47*795d594fSAndroid Build Coastguard Worker PaletteTraceIntegerValue(name, value); 48*795d594fSAndroid Build Coastguard Worker } 49*795d594fSAndroid Build Coastguard Worker 50*795d594fSAndroid Build Coastguard Worker class ScopedTrace { 51*795d594fSAndroid Build Coastguard Worker public: ScopedTrace(const char * name)52*795d594fSAndroid Build Coastguard Worker explicit ScopedTrace(const char* name) { 53*795d594fSAndroid Build Coastguard Worker ATraceBegin(name); 54*795d594fSAndroid Build Coastguard Worker } 55*795d594fSAndroid Build Coastguard Worker template <typename Fn> ScopedTrace(Fn fn)56*795d594fSAndroid Build Coastguard Worker explicit ScopedTrace(Fn fn) { 57*795d594fSAndroid Build Coastguard Worker if (UNLIKELY(ATraceEnabled())) { 58*795d594fSAndroid Build Coastguard Worker ATraceBegin(fn().c_str()); 59*795d594fSAndroid Build Coastguard Worker } 60*795d594fSAndroid Build Coastguard Worker } 61*795d594fSAndroid Build Coastguard Worker ScopedTrace(const std::string & name)62*795d594fSAndroid Build Coastguard Worker explicit ScopedTrace(const std::string& name) : ScopedTrace(name.c_str()) {} 63*795d594fSAndroid Build Coastguard Worker ScopedTrace(ScopedTrace&&) = default; 64*795d594fSAndroid Build Coastguard Worker ~ScopedTrace()65*795d594fSAndroid Build Coastguard Worker ~ScopedTrace() { 66*795d594fSAndroid Build Coastguard Worker ATraceEnd(); 67*795d594fSAndroid Build Coastguard Worker } 68*795d594fSAndroid Build Coastguard Worker }; 69*795d594fSAndroid Build Coastguard Worker 70*795d594fSAndroid Build Coastguard Worker // Helper for the SCOPED_TRACE macro. Do not use directly. 71*795d594fSAndroid Build Coastguard Worker class ScopedTraceNoStart { 72*795d594fSAndroid Build Coastguard Worker public: ScopedTraceNoStart()73*795d594fSAndroid Build Coastguard Worker ScopedTraceNoStart() { 74*795d594fSAndroid Build Coastguard Worker } 75*795d594fSAndroid Build Coastguard Worker ~ScopedTraceNoStart()76*795d594fSAndroid Build Coastguard Worker ~ScopedTraceNoStart() { 77*795d594fSAndroid Build Coastguard Worker ATraceEnd(); 78*795d594fSAndroid Build Coastguard Worker } 79*795d594fSAndroid Build Coastguard Worker 80*795d594fSAndroid Build Coastguard Worker // Message helper for the macro. Do not use directly. 81*795d594fSAndroid Build Coastguard Worker class ScopedTraceMessageHelper { 82*795d594fSAndroid Build Coastguard Worker public: ScopedTraceMessageHelper()83*795d594fSAndroid Build Coastguard Worker ScopedTraceMessageHelper() { 84*795d594fSAndroid Build Coastguard Worker } ~ScopedTraceMessageHelper()85*795d594fSAndroid Build Coastguard Worker ~ScopedTraceMessageHelper() { 86*795d594fSAndroid Build Coastguard Worker ATraceBegin(buffer_.str().c_str()); 87*795d594fSAndroid Build Coastguard Worker } 88*795d594fSAndroid Build Coastguard Worker stream()89*795d594fSAndroid Build Coastguard Worker std::ostream& stream() { 90*795d594fSAndroid Build Coastguard Worker return buffer_; 91*795d594fSAndroid Build Coastguard Worker } 92*795d594fSAndroid Build Coastguard Worker 93*795d594fSAndroid Build Coastguard Worker private: 94*795d594fSAndroid Build Coastguard Worker std::ostringstream buffer_; 95*795d594fSAndroid Build Coastguard Worker }; 96*795d594fSAndroid Build Coastguard Worker }; 97*795d594fSAndroid Build Coastguard Worker 98*795d594fSAndroid Build Coastguard Worker // Avoid the name clash with the one in gtest/gtest.h. 99*795d594fSAndroid Build Coastguard Worker #ifndef SCOPED_TRACE 100*795d594fSAndroid Build Coastguard Worker #define SCOPED_TRACE \ 101*795d594fSAndroid Build Coastguard Worker ::art::ScopedTraceNoStart APPEND_TOKENS_AFTER_EVAL(trace, __LINE__) ; \ 102*795d594fSAndroid Build Coastguard Worker (ATraceEnabled()) && ::art::ScopedTraceNoStart::ScopedTraceMessageHelper().stream() 103*795d594fSAndroid Build Coastguard Worker #endif // SCOPED_TRACE 104*795d594fSAndroid Build Coastguard Worker 105*795d594fSAndroid Build Coastguard Worker } // namespace art 106*795d594fSAndroid Build Coastguard Worker 107*795d594fSAndroid Build Coastguard Worker #endif // ART_LIBARTBASE_BASE_SYSTRACE_H_ 108