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