1e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu/* 2cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Copyright (c) 2014 Intel Corporation 3cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 4cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Licensed under the Apache License, Version 2.0 (the "License"); 5cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// you may not use this file except in compliance with the License. 6cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// You may obtain a copy of the License at 7cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 8cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// http://www.apache.org/licenses/LICENSE-2.0 9cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// 10cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Unless required by applicable law or agreed to in writing, software 11cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// distributed under the License is distributed on an "AS IS" BASIS, 12cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// See the License for the specific language governing permissions and 14cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// limitations under the License. 15cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika*/ 16e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#ifndef HWC_TRACE_H 17e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#define HWC_TRACE_H 18e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 19e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#define LOG_TAG "hwcomposer" 20e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu//#define LOG_NDEBUG 0 21e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#include <cutils/log.h> 22e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 23e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 24e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#ifdef _cplusplus 25e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiuextern "C" { 26e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#endif 27e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 28e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu// Helper to automatically preappend classname::functionname to the log message 294157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev#define VLOGTRACE(fmt,...) ALOGV("%s: "fmt, __func__, ##__VA_ARGS__) 304157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev#define DLOGTRACE(fmt,...) ALOGD("%s: "fmt, __func__, ##__VA_ARGS__) 314157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev#define ILOGTRACE(fmt,...) ALOGI("%s: "fmt, __func__, ##__VA_ARGS__) 324157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev#define WLOGTRACE(fmt,...) ALOGW("%s: "fmt, __func__, ##__VA_ARGS__) 334157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev#define ELOGTRACE(fmt,...) ALOGE("%s: "fmt, __func__, ##__VA_ARGS__) 34e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 35e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 36e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu// Function call tracing 37e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#if 0 38ef39e7bb38762bfeed9a8fe53db85ab52cd0952aThierry Strudel#define CTRACE() ALOGV("Calling %s", __func__) 394157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev#define XLOGTRACE() ALOGV("Leaving %s", __func__) 40e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#else 41e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#define CTRACE() ((void)0) 424157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev#define XLOGTRACE() ((void)0) 43e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#endif 44e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 45e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 46e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu// Arguments tracing 47e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#if 0 484157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev#define ALOGTRACE(fmt,...) ALOGV("%s(args): "fmt, __func__, ##__VA_ARGS__); 49e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#else 504157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev#define ALOGTRACE(fmt,...) ((void)0) 51e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#endif 52e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 53e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 54e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 55e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu// Helper to abort the execution if object is not initialized. 56e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu// This should never happen if the rules below are followed during design: 57e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu// 1) Create an object. 58e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu// 2) Initialize the object immediately. 59e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu// 3) If failed, delete the object. 60e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu// These helpers should be disabled and stripped out of release build 61e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 62e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#define RETURN_X_IF_NOT_INIT(X) \ 63e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiudo { \ 64e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu CTRACE(); \ 65e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu if (false == mInitialized) { \ 66e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu LOG_ALWAYS_FATAL("%s: Object is not initialized! Line = %d", __func__, __LINE__); \ 67e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu return X; \ 68e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu } \ 69e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu} while (0) 70e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 71e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#if 1 72e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#define RETURN_FALSE_IF_NOT_INIT() RETURN_X_IF_NOT_INIT(false) 73e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#define RETURN_VOID_IF_NOT_INIT() RETURN_X_IF_NOT_INIT() 74e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#define RETURN_NULL_IF_NOT_INIT() RETURN_X_IF_NOT_INIT(0) 75e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#else 76e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#define RETURN_FALSE_IF_NOT_INIT() ((void)0) 77e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#define RETURN_VOID_IF_NOT_INIT() ((void)0) 78e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#define RETURN_NULL_IF_NOT_INIT() ((void)0) 79e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#endif 80e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 81e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 82e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu// Helper to log error message, call de-initializer and return false. 83e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#define DEINIT_AND_RETURN_FALSE(...) \ 84e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiudo { \ 854157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev ELOGTRACE(__VA_ARGS__); \ 86e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu deinitialize(); \ 87e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu return false; \ 88e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu} while (0) 89e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 90e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 91e2ad4c047651d4442f6a0e002290016d45e9201afu jin#define DEINIT_AND_DELETE_OBJ(X) \ 92e2ad4c047651d4442f6a0e002290016d45e9201afu jin if (X) {\ 93e2ad4c047651d4442f6a0e002290016d45e9201afu jin X->deinitialize();\ 94e2ad4c047651d4442f6a0e002290016d45e9201afu jin delete X; \ 95e2ad4c047651d4442f6a0e002290016d45e9201afu jin X = NULL; \ 96e2ad4c047651d4442f6a0e002290016d45e9201afu jin } 97e2ad4c047651d4442f6a0e002290016d45e9201afu jin 98e2ad4c047651d4442f6a0e002290016d45e9201afu jin 99e2ad4c047651d4442f6a0e002290016d45e9201afu jin#define WARN_IF_NOT_DEINIT() \ 100e2ad4c047651d4442f6a0e002290016d45e9201afu jin CTRACE(); \ 101e2ad4c047651d4442f6a0e002290016d45e9201afu jin if (mInitialized) {\ 102e2ad4c047651d4442f6a0e002290016d45e9201afu jin LOG_ALWAYS_FATAL("%s: Object is not deinitialized! Line = %d", __func__, __LINE__); \ 103e2ad4c047651d4442f6a0e002290016d45e9201afu jin } 104e2ad4c047651d4442f6a0e002290016d45e9201afu jin 105e2ad4c047651d4442f6a0e002290016d45e9201afu jin 106e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu// _cplusplus 107e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#ifdef _cplusplus 108e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu} 109e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#endif 110e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 111e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu 112e2b2a5fe291662041d1bbec00996c2ba302dc4c9Andy Qiu#endif /* HWC_TRACE_H */ 113